quarta-feira, 4 de maio de 2016

Armazenando Logs do Apache separados Vhost

Introdução

No artigo anterior demonstrei como instalar um servidor de logs centralizado com syslog-ng, mas em ambientes onde temos muitos sites hospedados fica complicado configurar o envio de cada um deles para o servidor de logs, e, claro tem sempre o fator humano, podemos criar uma nova entrada para o site (vhost) e esquecer de criar a entrada para envio do log.

A solução para isso é apontar todos os sites de um mesmo servidor, para o mesmo arquivo de log, mas depois, como diferenciar no arquivo de log, qual entrada pertence a qual site? O objetivo desse post é resolver esse problema.

Configuração dos Logs do Apache

Precisamos alterar o padrão de logs do apache para que além das informações padrões, ele acrescente o nome do vhost no log, para isso temos a opção “%v”.

Edite o arquivo principal no apache, e acrescente a opção desejada.
# vi /etc/httpd/conf/httpd.conf
    #LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

Em cada um dos Vhosts vamos apontar os logs para o mesmo arquivo e na opção de CustomLog vamos usar combined ao invés de common.
# vi /etc/httpd/conf/httpd.conf
<VirtualHost *:80>
   ServerAdmin webmaster@andredeo.blogspot.com
   DocumentRoot /var/www/html/www.site01.andredeo.blogspot.com
   ServerName www.site01.andredeo.blogspot.com
   ErrorLog /var/log/httpd/error_log
   LogLevel debug
   CustomLog /var/log/httpd/access_log combined
</VirtualHost>

<VirtualHost *:80>
   ServerAdmin webmaster@andredeo.blogspot.com
   DocumentRoot /var/www/html/www.site02.andredeo.blogspot.com
   ServerName www.site02.andredeo.blogspot.com
   ErrorLog /var/log/httpd/error_log
   LogLevel debug
   CustomLog /var/log/httpd/access_log combined
</VirtualHost>

<VirtualHost *:80>
   ServerAdmin webmaster@andredeo.blogspot.com
   DocumentRoot /var/www/html/www.site03.andredeo.blogspot.com
   ServerName www.site03.andredeo.blogspot.com
   ErrorLog /var/log/httpd/error_log
   LogLevel debug
   CustomLog /var/log/httpd/access_log combined
</VirtualHost>

Reiniciar o apache
# systemctl restart httpd

Exemplo de log gerado

# cat /var/log/httpd/access_log
www.site01.andredeo.blogspot.com 10.0.2.2 - - [26/Apr/2016:09:16:05 -0300] "GET / HTTP/1.0" 200 326 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
www.site02.andredeo.blogspot.com 10.0.2.2 - - [26/Apr/2016:09:17:05 -0300] "GET / HTTP/1.0" 200 326 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
www.site03.andredeo.blogspot.com 10.0.2.2 - - [26/Apr/2016:09:17:29 -0300] "GET / HTTP/1.0" 200 326 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"
www.site01.andredeo.blogspot.com 10.0.2.2 - - [26/Apr/2016:11:17:39 -0300] "GET / HTTP/1.0" 200 326 "-" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:45.0) Gecko/20100101 Firefox/45.0"

Instalação do Syslog-ng no servidor do Apache

Vamos realizar a instalação do syslog-ng no servidor, para que ele colete os logs e encaminhe para o nosso servidor central de logs.

A instalação é bastante simples e não demanda nenhum pré-requisito
# yum -y install syslog-ng

Iniciar e configurar para inicio automático o Syslog-ng
# systemctl start syslog-ng
# systemctl enable syslog-ng

Manteremos uma cópia do arquivo original, até por questões de consulta de parâmetros.
# cd /etc/syslog-ng
# cp syslog-ng.conf syslog-ng.conf.orig

Não é preciso alterar nada no arquivo original, apenas adicione ao final do arquivo a opção de encaminhamento dos logs do apache para o servidor de Syslog-ng.
# vi /etc/syslog-ng/syslog-ng.conf
source s_apache {
file("/var/log/httpd/access_log");
file("/var/log/httpd/error_log");
};
destination d_servidor_log { udp("143.106.113.6" port(514)); };
log { source(s_apache); destination(d_servidor_log); };

Reiniciar o serviço
# systemctl restart syslog-ng

Referencias

Nenhum comentário: