typestar

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

  1. Una regex extrae ruta, estado y bytes por línea.
  2. Unos Map cuentan estados y frecuencias de rutas.
  3. Las rutas top y el total de bytes se imprimen como reporte.

Palabras clave y builtins usados aquí

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.

Escribe este fragmento

Paso 1 de 1 en Bis; paso 16 de 16 en Funciones y patrones.

← Anterior