Rotação do log de produção do Ruby on Rails

172

Qual é a melhor maneira de ativar a rotação de logs em um aplicativo de produção Ruby on Rails?

É usando logrotate no servidor de hospedagem ou há um conjunto de opções a serem usadas ao inicializar o criador de logs do aplicativo?

cnicolaou
fonte
Vejo que já existe uma resposta para isso, mas queria perguntar qual é o seu ambiente. Eu mesmo uso o método syslog + logrotate, mas obviamente o tipo de ambiente (seja dedicado, compartilhado; que tipo de sistema operacional * ix está hospedando ou outro, etc.) teria alguma influência aqui.
precisa saber

Respostas:

203

Opção 1: syslog + logrotate

Você pode configurar trilhos, para usar as ferramentas de log do sistema.

Um exemplo em config / environment / production.rb .

# Use a different logger for distributed setups
config.logger = SyslogLogger.new

Dessa forma, você faz logon no syslog e pode usar as ferramentas padrão de rotação de logs para girar os logs.

Opção 2: logs normais do Rails + logrotate

Outra opção é simplesmente configurar o logrotate para pegar os logs deixados pelos trilhos. No Ubuntu e Debian, isso seria, por exemplo, em um arquivo chamado /etc/logrotate.d/rails_example_com.

/path/to/rails.example.com/tmp/log/*.log {
    weekly
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

Conforme as sugestões abaixo, é recomendável usar no Rails copytruncate, para evitar a necessidade de reiniciar o aplicativo Rails.

Edit: remove "sharedscripts / endscript", pois não são usados ​​aqui e causam problemas de acordo com o comentário. E removido create 640 root admconforme o comentário sugerido.

berkes
fonte
3
Para usar o logrotate, a linha "config.logger = SyslogLogger.new" em config / environment / production.rb deve ser comentada ou descomentada?
robertwbradford
2
Ele deve permanecer comentada, de modo que os arquivos de log são escritos em (por exemplo): /var/www/myrailsapp/current/log/production.log
Luca Spiller
3
Se estiver usando a logrotatesolução, vale a pena a resposta da @ amit-saxena - sugere o uso de copytruncatemais de uma creatediretiva.
Tom Harrison #
3
Quando você usa copytruncate, createnão tem nenhum efeito, então você provavelmente deve removê-lo do seu exemplo
Michaël Witrant
3
Você também pode adicionar a linha su your_rails_user your_rails_groupcom o proprietário e o grupo de seus arquivos de log (ou seja, os do processo Rails / Passenger) ou (versões recentes de?) Logrotate podem reclamar de permissões.
oseiskar
56

Se você estiver usando o logrotate, poderá escolher uma das opções mostradas abaixo, colocando um arquivo conf no diretório /etc/logrotate.d/.

# Rotate Rails application logs based on file size
# Rotate log if file greater than 20 MB
/path/to/your/rails/applicaton/log/*.log {
    size=20M
    missingok
    rotate 52
    compress
    delaycompress
    notifempty
    copytruncate
}

Ou

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}

Observe que copytruncate faz uma cópia de backup do log atual e limpa o arquivo de log para continuar gravando. A alternativa é usar create, que executará a rotação renomeando o arquivo atual e, em seguida, criando um novo arquivo de log com o mesmo nome que o arquivo antigo. Eu recomendo fortemente que você use copytruncate, a menos que saiba que precisa criar. O motivo é que o Rails ainda pode continuar apontando para o arquivo de log antigo, mesmo que seu nome tenha sido alterado e pode ser necessário reiniciar para localizar o novo arquivo de log. copytruncate evita isso mantendo o mesmo arquivo que o arquivo ativo.

amit_saxena
fonte
Mas não devo reiniciar os trilhos toda vez que o logrotate é executado?
Lzap
2
Trunque o arquivo de log original depois de criar uma cópia, em vez de mover o arquivo de log antigo e, opcionalmente, criar um novo. Ele pode ser usado quando algum programa não pode ser instruído a fechar seu arquivo de log e, portanto, pode continuar gravando (anexando) em o arquivo de log anterior para sempre. Observe que há um intervalo de tempo muito pequeno entre copiar o arquivo e truncá-lo, portanto, alguns dados de registro podem ser perdidos. Quando essa opção é usada, a opção de criação não terá efeito, pois o arquivo de log antigo permanece no local.
Lzap
1
Você não precisa reiniciar os trilhos se estiver usando copytruncate, porque ainda aponta para o mesmo arquivo de log.
Amit_saxena
A configuração exige que você indique quando rotacionar os logs? como "semanal" ou "tamanho = 20 milhões"? Ou você pode omitir isso, caso queira executar apenas o logrotate manualmente?
Damainman 07/08
1
Não tenho certeza se entendi sua pergunta corretamente, mas você precisa especificar um critério para a rotação automática de log. Se você não quiser que seja automático, não coloque o arquivo no diretório /etc/logrotate.d/, mantenha-o em outro lugar. Você pode então executar logrotate --force $CONFIG_FILEespecificando o local do arquivo de configuração para executá-lo manualmente.
Amit_saxena
31

Para o Rails 5, era isso que eu precisava fazer para limitar o tamanho do log e não alterar a saída do servidor no console:

De acordo com a documentação , se você quiser limitar o tamanho da pasta de log, coloque-o em seu arquivo de ambiente ('development.rb' / 'production.rb').

config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)

Com isso, seus arquivos de log nunca crescerão mais que 50Mb. Você pode alterar o tamanho conforme sua preferência. O '1' no segundo parâmetro significa que 1 arquivo de log histórico será mantido; portanto, você terá até 100Mb de logs - o log atual e o bloco anterior de 50Mb.

Fonte para esta solução .

Estrangeiro companheiro
fonte
2
O primeiro argumento é o nome do arquivo, simplesmente falando, ou seja, 'log / development.log'. Então, eu prefiro uma maneira mais longa, mas transparente. Em vez de config.paths['log'].firsteu colocarRails.root.join('log', "#{Rails.env}.log")
Mikhail Chuprynski
1
@ZiaUlRehmanMughal Sim, trabalhando com Rails 4. Eu estou usando Rails 4.2.3, com configuração como esta: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS
1
Para facilitar a leitura, vale ressaltar que você pode confiar nas extensões de bytes do ActiveSupport: 50.megabytesé o mesmo 50 * 1024 * 1024, mas muito mais fácil de entender. Consulte Extensões principais do ActiveSupport para obter mais detalhes.
Pierre-Adrien Buisson
1
Cheguei aqui novamente depois de pesquisar no Google (vida do programador: D). Eu queria saber se podemos configurar esta linha para girar todos os arquivos de log na pasta de log? Aparentemente, esta linha girará apenas a primeira linha.
Zia Ul Rehman Mughal
Observe que isso girará apenas o arquivo log / production.log como Rails.application.config.paths['log'].firstretornará exatamente esse arquivo
valachi
5

Para o Rails 5 , se você deseja rotação diária de logs, você só precisa disso:

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')

De acordo com a documentação , você pode usar daily, weeklyou monthly.

Rael Gugelmin Cunha
fonte
2

Para cada log: Rails log, Rpush log, ... Você pode usar assim no seu arquivo de configuração de serviço:

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)

Significa: salve apenas 1 arquivo de log anterior após a divisão. Tamanho do log principal nunca superior a 20 MB.

ThienSuBS
fonte
-9

Habilite o envio de logs para o loggly usando o rails logglier da seguinte maneira no meu arquivo environment / production.rb. versão trilhos é 4.1.0

RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end
riya khana
fonte
Por favor me sugerir algo o que fazer ... este código não está funcionando
riya khana
Rails versão é 4.1.0 e versão do Ruby é 2.1.1
riya khana