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

Entraînez-vous par vous-même : Playground Swift