tail-log.js en JavaScript
Resumir un log de acceso desde un archivo o stdin.
#!/usr/bin/env node
// Resume un log de acceso leído desde un archivo o stdin.
import { readFileSync } from "node:fs";
const LINE = /"(?:GET|POST) (\S+)[^"]*" (\d{3}) (\d+)/;
function summarize(text) {
const statuses = new Map();
const paths = new Map();
let bytes = 0;
for (const line of text.split("\n")) {
const match = line.match(LINE);
if (!match) continue;
const [, path, status, size] = match;
statuses.set(status, (statuses.get(status) ?? 0) + 1);
paths.set(path, (paths.get(path) ?? 0) + 1);
bytes += Number(size);
}
return { statuses, paths, bytes };
}
const source = process.argv[2];
const text = readFileSync(source ?? 0, "utf8");
const { statuses, paths, bytes } = summarize(text);
console.log("status codes:", Object.fromEntries(statuses));
console.log("top paths:");
const top = [...paths].sort((a, b) => b[1] - a[1]).slice(0, 3);
for (const [path, hits] of top) {
console.log(` ${String(hits).padStart(4)} ${path}`);
}
console.log(`${bytes.toLocaleString()} bytes served`);
Cómo funciona
- Una regex extrae ruta, estado y bytes por línea.
- Unos Map cuentan estados y frecuencias de rutas.
- Las rutas top y el total de bytes se imprimen como reporte.
Palabras clave y builtins usados aquí
MapNumberObjectStringconstcontinueforfromfunctionifimportletofreturn
El intento, en números
- Líneas
- 32
- Caracteres a escribir
- 995
- Tokens
- 283
- Ritmo de tres estrellas
- 110 tpm
Al ritmo de tres estrellas de 110 tokens por minuto, este intento toma unos 154 segundos.
Paso 1 de 1 en Bis; paso 16 de 16 en Funciones y patrones.