Cuando el tamaño de un log es un problema… cómo fragmentar un fichero en otros más pequeños

By | June 30, 2015

En más de una ocasión nos encontraremos con logs del tamaño de varios GB, inmanejables, de los que tendremos que extraer y buscar información. Vamos a ver en este artículo cómo dividir un log de gran tamaño o número de líneas para hacerlo más funcional.

División de un fichero por tamaño

Creamos un fichero de prueba

Utilizaremos el comando dd para crear un fichero de 6 MB que nos sirva como ejemplo. Si tenéis a mano un log de considerable tamaño, podéis hacer uso de él para este caso.

dd if=/dev/zero of=ficherocompleto bs=1024 count=0 seek=$[1024*6]

Dividimos el fichero por bytes

Vamos a dividir en 3 ficheros de 2 MB cada uno con el comando split (“split a file into pieces”, tal y como lo describen en su ficha man):

split -b 2m ficherocompleto ficheroparcial

Comprobamos con ls -lrht que efectivamente hemos “troceado” nuestro fichero inicial en 3 parciales de 2 MB cada uno:

-rw-rw-r-- 1 jota jota 2,0M jul 26 12:50 ficheroparcialac
-rw-rw-r-- 1 jota jota 2,0M jul 26 12:50 ficheroparcialab
-rw-rw-r-- 1 jota jota 2,0M jul 26 12:50 ficheroparcialaa

División de un fichero por número de líneas

Recomendable para analizar logs de gran cantidad de líneas. Veamos las líneas de un fichero de log de Jboss con wc -l server.log, obteniendo:

  218524 server.log

218524 líneas en total. Vamos a fragmentarlo en ficheros de 100000 líneas cada uno. Si no especificamos el nombre del fichero parcial de destino, entonces el comando split crea por defecto los ficheros empezando por xaa y siguiendo el abecedario (xab, xac, etc …):

split -l 100000 server.log

Comprobamos con wc -l xa*:

  100000 xaa
  100000 xab
   18524 xac
  218524 total

Si en vez de lo anterior quisiéramos dividir ese fichero inicial justo a la mitad de líneas, haríamos lo siguiente:

split -l `wc -l server.log | awk '{print $1 / 2}'` server.log

Comprobamos wc -l xa*:

  109262 xaa
  109262 xab
  218524 total

Como véis no es nada difícil. De todas formas en el caso de los logs es buena idea tener buenas políticas de rotado (recomendable diariamente) para evitar que crezcan desmesuradamente. Por desgracia en servidores con gran carga de trabajo, independientemente de los rotados, nos encontramos muchas veces con logs bastante grandes… nada que no podamos superar echando mano de split.