Menu
Coddy logo textTech

Agrégateur de logs

Fait partie de la section Logique et Flux du Journey Swift de Coddy — leçon 55 sur 56.

challenge icon

Défi

Moyen

Vous traitez des journaux d'accès (logs). Lisez une seule ligne d'entrée : une liste d'entrées level:user:bytes séparées par des virgules.

Certaines entrées sont incorrectes et doivent être ignorées : toute entrée dont les bytes ne peuvent pas être analysés comme un entier, ou dont le level n'est pas l'un des suivants : INFO, WARN, ERROR (sensible à la casse).

Affichez, dans cet ordre :

  1. Une ligne par niveau (level) apparu au moins une fois, triée selon cet ordre fixe : ERROR, WARN, INFO. Chaque ligne est au format <level>: <count> (<bytes>)count est le nombre d'entrées valides à ce niveau et bytes est la somme de leurs octets.
  2. Top user: <name> (<bytes>) : l'utilisateur ayant le plus grand nombre total d'octets sur toutes les entrées valides. En cas d'égalité, tranchez par ordre alphabétique du nom.
  3. Skipped: <n> avec le nombre d'entrées malformées.

Pour l'entrée INFO:alice:100,WARN:bob:bad,ERROR:alice:50,INFO:bob:200,DEBUG:cara:10,INFO:alice:75, la sortie est :

ERROR: 1 (50)
INFO: 3 (375)
Top user: alice (225)
Skipped: 2

Essayez vous-même

let entries = readLine()!.components(separatedBy: ",")
let order = ["ERROR", "WARN", "INFO"]
let validLevels: Set<String> = ["INFO", "WARN", "ERROR"]

// TODO: analyser chaque entrée, ignorer les mauvaises, accumuler par niveau + par utilisateur ;
// afficher les niveaux dans l'ordre fixe (uniquement si vus), l'utilisateur principal, puis le compte Skipped

Toutes les leçons de Logique et Flux