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.
The problem
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.
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) }
Why it is written this way
- File.foreach lee línea por línea: el archivo nunca está entero en memoria, pese doscientos megas o veinte gigas.
- Hash.new(0) arranca cada contador en cero, así que conteo[estado] += 1 funciona sin preguntar si la clave existe.
- La asignación múltiple reparte las columnas de la línea en variables con nombre.
- max(5) sobre arreglos compara por el primer elemento: los segundos.
Guardalo como resumen.rb y corré: ruby resumen.rb access.log. Si tu log tiene otro formato, ajustá el orden de las variables.
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.
Adapt it to your case with AI
The button copies this prompt with the code pasted below it. Replace the brackets with your own details and paste it into ChatGPT, Claude, Gemini or Copilot.
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.
Example written and reviewed by hand.
Comments
No comments yet. Yours can be the first.
Did you adapt it to something of yours?
Tell me what you solved with it, or what it was missing.