如何在生产环境的Ruby on Rails应用程序中实现最佳的日志轮换方式?
是在托管服务器上使用logrotate,还是在初始化应用程序中从日志记录器使用一组选项?
如何在生产环境的Ruby on Rails应用程序中实现最佳的日志轮换方式?
是在托管服务器上使用logrotate,还是在初始化应用程序中从日志记录器使用一组选项?
您可以配置Rails使用系统日志工具。
在config/environments/production.rb中有一个例子。
# Use a different logger for distributed setups
config.logger = SyslogLogger.new
这样,你可以记录到系统日志,并可以使用默认的logrotate工具来轮换日志。
另一个选项是简单地配置logrotate以拾取rails留下的日志。
在Ubuntu和Debian上,例如,这将在名为/etc/logrotate.d/rails_example_com
的文件中。
/path/to/rails.example.com/tmp/log/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
根据以下建议,在Rails中建议使用copytruncate
,以避免需要重新启动Rails应用程序。
编辑:根据评论,删除了“sharedscripts/endscript”,因为它们在这里没有被使用并会引起问题。同时根据评论建议,删除了create 640 root adm
。
logrotate
解决方案,则值得关注@amit-saxena的答案--建议使用copytruncate
替代create
指令。 - Tom Harrisoncopytruncate
时,create
选项没有效果,因此您应该从示例中将其删除。 - Michaël Witrantsu your_rails_user your_rails_group
,其中包括你的日志文件所有者和组(即Rails/Passenger进程的日志文件),否则logrotate可能会报错权限问题。(注意:这句话有些括号内内容是疑问句,表示不确定性,应该翻译成相应的语气)。 - oseiskarsudo logrotate -f /etc/logrotate.d/rails_example_com
。通过这种方式,我发现我必须像oseiskar建议的那样添加 su rails_user rails_user_group
。 - Bram# 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
}
或者
# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
weekly
missingok
rotate 52
compress
delaycompress
notifempty
copytruncate
}
请注意,copytruncate会备份当前日志并清除日志文件以继续写入。另一种选择是使用create,它将通过重命名当前文件并创建一个与旧文件同名的新日志文件来执行轮换。
我强烈建议您使用copytruncate,除非您知道需要使用create。原因是Rails可能仍然指向旧的日志文件,即使它的名称已更改,可能需要重新启动才能找到新的日志文件。而copytruncate避免了这个问题,它保持相同的文件作为活动文件。
logrotate --force $CONFIG_FILE
。 - amit_saxena对于Rails 5,这是我必须做的来限制日志大小并且不改变控制台中的服务器输出:
根据文档,如果你想要限制日志文件夹的大小,在你的环境文件('development.rb'/'production.rb')中添加以下内容。
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, 1, 50 * 1024 * 1024)
使用这个方法,您的日志文件大小将永远不会超过50Mb。您可以根据自己的喜好更改大小。第二个参数中的“1”表示将保留1个历史日志文件,因此您最多可以拥有100Mb的日志——当前的日志和之前的50Mb块。
Rails.root.join('log', "#{Rails.env}.log")
而不是config.paths['log'].first
。 - Mikhail Chuprynskiconfig.logger = ActiveSupport :: Logger.new(config.log_file,1,20 * 1024 * 1024)
。 - ThienSuBS50.megabytes
与50 * 1024 * 1024
相同,但更容易理解。有关更多详细信息,请参见ActiveSupport核心扩展。 - Pierre-AdrienRails.application.config.paths ['log'] .first
恰好返回此文件。 - valachi对于Rails 5,如果您想进行每日日志轮换,您只需要这样做:
config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')
daily
、weekly
或monthly
。对于每一个日志:Rails 日志,Rpush 日志,...
您可以在服务的配置文件中像这样使用:
config.log_file = 'log/rpush.log'
config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20.megabytes)
通过在我的environments/production.rb文件中使用rails logglier,可以将日志发送到loggly。 rails版本为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