Como girar os arquivos de log automaticamente / manualmente para produção Rails App

4

Estou assumindo a administração de um servidor que possui um aplicativo Rails de terceiros personalizado. O desenvolvedor do aplicativo me informou que os arquivos de log ruby estão ficando grandes e me indicou o seguinte link: - link

Os logs estão localizados em / root / production / app / log. Esta pasta contém vários arquivos que terminam em .log. Os arquivos de log atuais têm cerca de 2 GB de tamanho e a pasta também possui arquivos de log arquivados com o formato "logname.log.2013_01_18.bz2".

Eu tentei pesquisar o histórico do comando ssh para ver se consigo ver qual comando foi usado para criar os arquivos archive, mas os comandos não retornam tão longe. Eu também corri "cat / var / lib / logrotate / status", mas não parece que logrotate não rodou nenhum log da pasta acima.

Basicamente:

  1. Eu gostaria de poder executar um comando para girar os logs manualmente e / ou fazer com que os logs girem automaticamente todo domingo à noite.
  2. Se eu precisar desligar meu aplicativo de trilhos para girar os logs, não tenho nenhum problema com isso, pois tenho uma janela de manutenção todo domingo à noite para fazer isso.
  3. Finalmente, não tenho certeza se devo compactar os arquivos de log semanalmente no bz2 ou apenas compactar os logs mensalmente para os logs girados relacionados ao mês anterior. Isto é principalmente porque eu não tenho certeza exatamente como este aplicativo utiliza os logs e eu nunca usei aplicativos rails nem precisei configurar a rotação de logs manualmente.

Neste momento, preciso manter todos os arquivos de log e não descartá-los. Qualquer informação sobre preocupações relacionadas à rotação de logs, como o backup de logs antes de tentar girar, é bem-vinda.

    
por Damainman 06.08.2013 / 06:49

1 resposta

11

logrotate é usado pelo sistema para girar logs, portanto, você tem duas opções. Você pode incorporar a rotação desses logs de aplicativos nas rotações do sistema ou configurá-los e executá-los manualmente ou a partir do crontab do usuário root (Assumindo que o aplicativo Rails seja executado como root, pois seu diretório é /root/... ).

Rotação do sistema

Para configurar um logrotation dentro dos pré-existentes do sistema, basta adicionar um novo arquivo ao diretório /etc/logrotate.d . Chame de railsapp.conf . Eu usaria os outros exemplos para construí-lo. Também confrere com a página logrotate man.

Rotação do usuário

Se você deseja executar sua própria instância de logrotate , só é necessário fornecer as opções de linha de comando para fazê-lo.

  1. Primeiro, faça uma cópia de /etc/logrotate.conf /root/rails_logrotate.conf
  2. Edite o arquivo para que ele tenha a rotação de log configurada da maneira desejada (por exemplo, mantenha todos os logs, gire semanalmente, etc.)
  3. Execute

    # 1st time
    $ logrotate -d -f -s $HOME/my_logrotate.state logrotate.conf
    
    # afterwards
    $ logrotate -d -s $HOME/my_logrotate.state logrotate.conf
    

    Se as coisas estiverem corretas, você poderá executar novamente esses comandos sem a opção -d . Isso é apenas para fins de depuração e não executará nenhuma das tarefas, apenas mostrará o que ela faria.

    $ logrotate -s $HOME/my_logrotate.state logrotate.conf     
    

    Você também pode usar a opção -v para torná-la detalhada, semelhante à saída vista ao usar a opção -d .

Exemplo

  1. Comece com este arquivo de log.

    $ dd if=/dev/zero of=afile bs=1k count=10k
    10240+0 records in
    10240+0 records out
    10485760 bytes (10 MB) copied, 0.0702393 s, 149 MB/s
    
    $ ll afile
    -rw-rw-r-- 1 saml saml 10485760 Aug  6 14:37 afile
    
    $ touch -t 201307010101 afile
    $ ll afile
    -rw-rw-r-- 1 saml saml 10485760 Jul  1 01:01 afile
    
  2. Agora execute logrotate

    $ logrotate -v -f -s $HOME/my_logrotate.state logrotate.conf
    reading config file logrotate.conf
    reading config info for /home/saml/afile 
    
    Handling 1 logs
    
    rotating pattern: /home/saml/afile  forced from command line (1 rotations)
    empty log files are rotated, old logs are removed
    considering log /home/saml/afile
      log needs rotating
    rotating log /home/saml/afile, log->rotateCount is 1
    dateext suffix '-20130806'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    glob finding old rotated logs failed
    renaming /home/saml/afile to /home/saml/afile-20130806
    creating new /home/saml/afile mode = 0664 uid = 500 gid = 501
    
  3. Verifique os resultados

    $ ll afile*
    -rw-rw-r-- 1 saml saml        0 Aug  6 14:40 afile
    -rw-rw-r-- 1 saml saml 10485760 Jul  1 01:01 afile-20130806
    

Cron semanal

Para que isso seja executado todo domingo, você pode criar a seguinte entrada crontab para o usuário root.

$ crontab -e

Adicione as seguintes linhas:

# Example of job definition:
# .---------------- minute (0 - 59)
# |  .------------- hour (0 - 23)
# |  |  .---------- day of month (1 - 31)
# |  |  |  .------- month (1 - 12) OR jan,feb,mar,apr ...
# |  |  |  |  .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# |  |  |  |  |
# *  *  *  *  * user-name  command to be executed
0 0 * * sun logrotate -v -f -s $HOME/my_logrotate.state $HOME/logrotate.conf

Em seguida, salve os itens acima.

Você também pode usar esses tipos de atalhos em vez de especificar os dias, minúsculos, segundos, etc.

string         meaning
------         -------
@reboot        Run once, at startup.
@yearly        Run once a year, "0 0 1 1 *".
@annually      (same as @yearly)
@monthly       Run once a month, "0 0 1 * *".
@weekly        Run once a week, "0 0 * * 0".
@daily         Run once a day, "0 0 * * *".
@midnight      (same as @daily)
@hourly        Run once an hour, "0 * * * *".

Referências

por 06.08.2013 / 15:03