Volver al código Ruby

Resumir un log de accesos: códigos de estado y pedidos lentos

Quince líneas que leen un log sin cargarlo entero en memoria y dicen cuántos errores hubo y cuáles fueron los pedidos más lentos.

El problema

El sitio anduvo lento anoche y hay un log de doscientos megas. Antes de montar una herramienta, hace falta una respuesta rápida: cuántos errores y qué rutas tardaron.

Ruby
conteo = Hash.new(0)
lentas = []

File.foreach(ARGV[0] || "access.log") do |linea|
  # formato: 2026-03-01T10:30:00 GET /pedidos 200 0.182
  _fecha, metodo, ruta, estado, segundos = linea.split
  next unless estado
  conteo[estado] += 1
  lentas << [segundos.to_f, metodo, ruta] if segundos.to_f > 1.0
end

conteo.sort.each { |estado, n| puts "#{estado}: #{n}" }
puts "\nLas 5 más lentas:"
lentas.max(5).each { |s, m, r| puts format("  %.2fs  %s %s", s, m, r) }

Por qué está escrito así

  1. File.foreach lee línea por línea: el archivo nunca está entero en memoria, pese doscientos megas o veinte gigas.
  2. Hash.new(0) arranca cada contador en cero, así que conteo[estado] += 1 funciona sin preguntar si la clave existe.
  3. La asignación múltiple reparte las columnas de la línea en variables con nombre.
  4. max(5) sobre arreglos compara por el primer elemento: los segundos.
Cómo probarlo

Guardalo como resumen.rb y corré: ruby resumen.rb access.log. Si tu log tiene otro formato, ajustá el orden de las variables.

Ojo con esto

split por espacios se rompe si la ruta o el agente de usuario traen espacios. Para logs de Apache o Nginx reales conviene una expresión regular con el formato exacto.

Adaptalo a tu caso con IA

El botón copia este prompt con el código pegado debajo. Reemplazá los corchetes con lo tuyo y pegalo en ChatGPT, Claude, Gemini o Copilot.

El prompt
Tengo este script de Ruby que resume un log de accesos. Mi log tiene este formato real: [TRES LÍNEAS DE EJEMPLO]. Adaptalo con una expresión regular para ese formato y agregá: pedidos por hora, las diez rutas con más errores 5xx y el percentil 95 del tiempo de respuesta. Que siga leyendo línea por línea sin cargar el archivo en memoria.

Ejemplo escrito y revisado a mano.

Compartir

Comentarios

Todavía no hay comentarios. El primero puede ser el tuyo.

Solo texto, sin enlaces. No se pide correo. Los comentarios se revisan antes de publicarse.

¿Lo adaptaste a algo tuyo?

Contame qué resolviste con esto, o qué le faltó.

Seguí probando

Más código

Ver todos
Darinel Ortega En línea · respondo durante el día
Hoy
Hola. Acá no vendo nada: esto es para intercambiar conocimiento sobre tecnología.
Escribime lo que quieras — podés mandar texto, imágenes o documentos. Los mensajes llegan a mi consola y te respondo desde ahí.
Estás escribiendo fuera de horario. Te leo apenas empiece el día.

Conversación abierta para compartir conocimiento. Los mensajes llegan a mi consola y respondo desde ahí.

Agendemos una conversación

Elegí el día y la hora que te sirvan. Son treinta minutos, sin agenda comercial.

Videollamada

Para una videollamada, pedila por acá y te paso el enlace de la sesión.