Apache Eu tenho muitos domínios virtuais, como posso fazer para gerar logs separados de cada

Se você usa o Apache para apenas alguns sites, você nunca passará por este problema. Mas em servidores em que a quantidade de domínios virtuais é muito grande, surge a necessidade de você separar os logs de acesso para cada um dos dominios virtuais, com o fim de fazer a análise destes logs e apresentar estatísticas para os usuários de cada domínio (O Webalizer faz isso). Mas para cada arquivo de log, o Apache abre um processo de escrita, e o sistema tem um certo limite de processos, ou seja, o Apache só poderá abrir alguns poucos processos para escrever nos logs.

Para resolver isso, existe um utilitário chamado split-logfile (que vem junto com o Apache) que separa os logs de acordo com o domínio virtual. Para fazer funcionar, primeiro retire todos os logs dos seus domínios virtuais e adicione apenas as seguintes linhas de log na configuração principal do seu servidor (e não do domínio virtual):

LogFormat "%v %h %l %u %t \%r\ %>s %b \%{Referer}i\ \%{User-Agent}i\" combined LogFormat "%v %h %l %u %t \%r\ %>s %b" common\<

CustomLog "/var/www/logs/access_log" combined ErrorLog "/var/www/logs/error_log"

As primeiras duas linhas vão criar o formato da linha de log que o Apache irá escrever. A única diferença para o formato padrão é o acréscimo do %v no início, que indica o domínio virtual usado. As duas ultimas linhas indicam onde o log vai ser gravado (o de acesso e o de erros do servidor).

Agora reinicie ou recarrege o seu Apache, e o seu arquivo de log estará sendo escrito de uma forma diferente. Agora vamos separar os logs por domínio virtual, e para isso é muito simples, é só criar um pequeno script que fará todo o processo:

/usr/local/bin/separa-logs-apache

  1. !/bin/bash
  2. Separa os logs

cd /var/www/logs/splitted /usr/bin/split-logfile \< /var/www/logs/access_log

  1. Zera o log principal

echo -n > /var/www/logs/access_log

Não esqueça de criar antes também o diretório /var/www/logs/splitted. Onde estarão armazenados os logs separados.

Agora é só rodar este script e verificar o conteúdo do /var/www/logs/splitted. Existirá um arquivo .log para cada domínio virtual, sem o nome do domínio virtual (string %v do LogFormat), permitindo que você use normalmente o arquivo de log (para fazer análises com o Webalizer por exemplo).