O logrotate não está funcionando

18

Estou tentando fazer com que o logrotate funcione no meu VPS para girar meus arquivos apache semanalmente. Atualmente, o conteúdo do arquivo de configuração apache2 é como tal.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

Deixei-o por duas semanas agora e nada mudou, tanto quanto posso dizer. Quando simulo na linha de comando, recebo a seguinte saída.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

Alguma idéia do que Iv'e configurou de errado?

Meu arquivo de status também está vazio :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Atualizar

Excluí o arquivo de status e fiz uma execução forçada de logrotate e agora os logs parecem ter sido rotacionados e o arquivo de status parece mais promissor!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf
Malaquias
fonte

Respostas:

17

Eu acho que isso weeklysignifica que o logrotate deseja ver pelo menos uma entrada antiga para o seu arquivo access.log para rotacioná-lo.

Portanto, o problema parece ser que você não está armazenando a entrada de estado para acionar a rotação.


Aqui está um exemplo detalhado de como o logrotate decide girar um arquivo de log
(esses são os caminhos do fedora, Ubuntu, Centos etc. podem ser diferentes)

(Fiz alguns pedidos para http://localhostque haja algumas entradas no access_log, caso contrário, o logrotate nunca gira ...)

Então eu configurei meu logrotate para o apache semanalmente assim;

/var/log/httpd/*log {
        weekly
...
}

e originalmente não há entrada no /var/lib/logrotate.statusarquivo

# grep access_log /var/lib/logrotate.status
<- nothing

Portanto, o logrotate não gira o access_logarquivo;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

No entanto, se eu executar o logrotate manualmente dessa forma;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

agora existe uma entrada no arquivo de estado para o httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

No entanto, o apache ainda não vai girar o log, porque a entrada tem apenas 0 dias de idade (11/11/2012);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

No entanto, se você editar o arquivo de status com o vi vi /var/lib/logrotate.status, algo assim poderá definir a data para mais de uma semana ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Em seguida, o logrotate agora gira corretamente o arquivo devido à data no arquivo de estado 2012-4-11ser mais de uma semana atrás a partir de hoje2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(lembre-se de que as -dcausas são uma execução a seco, portanto, é útil apenas para inspeção, você deve executar o comando sem -dprecisar fazer entradas de status ou girar arquivos etc.)

Tom H
fonte
1
Os arquivos de log tinha entradas caminho mais de uma semana de idade - Parece que ele está funcionando agora, no entanto eu acho que vai descobrir uma semana a partir de agora ...
Malaquias
2
Desculpe, eu poderia ter sido mais claro na resposta, mas acho que, para uma rotação semanal, ele precisa de uma entrada no arquivo /var/lib/logrotate.statuscom uma data de pelo menos uma semana. Eu atualizei a resposta com um exemplo ...
Tom H
Obrigado por uma explicação tão clara - eu entendo totalmente o lado da data das coisas, é que elas não rodam a menos que eu chame o comando manualmente ... É como se o CRON não estivesse chamando a rotação do log?
Malaquias
Eu sou relativamente novo na administração do Linux ... Dentro de /etc/cron.daily/logrotate/ existe: #! / Bin / sh test -x / usr / sbin / logrotate || exit 0
Malachi
7
log does not need rotating

Isso pode ocorrer porque os arquivos de log estão vazios.
Essa situação pode ocorrer porque o apache ainda grava em um arquivo de log anterior, que foi renomeado sem reiniciar o apache. Então, access.log se tornou access.log.1 e o apache escreve nele.

Ou você tem um problema com o horário de criação do log:

ls -al --time=ctime /var/www/user/site.com/logs/
Gregory MOUSSAT
fonte
Você pode comentar a notifemptylinha para lidar com os logs de 0 byte que não estão girando. Em seguida, você desejará touchum novo arquivo de log antes de cada teste, para que o logrotate tenha algo para girar.
Banjer
6

Eu enfrentei o problema semelhante, exceto por nenhuma dessas respostas me ajudar. Meu arquivo de log era enorme e antigo, minha configuração era 100% aprovada e válida, remover o arquivo de status não ajudou.

Acabou que o problema estava nas entradas duplicadas de logrotate . Quando executo o logrotate manualmente no meu arquivo de configuração, é assim:

logrotate -df /etc/logrotate.d/my_service_name

não mostrou nenhum erro, apenas disse:

log does not need rotating

Ainda não sei por que, na verdade. Mas quando executo um comando logrotate completo como esse:

logrotate -f /etc/logrotate.conf

Eu tenho a seguinte linha:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Aconteceu que o arquivo de configuração logrotate para o meu serviço continha as entradas para girar os logs de acesso ao nginx, bem como os próprios logs de serviço. E isso entrou em conflito com a configuração do ngnix logrotate, que possui uma regra para todas as entradas do nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

Portanto, a solução para o meu caso é bem simples: eu apenas tive que excluir a regra de rotação de logs nginx conflitantes da minha configuração .

Suponho que o logrotate tenha começado a abortar o processamento do arquivo em conflitos de regras apenas de uma das versões mais recentes. Eu recebo esse erro na v.3.8.7, mas na v.3.7.8 com a mesma configuração conflitante, ela grava o mesmo erro, mas gira bem. Embora eu não tenha encontrado nenhum registro disso no log de alterações do logrotate.

Innokenty
fonte
você parece estar certo sobre as versões mais recentes. Eu também tive entradas duplicadas; mas ao executar logrotate manualmente; funcionou muito bem. À noite, retorne o valor 0; mas não funcionou corretamente ...
Chris Maes
2

Tente executar sudo logrotate -f --verbose /etc/logrotate.d/apache2 Veja o que está escrito no console e corrija tudo o que estiver errado.

Aminah Nuraini
fonte
0

Eu tinha uma máquina Debian 7 que, após uma atualização do sistema, não girava mais os logs de correio. Todos os outros logs, exceto os de correio, foram rotacionados corretamente. Eu descobri que os logs de email haviam crescido vários gigabytes. Eu sempre gerenciava a rotação de logs via Webmin. Em seguida, executando logrotate -d /etc/logrotate.conf, vi a seguinte mensagem:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

Verificou-se que minhas entradas de rotação de e-mail foram listadas /etc/logrotate.d/rsyslog.dpkg-old, o que foi ignorado! Renomear o arquivo corrigiu a rotação do arquivo de log :-)

lucaferrario
fonte