Mostrando postagens com marcador Logs. Mostrar todas as postagens
Mostrando postagens com marcador Logs. Mostrar todas as postagens

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

Armazenando Logs do Nginx separados Host

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 (host) 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 Nginx

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

Obs. Não existe o conceito de vhost no nginx, cada entrada é tratada como um site, mas eles vão apontar para o mesmo servidor de destino e no apache eles serão vhosts.

Edite o arquivo principal no nginx, e acrescente a opção desejada.
# vi /etc/nginx/nginx.conf
http {
#    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
#                      '$status $body_bytes_sent "$http_referer" '
#                      '"$http_user_agent" "$http_x_forwarded_for"';

     log_format  main  '$remote_addr $host $remote_user [$time_local] "$request" '
                       '$status $body_bytes_sent "$http_referer" '
                       '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

Em cada um dos hosts vamos apontar os logs para os mesmos arquivos
# vi /etc/nginx/conf.d/default.conf
## Start www.site01.andredeo.blogspot.com ##
server {
    listen       IP_NGINX:80;
    server_name  www.site01.andredeo.blogspot.com;

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    ## send request back to Backend ##
    location / {
     proxy_pass  http://backend.andredeo.blogspot.com;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.site01.andredeo.blogspot.com ##

## Start www.site02.andredeo.blogspot.com ##
server {
    listen       IP_NGINX:80;
    server_name  www.site02.andredeo.blogspot.com;

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    ## send request back to Backend ##
    location / {
     proxy_pass  http://backend.andredeo.blogspot.com;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.site02.andredeo.blogspot.com ##

## Start www.site03.andredeo.blogspot.com ##
server {
    listen       IP_NGINX:80;
    server_name  www.site03.andredeo.blogspot.com;

    access_log  /var/log/nginx/access.log  main;
    error_log  /var/log/nginx/error.log;

    ## send request back to Backend ##
    location / {
     proxy_pass  http://backend.andredeo.blogspot.com;
     proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
     proxy_redirect off;
     proxy_buffering off;
     proxy_set_header        Host            $host;
     proxy_set_header        X-Real-IP       $remote_addr;
     proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
   }
}
## End www.site03.andredeo.blogspot.com ##

Reiniciar o nginx
# service nginx restart


Exemplo de log gerado

187.11.126.243 www.site01.andredeo.blogspot.com - [02/May/2016:11:45:37 -0300] "GET /posts/2016/05/servidor-syslog-ng-gerenciamento.html HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-"
191.34.134.142 www.site02.andredeo.blogspot.com - [02/May/2016:11:45:37 -0300] "GET /posts/ HTTP/1.1" 301 178 "-" "Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.112 Safari/537.36" "-"

66.249.64.152 www.site01.andredeo.blogspot.com - [02/May/2016:11:02:43 -0300] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" "-"

143.106.113.15 www.site01.andredeo.blogspot.com - [02/May/2016:11:08:32 -0300] "GET / HTTP/1.1" 301 178 "-" "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)" "-"

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

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 nginx para o servidor de Syslog-ng.
# vi /etc/syslog-ng/syslog-ng.conf
source s_nginx {
file("/var/log/nginx/access.log");
file("/var/log/nginx/error.log");
};
destination d_servidor_log { udp("IP_SYSLOG-NG_CENTRAL" port(514)); };
log { source(s_nginx); destination(d_servidor_log); };

Reiniciar o serviço
# systemctl restart syslog-ng


Referencias

ITSA Consulting, LLC

Servidor Syslog-ng - Gerenciamento Centralizado de Logs

Instalação do servidor

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

Vamos parar o serviço de log tradicional (rsyslog)
# systemctl stop rsyslog
# systemctl disable rsyslog

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

E gerar um novo arquivo com os parâmetros desejados. Em destaque os parâmetros que foram alterados.
# vi /etc/syslog-ng/syslog-ng.conf
@version:3.5
@include "scl.conf"

# syslog-ng configuration file.
#
# This should behave pretty much like the original syslog on RedHat. But
# it could be configured a lot smarter.
#
# See syslog-ng(8) and syslog-ng.conf(5) for more information.
#
# Note: it also sources additional configuration files (*.conf)
#       located in /etc/syslog-ng/conf.d/

# Define Global Options
options {
    flush_lines (0);
    time_reopen (10);
    log_fifo_size (10000);
    chain_hostnames (off);
    use_dns (no);
    use_fqdn (no);
    create_dirs (no);
    keep_hostname (yes);
};

# Define input source
source s_sys {
    system();
    internal();
};

source s_net {
udp(ip(0.0.0.0) port(514));
tcp(ip(0.0.0.0) port(514));
};

# Define Destination for Local Logs
destination d_cons { file("/dev/console"); };
destination d_mesg { file("/var/log/messages"); };
destination d_auth { file("/var/log/secure"); };
destination d_mail { file("/var/log/maillog" flush_lines(10)); };
destination d_spol { file("/var/log/spooler"); };
destination d_boot { file("/var/log/boot.log"); };
destination d_cron { file("/var/log/cron"); };
destination d_kern { file("/var/log/kern"); };
destination d_mlal { usertty("*"); };

# Define Destination for Remote Log
destination netlogpile { file(
"/var/log/servers/$FULLHOST/$YEAR/$MONTH/$DAY/$FULLHOST-$YEAR-$MONTH-$DAY.log"
owner(root) group(root) perm (0600)
create_dirs ( yes ) dir_perm( 0700 ));
};

filter f_kernel     { facility(kern); };
filter f_default    { level(info..emerg) and
                        not (facility(mail)
                        or facility(authpriv)
                        or facility(cron)); };
filter f_auth       { facility(authpriv); };
filter f_mail       { facility(mail); };
filter f_emergency  { level(emerg); };
filter f_news       { facility(uucp) or
                        (facility(news)
                        and level(crit..emerg)); };
filter f_boot   { facility(local7); };
filter f_cron   { facility(cron); };

# Define local logging destination

#log { source(s_sys); filter(f_kernel); destination(d_cons); };
log { source(s_sys); filter(f_kernel); destination(d_kern); };
log { source(s_sys); filter(f_default); destination(d_mesg); };
log { source(s_sys); filter(f_auth); destination(d_auth); };
log { source(s_sys); filter(f_mail); destination(d_mail); };
log { source(s_sys); filter(f_emergency); destination(d_mlal); };
log { source(s_sys); filter(f_news); destination(d_spol); };
log { source(s_sys); filter(f_boot); destination(d_boot); };
log { source(s_sys); filter(f_cron); destination(d_cron); };

# Define network logging destination
log { source(s_net); destination(netlogpile); };

# Source additional configuration files (.conf extension only)
@include "/etc/syslog-ng/conf.d/*.conf"

# vim:ft=syslog-ng:ai:si:ts=4:sw=4:et:

Basicamente o que fizemos foi aumentar o número de logs que ele gerencia na fila de entrada e criar uma estrutura para nossos logs:
“/var/log/servers/$FULLHOST/$YEAR/$MONTH/$DAY/$FULLHOST-$YEAR-$MONTH-$DAY.log”

Que vai se traduzir em:
“/var/log/servers/nome_do_servidor_de_origem_dos_logs/ano/mês/dia/ nome_do_servidor_de_origem_dos_logs-ano-mês-dia.log”

Reiniciar o serviço
# systemctl restart syslog-ng

Rotate dos Logs

Vamos manter o registro dos logs dos últimos 120 dias , faremos isso com o crontab e o comando find, conforme orientação da própria documentação oficial.

# contrab -e
# Todos os dias as 01:00 gera o gzip dos logs do dia anterior
0       1       *       *       *       /usr/bin/find /var/log/servers/ -daystart -mtime +0 ! -name "*.gz" -type f ! -path "*`/bin/date +%Y/%m/%d`*" -exec /usr/bin/gzip {} \;

# Todos os dias as 02:00 remove os logs do Syslog-ng com mais de 120 dias
0       2       *       *       *       /usr/bin/find /var/log/servers/ -daystart -mtime +120 -type f -exec rm {} \;

Referencias

ZF SHARE IS CARE Board
Peter@BalaBit
The syslog-ng Open Source Edition
Michael King