Centralizando logs de varios servers en uno solo.

Imaginen el siguiente escenario, tenes N servidores de frontend y cada uno genera sus logs (access, error, php, slow) y los almacena localmente en /var/log/nginx. El día que sucede un incidente y tenemos que buscar lo que pasa puede pasarnos que solo uno de los nodos sea el que nos trae el problema pero deberíamos ir uno por uno para identificarlo.

Para mitigar esto lo ideal es agregar los logs de todos los servidores en uno solo. De esta manera podemos ver los logs de todos los servidores en uno y de ahi determinar por donde viene el problema.

Analice varias alternativas para realizar esta tarea, las que mas me llamaron la atención fueron greylog2 y logstash, pero ambas tenían arquitecturas complejas y están orientadas a un tratamiento mucho mas avanzado de los logs. Vale la pena verlas, pero por ahora yo me las salte. Una herramienta mas que me la recomendaron mucho y no la alcance a ver por que es paga es splunk, pero me la recomendaron mucho.

Fuí a los básico, rsyslog, este es el sistema que viene por defecto como syslog en varios Linuxes, yo ya lo tenía instalado así que decidí meterme con este. Tenía que ver como hacer para poner un servidor que este en espera de logs y los nodos de frontend para que envíen sus logs.

Screen Shot 2013-11-27 at 9.27.41 AM

Server

Bien, lo primero es configurar el rsyslog para que escuche. Hay que ir /etc/rsyslog.conf y habilitar los modulos para escucha TCP.

#################
#### MODULES ####
#################

$ModLoad imuxsock # provides support for local system logging
$ModLoad imklog # provides kernel logging support

# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Probablemente les aparezcan comentados, descomentenlos.

El segundo paso es crear un archivo .conf en /etc/rsyslog.d/, todos los archivos .conf serán incluidos en la configuración de rsyslog. Llamemos al archivo servers.conf, y este debería tener definido que hacer con cada uno de los flujos de datos que reciba.

*.*;auth,authpriv.none,local0.none -/var/log/syslog
local0.* -/var/log/servers/nginx.access.log

*.*;auth,authpriv.none,local1.none -/var/log/syslog
local1.* -/var/log/servers/nginx.error.log

*.*;auth,authpriv.none,local12.none -/var/log/syslog
local2.* -/var/log/servers/php-error.log

*.*;auth,authpriv.none,local3.none -/var/log/syslog
local3.* -/var/log/servers/www-slow.log

Rsyslog maneja cada flujo con un identificador local[0-7], asi que aquí tomamos los primeros 4.

Los logs agregados quedarán obviamente en /var/log/servers. Al reiniciar rsyslog debería esta todo listo para recibir peticiones.

Cliente

El cliente, este es mas sencillo. Nuevamente van a tener que crear un archivo en /etc/rsyslog.d/, en cada nodo, con la configuración para enviar logs al server. Llamemos al archivo client.conf. Este archivo debe tener lo siguiente.

$ModLoad imfile

$InputFileName /var/log/nginx/[nombre_de_tu_access_log]
$InputFileTag access:
$InputFileFacility local0
$InputFileSeverity info
$InputRunFileMonitor

$InputFileName /var/log/nginx/[nombre_de_tu_error_log]
$InputFileTag nginx_error:
$InputFileFacility local1
$InputFileSeverity info
$InputRunFileMonitor

$InputFileName /var/log/php-fpm/[nombre_de_tu_php_error]
$InputFileTag php_error:
$InputFileFacility local2
$InputFileSeverity info
$InputRunFileMonitor

$InputFileName /var/log/php-fpm/www-slow.log
$InputFileTag php_slow:
$InputFileFacility local3
$InputFileSeverity info
$InputRunFileMonitor

$InputFilePollInterval 1
local0.* @(z7)[IP_DEL_SERVER]:514
local1.* @(z7)[IP_DEL_SERVER]::514
local2.* @(z7)[IP_DEL_SERVER]::514
local3.* @(z7)[IP_DEL_SERVER]::514

Ojo, Reemplacen los datos según corresponda !.

Al reiniciar el server si hace un tail -f a alguno de los archivos de logs del server deberían ver como se cargan los logs en el server y en el cliente. Controlen bien que todos los nodos estan logeando actividad en el server de logeo.

Cerrando

Problemas que pueden tener seguramente esten relacionados a direcciones de red (maquinas que no se ven) o a problemas de firewall. Ojo con esas dos cuestiones.

Obviamente esta conf es para Nginx y PHP-FPM, pero creo que es bastante lógico como configurar el server y el cliente para forwardear cualquier archivo de log.

Gracias a los muchachos de la lista de Dev Ops por los tips, ellos sugirieron estas tools.

Share

Grupo Dev/Ops, Sumate !

Antes que nada, saludos a todos, hace rato no venía por aquí.

Les cuento que acabamos de crear un nuevo grupo con Marcos al que llamamos Dev/Ops

https://groups.google.com/group/dev_ops?hl=en

La idea de formar este grupo surgió hablando con Marcos, hace rato que vemos una falta de comunicación técnica 100% entre nuestro grupo de colegas, la mayoría de los grupos que usualmente visitamos manejan conversaciones mas del tipo filosófico/político/utópico, cosa que no condenamos, pero a nosotros nos gusta la parte técnica :).

Recordando algunos años atrás grupos como Gulfrre, Gulco, SapucayX y otros concebidos para los técnicos y lamentablemente venidos en desgracia, decidimos encarar el duro trabajo de intentar crear un nuevo espacio para Desarrolladores y Sysadmin (operaciones como se los llama ahora), donde podamos intercambiar experiencias y consultas desde un punto de vista técnico y no humanista/filosófico/personal, evitando irnos por las ramas con temas no relevantes.

Otro punto importante del grupo, si bien esta pensado para que en un principio ayude a la comunicación entre los colegas mas allegados (osea de la zona), no esta limitado geográficamente, esperamos que en un futuro inviten a gente de otros lugares así podemos tener un intercambio de experiencias mas rico.

Dejamos el grupo moderado para evitar que se filtren temas no relevantes, igualmente si las opiniones son representativas al eje del grupo serán publicadas sin importar que se creen flamewars o que alguien salga lastimado.

Eso es todo, espero lo mejor para el grupo y sobre todo deseo que sea de su interés.

Abrazo, Nos Leemos

Share