Resolução de problemas do Logrotate

0

O problema

Eu tenho vários servidores idênticos, todos executando configurações logrotate idênticas, girando um arquivo de log personalizado. Em pelo menos um dos servidores, meus logs não estão sendo rotacionados corretamente.

Eu tenho resolvido esse problema de vez em quando há semanas, sem sucesso. Aqui estão mais algumas informações e os passos que tomei até agora. Qualquer ajuda seria apreciada.

Estou basicamente sem maneiras de solucionar esse problema e adoraria algumas ideias para tentar ver o que está errado aqui.

O que eu tentei

(os arquivos de configuração estão abaixo)

  1. Verifique a configuração e as permissões no arquivo principal logrotate . Tudo parece bem para mim lá.
  2. Defina permissões no diretório de destino, derp , para o que o logrotate precisa (o diretório não pode ser mundialmente editável afaik ).
  3. Força logrotate a ser executada com o seguinte:

    logrotate --force /etc/logrotate.d/derp
    

    Este comando gira os registros corretamente, mas no dia seguinte eles não serão executados.

  4. Altere manualmente a data para algum dia no passado em /var/lib/logrotate/status e, em seguida, veja se o log é executado corretamente na próxima vez que logrotate começar ou com:

    logrotate -vv /etc.logrotate.d/derp
    

    Isso girará o log uma vez, mas na próxima vez em que o log estiver em rotação, ele não será rotacionado. Aqui está a saída de uma rotação manual bem sucedida:

    rotating pattern: /derp/*.log  after 1 days (14 rotations)
    empty log files are not rotated, old logs are removed
    considering log /derp/access.log
    log needs rotating
    considering log /derp/php_errors.log
    log does not need rotating
    rotating log /derp/access.log, log->rotateCount is 14
    dateext suffix '-20150814'
    ...
    files getting renamed and moved
    ...
    running prerotate script
    renaming /derp/access.log to /derp/access.log.1
    creating new /derp/access.log mode = 0774 uid = 0 gid = 4
    running postrotate script
    

    A vida é boa, não? O único problema é que no dia seguinte, quando precisa ser rotacionado (ou seja, sempre tem dados e nunca está vazio), nada acontece.

  5. Eu consultei muitas perguntas da SEU, entre as quais esta questão que foi útil no passado lidando com outros problemas de logrotate.

Config

O sistema está executando o Debian 7 atualizado. O processo que gera os arquivos de log é executado como raiz. O processo que gera os arquivos de log é um aplicativo php e gera vários filhos.

Aqui estão as configurações relevantes, em que derp é a localização dos meus arquivos de log personalizados:

/etc/logrotate.d/derp

Permissões no arquivo de configuração:

-rw-r--r-- 1 root root 265 Jul 9 2014 derp

/derp/*.log {
                daily
                missingok
                rotate 14
                compress
                delaycompress
                notifempty
                create 774 root adm
                sharedscripts
                postrotate
                                nohup /derp/daemonrestart.sh > /dev/null 2>&1
                endscript
                prerotate
                                killall -9 php > /dev/null 2>&1
                endscript
}

Os scripts prerotate e postrotate basicamente iniciam o processo (um servidor de soquete) ou o interrompem e funcionam bem em todos os outros servidores. Tenho certeza de que não há problemas lá.

/var/lib/logrotate/status

(redigido para mostrar informações relevantes)

logrotate state -- version 2
"/var/log/kern.log" 2015-7-20
...
"/derp/php_errors.log" 2015-8-11
...
"/derp/access.log" 2015-8-14
...

/derp/

Permissões no diretório de destino:

drwxr-xr-x 2 root root 4096 Jun 18 10:05 derp

E o log relevante localizado em \derp\ :

-rwxrwxr-- 1 root adm 3755558 Aug 14 07:57 access.log

    
por datUser 14.08.2015 / 15:46

2 respostas

0

Ok, eu desisti de tentar consertar isso. Cron para o resgate.

sudo crontab -e

Em seguida, adicione a seguinte linha ao crontab do superusuário

# Logrotate they said...
3 6 * * *               /usr/sbin/logrotate -f /etc/logrotate.d/derp &> /dev/null

O sinalizador -f força o logrotate a rodar os logs. O arquivo localizado em /etc/logrotate.d/derp é a configuração de logrotate correspondente para o meu aplicativo.

É feio, mas foi a única maneira de corrigir esse bug. Espero que isso ajude alguém.

    
por 08.12.2015 / 15:21
1

Você escreveu:

Force logrotate to run with the following: logrotate --force /etc/logrotate.d/derp. This command rotates the logs correctly but the next day they will not run.

O problema aqui é que o atributo daily realmente significa "24 horas". Portanto, a menos que a entrada cron para logrotate (provavelmente em /etc/cron.d/daily ) esteja a mais de 24 horas do momento em que você gira os arquivos de log manualmente, os arquivos de log não serão alternados até o dia seguinte. >

No meu sistema Debian, as entradas em /etc/cron.daily são executadas diariamente às 06:25, então é provável que qualquer rotação de log manual feita durante o dia normal de trabalho evitará que uma rotação de log ocorra até dois dias depois.

    
por 08.12.2015 / 16:30