log_analyzer.cs en C#
Regex, LINQ y un poco de matemática convierten un log crudo en respuestas.
// log_analyzer: parsea solicitudes, agrupa por estado, halla la cola lenta
using System.Text.RegularExpressions;
var log = """
GET /api/users 200 45ms
POST /api/login 401 12ms
GET /api/users 200 38ms
GET /static/app.js 200 5ms
POST /api/orders 500 220ms
GET /api/users 304 9ms
""";
var pattern = new Regex(@"(\w+) (\S+) (\d{3}) (\d+)ms");
var requests = log.Split('\n')
.Select(line => pattern.Match(line))
.Where(m => m.Success)
.Select(m => (Path: m.Groups[2].Value,
Code: int.Parse(m.Groups[3].Value),
Ms: int.Parse(m.Groups[4].Value)))
.ToList();
foreach (var group in requests.GroupBy(r => r.Code / 100))
{
Console.WriteLine($"{group.Key}xx: {group.Count()}");
}
var sorted = requests.Select(r => r.Ms).OrderBy(ms => ms).ToList();
var median = sorted[sorted.Count / 2];
Console.WriteLine($"median {median}ms, slowest {sorted[^1]}ms");
var errors = requests.Where(r => r.Code >= 500).Select(r => r.Path);
Console.WriteLine($"5xx on: {string.Join(",", errors)}");
Cómo funciona
- Un solo patrón parsea verbo, ruta, estado y duración por línea.
GroupBy(r => r.Code / 100)agrupa en cubetas 2xx/4xx/5xx.- Ordenar las duraciones entrega la mediana y la petición más lenta.
Palabras clave y builtins usados aquí
foreachgroupinintnewstaticusingvar
El intento, en números
- Líneas
- 32
- Caracteres a escribir
- 972
- Tokens
- 260
- Ritmo de tres estrellas
- 85 tpm
Al ritmo de tres estrellas de 85 tokens por minuto, este intento toma unos 184 segundos.
Paso 1 de 2 en Bis; paso 16 de 17 en La biblioteca de .NET.