typestar

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

  1. Un solo patrón parsea verbo, ruta, estado y duración por línea.
  2. GroupBy(r => r.Code / 100) agrupa en cubetas 2xx/4xx/5xx.
  3. Ordenar las duraciones entrega la mediana y la petición más lenta.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 2 en Bis; paso 16 de 17 en La biblioteca de .NET.

← Anterior Siguiente →