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
.