Apache vhost log rotacionar por data

1

Eu tenho o Apache 2.2 rodando no Debian 7 (em um VPS), com hosts virtuais definidos para vários sites diferentes.

Configurei um erro individual e acessei registros para cada vhost, mas não encontrei uma maneira de girar / arquivar os registros do meu jeito.

É claro que os logs padrão do Apache no Debian são rotacionados pelo logrotate, mas eu não acho isso particularmente satisfatório por várias razões - principalmente porque eu quero que logs arquivados sejam nomeados por data, e porque configurá-lo separadamente para cada vhost parece incômodo. Eu também não tenho certeza sobre a exclusão automática de logs antigos; Eu poderia querer fazer isso manualmente somente depois de baixá-los do servidor.

Minha solução ideal faria o seguinte todo mês (ou talvez semana):

  • Anexe a data ao nome do arquivo ou mova o arquivo para uma subpasta com nome de data.
  • Gzip os arquivos arquivados.

Também preciso que isso seja fácil de configurar para vários vhosts.

O ideal é que não envolva o reinício do apache (embora uma reinicialização elegante não seja o fim do mundo).

Qual é a melhor maneira de configurar isso? Tenho certeza de que já foi feito antes ...

    
por Caesar 23.07.2013 / 07:02

3 respostas

2

Eu encontrei várias soluções para este problema na web, nenhuma delas totalmente satisfatória, mas várias delas são aceitáveis. Estes incluíram o script rotatelogs do próprio Apache, que envolve canalizar o log para o script junto com os argumentos que dizem ao script como dividir e nomear os arquivos.

No final, no entanto, acabei usando logrotate . Acontece que tenho vergonha de dizer que a página de manual on-line que eu estava lendo estava desatualizada e, na verdade, o logrotate agora tem a capacidade de nomear arquivos por data, que era a coisa mais importante que eu queria.

Eu também era capaz de usar curingas para evitar ter que configurar um novo arquivo conf para logrotate toda vez que eu adicionasse um vhost no futuro.

Para qualquer outra pessoa que tente fazer isso, a configuração do logrotate que usei foi a seguinte:

/var/www/*/logs/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    dateext
    dateformat .%Y%m%d
    extension .log
    olddir old
    create 640 root root
    sharedscripts
    postrotate
        /etc/init.d/apache2 reload > /dev/null
    endscript
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate;
        fi; \
    endscript
}

Tenho certeza que mudarei no futuro, mas como ponto de partida, tudo bem.

(Nota, o olddir é necessário porque senão *.log também corresponde ao arquivo de log da semana passada ...)

    
por 25.07.2013 / 04:00
2

( Eu detecto um pouco de NIH ? )

Veja por que você não deve fazer isso sozinho:

  1. É melhor estender do que reinventar: No essencial, o que você deseja fazer já está coberto pelo logrotate. Se você não gosta do comportamento padrão dele, você pode felizmente configurá-lo para se comportar de maneira diferente, através de é pré / pós-ações , convenções de nomenclatura, etc. .

  2. Resolvendo um problema já resolvido: Os caras que contribuíram para logrotate todos já encontraram seu problema antes, e então alguns. Em algum momento, você provavelmente se deparou com os mesmos problemas de detalhe que eles enfrentaram e solucionou com muito mais experiência e feedback ... você realmente quer desperdiçar sua energia para resolvê-los novamente?

  3. Não excluir os logs antigos é uma idéia muito ruim. Isso resulta em um jogo em espera para preencher sua partição de registro - dependendo de sua configuração, seus aplicativos ou até mesmo todo o seu servidor, chegará a um ponto insuportável. De preferência no auge do seu dia-a-dia.

    Se você precisar manter os logs antigos por motivos de contabilidade (segurança, financeiro, gov), terá que implementar uma solução de arquivamento para eles.

  4. Compatível com homebrew : Se você tiver problemas, não há mais ninguém para perguntar, já que somente você usa essa solução - enquanto o logrotate é usado por muitos outros.

  5. A configuração de é fácil: apenas cp e sed de suas configurações de vhost de acordo. Esforce-se pela automação.

Observe que as razões acima não são expressivas e não se aplicam em todos os lugares. Não é uma má ideia desafiar as soluções existentes de vez em quando (talvez possa ser uma solução melhor), mas, neste caso, eu consideraria isso um exercício de futilidade.

    
por 23.07.2013 / 09:56
0

Outra alternativa poderia ser fazer isso via CRON. Aqui está como eu faço;

#!/bin/bash

for file in /var/www/*/logs/*.log; do
    # zip and truncate file (dont remove cos apache cannot write on it unless restarted)
    zip $(dirname $file)/$(date +"%Y-%m-%d")-$(basename $file).zip $file && truncate -s 0 $file
done

Este script produzirá um arquivo de log compactado como /var/www/example.com/logs/2010-01-01-access.log.zip .

    
por 31.07.2015 / 21:38