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
#!/bin/bash # # Separa os logs cd /var/www/logs/splitted /usr/bin/split-logfile < /var/www/logs/access_log # 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).