Apache logrotate com nomes diferentes para atual e arquivos

1

Estou executando o Apache 2.2 no CentOS 6.5 e o que eu gostaria de fazer é ter o arquivo de log de acesso atual do Apache:

/var/log/httpd/access_log

E a cada dia, à meia-noite, esse arquivo é renomeado (suponha que 2014-09-22 é a data que acabou de passar):

/var/log/httpd/access_log.2014-09-22

... e um novo arquivo de log ( access_log ) é criado naquele instante, e o Apache continua registrando nele. Como posso fazer isso? Eu já tenho essa diretiva CustomLog configurada:

CustomLog "|/usr/sbin/rotatelogs /var/log/httpd/access_log.%Y-%m-%d 86400" combined

Mas isso faz com que o arquivo de log atual (ativo) seja nomeado access_log.2014-09-22 se hoje for 2014-09-22.

Eu posso pensar em uma solução hacky, onde eu tenho um script que é executado logo após a meia-noite e define /var/log/httpd/access_log como um link simbólico para qualquer arquivo de log do dia atual. (Seria baseado na data, portanto, mesmo que seja um servidor de baixo tráfego e o novo arquivo de log ainda não existisse, o link simbólico estaria correto e funcionaria assim que qualquer requisição atingisse o servidor). Mas parece que deve haver uma maneira mais elegante de fazer isso. Existe alguma maneira de dizer que os logs de rotação usam um nome de arquivo para o log atual e um nome de arquivo diferente para os logs rotacionados? Falhando nisso, existe alguma outra maneira limpa de fazer o que eu quero?

EDITAR: Reiniciar o Apache todos os dias não é uma opção.

    
por dirtside 28.09.2014 / 01:46

2 respostas

0

Olhando para a página de manual de log rotate , mostramos que dateext e dateformat podem ser usado para atingir esse objetivo.

  • dateext: Arquive versões antigas de arquivos de log adicionando uma extensão diária como YYYYMMDD em vez de simplesmente adicionar um número. A extensão pode ser configurada usando a opção dateformat.

  • dateformat (format_string): Especifique a extensão para a data ext usando a notação similar à função strftime (3). Apenas os especificadores% Y% m% de% s são permitidos. O valor padrão é -% Y% m% d. Observe que também o caractere que separa o nome do log da extensão faz parte da string dateformat. O relógio do sistema deve ser definido após 9 de setembro de 2001 para que% s funcione corretamente. Note que os datestamps gerados por este formato devem ser classicamente lexíveis (ou seja, primeiro o ano, depois o mês e depois o dia. Por exemplo, 2001/12/01 está ok, mas 01/12/2001 não é, desde 01/11 / 2002 classificaria mais baixo enquanto é mais tarde). Isso ocorre porque, ao usar a opção de rotação, a opção Girar registro ordena todos os nomes de arquivos girados para descobrir quais arquivos de registro são mais antigos e devem ser removidos.

Então, usando um script logrotate que uso para configurações do Apache no Ubuntu, você pode fazer isso:

/var/log/apache2/*.log {
    weekly
    missingok
    rotate 26
    compress
    dateext
    dateformat %Y-%m-%d
    delaycompress
    notifempty
    create 640 root www-data
    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
}
    
por 28.09.2014 / 05:59
0

Use o cronolog .

CustomLog "|/usr/sbin/cronolog \
            -S /var/log/httpd/access_log
            /var/log/httpd/access_log.%Y-%m-%d" combined

Isso é semelhante à sua "solução hacky", em que cada log será o nome access_log.YYYY-MM-DD, incluindo o log ativo. Mas o cronolog manterá o symlink (-S) para você, de forma que / var / log / httpd / access_log sempre aponte para o log atual. Como bônus, isso acontecerá automaticamente quando o dia passar - não é necessário nenhum trabalho cron logrotate.

    
por 16.12.2015 / 20:42