← Volver al blog
🐧 Linux y Sysadmin7 min de lectura·

Contar errores en un log: por qué grep -c te engaña (y cómo hacerlo bien)

Es una de las tareas más comunes para cualquiera que administre un servidor: ¿cuántos errores tiene este log? Parece trivial, pero es justo donde tropiezan muchos —incluso perfiles con experiencia—. El comando que casi todos usan devuelve un número que no son los errores. En este artículo verás por qué grep -c y wc -l engañan, y cómo contar (y clasificar) errores de verdad, como un administrador de sistemas.

El reflejo que falla

Te dan un log de producción (de esos que pesan decenas de megabytes) y la pregunta de siempre: ¿cuántos errores hay? El reflejo casi universal es este:

grep -c "error" app.log

Y reportar el número que sale. El problema es que ese número no son los errores. Es algo distinto, y confundirlo lleva a reportes absurdos del tipo "el servidor tuvo 150 mil errores anoche" cuando en realidad fueron unos pocos miles.

Mismo log, tres formas de contar, tres números MUY distintoswc -l154.422líneas del archivo✗ NO son erroresgrep -c "error"18.300líneas con "error"✗ engañosoeventos nivel E3.512errores REALES✓ el número correctoLa diferencia entre un reporte absurdo y uno profesional está en SABER qué estás contando.
El mismo log, tres formas de contarlo, tres números que no tienen nada que ver entre sí.

Trampa 1: un error NO es una línea

En un log real, un solo error ocupa muchas líneas. Cuando algo falla en Java, se imprime la traza de pila o stack trace: la línea del error y, debajo, decenas de líneas que empiezan con at ... mostrando por dónde pasó el fallo. Todo ese bloque es un error, no cuarenta.

UN error en Java = MUCHAS líneas en el log[21:25:10] E CWSRV0014E: Uncaught exception at com.ibm.ws.webcontainer...ServletWrapper.java:1235 at com.ibm.ws.jsp...AbstractJSP.java:220 at com.ibm.ws.webcontainer...WebApp.java:1134 at java.lang.Thread.run(Thread.java:822)[21:25:13] E EJPEJ0004E: Otro error distinto← error 1 (empieza con [ y E)← stack trace: MISMO error← error 2Aquí hay 2 errores pero 6 líneas. Contar líneas multiplica el número por 3.
Dos errores, seis líneas. Si cuentas líneas, el número se infla.

Por eso, si cuentas líneas con wc -l, obtienes el tamaño del archivo, no la cantidad de errores. Y la diferencia no es pequeña: puede ser de 50 veces.

Trampa 2: grep -c no cuenta lo que crees

Aquí está el error más sutil. Mucha gente cree que grep -c "error" cuenta cuántas veces aparece la palabra "error". No. grep -c cuenta cuántas líneas contienen el patrón al menos una vez. Si una línea menciona "error" tres veces, suma 1, no 3.

⚠️ El doble engaño de grep -c error

Uno: cuenta líneas, no ocurrencias. Dos: muchas líneas de un stack trace mencionan la palabra "error" sin ser el inicio de un error nuevo, y muchos errores reales no contienen esa palabra exacta. El número no sirve para un reporte serio.

Cómo se cuenta BIEN

La clave es entender la estructura del log antes de procesarlo. En muchos servidores (como WebSphere), cada evento real empieza con una marca de tiempo entre corchetes y tiene una letra de nivel: E para error. Las líneas de stack trace NO empiezan con corchete. Así que los errores reales son las líneas que son el inicio de un evento de nivel E:

# Errores REALES (no líneas, no la palabra "error")
grep "^\[" app.log | grep -c " E "

Y para ir un paso más allá —lo que de verdad hace un administrador— no te quedas en "hay 3.512 errores", sino que los clasificas por tipo para saber por dónde empezar a arreglar:

# Ranking de los tipos de error más frecuentes
grep "^\[" app.log | grep " E " \
  | grep -oE "[A-Z]+[0-9]+E" | sort | uniq -c | sort -rn | head

Ese patrón —grep | sort | uniq -c | sort -rn— es el que un sysadmin usa todos los días. No es un comando mágico que se memoriza: es entender que cada herramienta hace una cosa y se conectan con tuberías.

Por qué esto importa (y no es un detalle)

La diferencia entre reportar 154.422 y 3.512 no es de sintaxis: es de criterio. Quien reporta mal el número toma malas decisiones y no sabe dónde está el problema real. Saber usar grep no es saber teclear grep: es entender qué estás contando y por qué.

Aprende a hacerlo con un log real

Leer sobre esto no basta: hay que practicarlo. En el curso Linux: De Cero a Sysadmin de Kimün Academy lo haces en una terminal real desde el navegador, con un log de producción de verdad (anonimizado), y construyes tú mismo el script que cuenta los errores bien. El primer módulo es gratis.

Si puedes explicarle a alguien por qué el número correcto es 3.512 y no 154.422, estás en el camino de ser un buen administrador de sistemas. Si todavía no, eso es exactamente lo que te enseñamos.

Lleva esto a la práctica

Cursos relacionados