Por que apenas alguns dos meus logs são rotacionados?

3

Estou usando o Ubuntu 14.04. Eu tenho o seguinte no meu arquivo /etc/logrotate.conf ...

/home/rails/myproject/log {
        daily
        rotate 3
        compress
        delaycompress
        missingok
        notifempty
        create 644 rails rails
}

/var/log/postgresql {
        daily
        rotate 3
        compress
        delaycompress
        missingok
        notifempty
        create 644 root root
}

Toda noite, eu olhava meus logs de trilhos e sempre seria maior - ou seja, não parecia que os troncos estavam sendo girados ...

myuser@myproject:~$ ls -al /home/rails/myproject/log
total 4574368
drwxr-xr-x  2 rails rails       4096 May 30 12:04 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails 4523480004 Jun 22 10:19 production.log
-rw-rw-r--  1 rails rails  156358087 Jun 22 10:19 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

Quando executo o comando manualmente, vejo que alguns dos logs parecem girados ...

myuser@myproject:~$ sudo logrotate /etc/logrotate.conf
myuser@myproject:~$ ls -al /home/rails/myproject/log
total 4570288
drwxr-xr-x  2 rails rails       4096 Jun 22 10:22 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails          0 Jun 22 10:22 production.log
-rw-r--r--  1 rails rails 4523505906 Jun 22 10:23 production.log.1
-rw-rw-r--  1 rails rails  156369048 Jun 22 10:23 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log

Como faço para descobrir por que meus logs de trilhos não são girados todas as noites? Observe que outros logs no sistema parecem estar. Acima, incluí minha configuração de postgres, e quando olho para os logs lá, parece estar girando normalmente ...

myuser@myproject:~$ ls -al /var/log/postgresql
total 1832
drwxrwxr-t  2 root     postgres    4096 May  2 20:42 .
drwxr-xr-x 13 root     root        4096 Jun 22 10:22 ..
-rw-r-----  1 postgres adm      1861361 Jun 22 10:14 postgresql-9.6-main.log

Obrigado, - Dave

Editar: colocar a configuração em um arquivo separado não parece fazer nada. Abaixo está minha configuração e também os logs que não parecem ser girados ...

myuser@myapp:~$ sudo cat /etc/logrotate.d/myapp
[sudo] password for myuser:
/home/rails/myapp/log/*.log {
   daily
   missingok
   compress
   notifempty
   rotate 12
   create
   delaycompress
   missingok
   su rails rails
}

Aqui estão os registros. Não parece que nada aconteceu ...

myuser@myapp:~$ ls -al /home/rails/myapp/log
total 4635956
drwxr-xr-x  2 rails rails       4096 Jun 22 10:22 .
drwxr-xr-x 15 rails rails       4096 May 30 12:03 ..
-rw-rw-r--  1 rails rails          0 Jun 22 10:22 development.log
-rw-rw-r--  1 rails rails      14960 Jun  1 22:39 development.log.1
-rw-rw-r--  1 rails rails          0 Oct 22  2016 .keep
-rw-r--r--  1 rails rails          0 Jun 22 10:22 production.log
-rw-r--r--  1 rails rails 4546785231 Jun 24 12:12 production.log.1
-rw-rw-r--  1 rails rails  200336693 Jun 24 12:51 sidekiq.log
-rw-rw-r--  1 rails rails      54246 Apr 10 14:34 test.log
    
por Dave 22.06.2017 / 16:46

3 respostas

0

O trabalho do Logrotate é mover (renomear) e compactar arquivos. Você o configurou nesse caso para renomear e compactar os arquivos de log do Rails e criar novos com os nomes originais.

Os nomes dos arquivos são uma maneira de encontrar um arquivo, mas o arquivo real é apenas algum espaço no disco. Um arquivo pode ter vários nomes (hard links) ou nenhum nome (você pode rm de um arquivo que está aberto, mas ainda ocupa espaço no disco desde que o arquivo esteja aberto em algum processo).

O problema que você parece ter aqui é que o aplicativo Rails já tem o arquivo aberto quando é renomeado. O criador de logs do Rails não percebe a mudança de nome, porque usou o nome uma vez para abrir o arquivo e, em seguida, parou completamente de se importar com seu nome. O logger só tem um identificador no arquivo aberto.

Você tem que convencê-lo a fechar e reabrir os arquivos de log, usando seus nomes novamente, o que significa que ele começa a escrever nos novos arquivos vazios que agora têm o nome que os antigos costumavam ter.

Se você der uma olhada em /etc/logrotate.d , verá muitos exemplos disso, dependendo do que você instalou.

Por exemplo, o rsyslog tem:

postrotate
    invoke-rc.d rsyslog rotate > /dev/null
endscript

stunnel tem:

postrotate
    /etc/init.d/stunnel4 reopen-logs > /dev/null
endscript

Estes são scripts para informar ao processo relevante que o arquivo precisa ser reaberto. O mecanismo específico depende do programa, mas o que isso tende a ser feito é enviar um HUP (ou às vezes USR1 ) (veja man 7 signal ), que processos de longa execução tomam como instruções para fechar e reabrir arquivos de log.

No caso do Rails, a maneira de fazer isso varia dependendo do logger que você está usando. Acabei de ver alguns conselhos sugerindo que você deve usar copytruncate , que é basicamente uma "opção de fraude" no logrotate, dizendo para copiar manualmente o conteúdo e esvaziar o arquivo, em vez de movê-lo e criar um novo. (veja man logrotate.conf ). Isso é usado em vez de create da seguinte forma:

/home/rails/myapp/log/*.log {
    daily
    missingok
    compress
    notifempty
    rotate 12
    copytruncate
    delaycompress
    missingok
    su rails rails
}

Esta não é uma ótima solução, pois é literalmente copiar o arquivo inteiro (para criar um instantâneo dele como está) antes de excluir seu conteúdo, o que é bastante ineficiente.

No entanto, se você estiver usando o Unicorn para rodar seu aplicativo (que multiplexa as solicitações em vários processos de trabalho do Rails idênticos), suporta o sinal USR1 como normal (matando e substituindo todos os trabalhadores, efetivamente fazendo com que eles reabram os arquivos) e você pode simplesmente enviá-lo em um postrotate usando pkill ou similar, talvez assim:

/home/rails/myapp/log/*.log {
    daily
    missingok
    compress
    notifempty
    rotate 12
    create
    delaycompress
    missingok
    su rails rails
    postrotate
        pkill -USR1 -u rails unicorn
    endscript
}

pkill é uma ferramenta para pesquisar processos em execução e enviá-los sinais, para que encontre tudo com o nome unicorn executando como o usuário rails e envie o sinal USR1 que informa abra os arquivos de log. (Os exemplos que eu dei dos pacotes do Ubuntu ' /etc/logrotate.d arquivos estão realmente fazendo a mesma coisa, mas esses serviços têm a busca escondida em funções em seus scripts /etc/init.d .)

Tenho certeza que haverá uma maneira de configurar um postrotate sensível para qualquer configuração do Rails que você tenha (no pior e mais fácil caso, apenas reinicie), mas espero que isso explique o lado do Ubuntu das coisas de qualquer maneira ...

    
por Tom Spurling 02.07.2017 / 18:43
1

Parece que o problema se resume a você especificar um diretório para a rotação de arquivos, em vez de nomes de arquivos reais. Os arquivos de configuração para logrotate aceitam curingas para globbing (correspondência de padrões).

Para girar todos os arquivos com uma extensão .log no diretório /home/rails/myproject/log , você pode usar a seguinte linha no lugar da primeira linha da sua configuração:

/home/rails/myproject/log/*.log {

e similarmente na configuração do diretório postgres

/var/log/postgresql/*.log {

É possível usar o curinga * sem a extensão .log para girar todos os arquivos (exceto os ocultos que começam com . ) no diretório postgresql, mas eu prefiro o controle adicional de especificar .log somente arquivos:

/var/log/postgresql/* {

Como observação, esteja ciente de como você cria novas versões do arquivo de log com logrotate, se você criar o novo log postgresql com 644 permissões octais, de propriedade do usuário root, o usuário postgres não poderá escreva no novo arquivo de log.

    
por Arronical 22.06.2017 / 18:04
0

Verifique o status em /var/lib/logrotate/status se mostrar algum     questões

Por favor, verifique as permissões e propriedade dos arquivos em     /etc/logrotate.d proprietário da raiz e modo de permissão 644. snippet de código     para logrotate:

/home/rails/myapp/log/*.log {
   rotate 12
   daily
   missingok
   compress
   notifempty
   create 640 rails rails
   delaycompress
   missingok
}

verifique a saída logrotate pela execução manual com --verbose Se você precisar de logrotation para mais de um tamanho específico, você pode experimentar as opções maxsize e size no arquivo de configuração logrotate

    
por v_sukt 03.07.2017 / 13:34