in Otros

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.

Write a Comment

Comment

*