Registro de acesso "Catch-All" com hosts virtuais Apache?

16

Eu tenho muitos hosts virtuais configurados em um servidor web, cada um com seu próprio log de erros e acesso. As linhas relevantes de httpd.confsão algo como isto:

ErrorLog /var/log/httpd-error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access.log combined

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName myhost.com
    ServerAlias www.myhost.com
    DocumentRoot /var/www/myhost.com/htdocs
    ErrorLog /var/www/myhost.com/log/error.log
    CustomLog /var/www/myhost.com/log/access.log combined
</VirtualHost>

# ... many more VirtualHosts

Atualmente, estou recebendo alguns erros aleatórios em /var/log/httpd-error.log, mas não estou recebendo nada em /var/log/httpd-access.log. É possível ter TODOS os acessos e erros duplicados em um arquivo de log compartilhado? É possível fazer isso sem adicionar novas entradas a cada VirtualHost?

pix0r
fonte

Respostas:

17

Consulte http://httpd.apache.org/docs/2.2/logs.html#virtualhost

Se as diretivas CustomLog ou ErrorLog forem colocadas dentro de uma seção, todas as solicitações ou erros desse host virtual serão registrados apenas no arquivo especificado. Qualquer host virtual que não tenha diretivas de log ainda terá suas solicitações enviadas aos logs do servidor principal.

Em outras palavras, se você colocar diretivas de Log em uma seção VirtualHost, ela substituirá as diretivas de Log na configuração do servidor principal. Se você deseja fazer logon em um único arquivo de log, remova a configuração de log das seções do VirtualHost.

Para simplificar, prefiro registrar todos os dados do Access em um único arquivo de log. Posteriormente, você pode processar os logs e dividir os arquivos de log em arquivos de log para os hosts virtuais. Além disso, gravar em um único arquivo de log é um uso mais eficiente dos recursos do computador do que gravar em 30 arquivos de log de uma só vez. Apenas verifique se o seu LogFormat inclui o '% v', que registrará o nome do host virtual.

É possível ter TODOS os acessos e erros duplicados em um arquivo de log compartilhado?

Você pode registrar todos os erros e acessar um arquivo de log compartilhado, mas o arquivo de log é feio. Primeiro, envie os dados do log do Apache para o syslog e use o syslog para enviar para um arquivo local ou um servidor de log remoto.

# Send access logs to syslog
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined
# Send error logs to syslog
ErrorLog syslog:local7

E então em /etc/syslog.conf

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log
Stefan Lasiewski
fonte
2

O que fiz foi adicionar uma segunda linha do CustomLog na seção VirtualHost. Mas eu tive que fazer isso para todos os arquivos conf do vhost. Ele funciona e está no meu modelo agora para que novos fantasmas sejam levados em consideração.

Meu apache2 agora registra hits em dois lugares:

  1. As especificidades para um vhost no diretório desse vhost e
  2. a /var/log/apache2em um arquivo combinado para todos os vhosts.

Aplico um LogFormat diferente a cada um desses dois logs para acomodar respectivamente, é claro. O /var/log/apache2log é analisado com Perl e sugado para uma estrutura MySQL altamente normalizada para análise e geração de relatórios. O logrotate varre uma vez por semana.

sacudir
fonte
1

bem, se você quiser ver os logs ao vivo em um só lugar para todos os hosts virtuais, basta digitar:

tail -f /var/www/*/access.log

a mesma regra se aplica ao gato com grep:

 cat /var/www/*/access.log | grep "something"

ou se o log rotate compactou os arquivos já:

gzip -d /var/www/*/access.log.2.gz

exemplos são testados no Debian / Ubuntu

trojan
fonte
0

Eu não acho que isso seja possível. Pelo menos a documentação não menciona isso.

A melhor maneira de simular esse tipo de comportamento é definir a tag% v no formato e, na rotação do log, dividir uma cópia dos arquivos de log em arquivos específicos do host virtual.

Kimvais
fonte
0

Não sei se os locais dos arquivos de log seguem algum tipo de padrão nos virtualhosts, mas, se o fizerem, eu me esqueceria de fazer o Apache criar um log duplicado e apenas catar os logs quando eu precisar deles.

cat /var/www/*/log/access.log > /var/www/logs/access.log
joebert
fonte
0

Também estou procurando uma resposta para esta pergunta. Até agora, tenho duas soluções:

  1. o gato solução para que Joebert mencionou
  2. minha própria solução de cauda: tail -f /var/log/httpd/*access_log

Quero poder ver uma tail -fespécie de exibição em todas as atividades do servidor da web no host. No entanto, eu preferiria apenas ajustar um arquivo, pois não gosto muito da maneira como o tail lida com vários arquivos.


fonte
Obtenha multitail. É bastante útil.
Até
0

Você tem 2 possibilidades usando a diretiva ErrorLog http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

1) Use syslog e lide com a duplicação em [r] syslog.conf

2) Use pipe, envie a entrada de log para um aplicativo / script e lide com a duplicação nesse aplicativo / script

lrosa
fonte
0

É estritamente necessário assistir a todos os logs de acesso? Se os erros forem realmente causados ​​por uma solicitação de um vhost, deve haver algo registrado no log de erros do vhost. Nesse caso, ls -t /var/www/*/log/error.log para determinar qual vhost é o culpado e, em seguida, observando apenas esse arquivo de log de acesso parece ser um bom primeiro passo para eliminar muitas leituras desnecessárias de logs .

Jeremy M
fonte