Ruby on Rails 生产日志轮换

在 Ruby on Rails 生产应用程序上启用日志轮换的最佳方式是什么?

是通过在宿主服务器上使用 logrotleor 还是在从应用程序初始化 logger 时使用一组选项?

71291 次浏览

选项1: syslog + logrolation

您可以配置 Rails,以使用系统日志工具。

Config/environment/production.rb中的一个例子。

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

通过这种方式,您可以将日志记录到 syslog,并且可以使用缺省 logrotltools 来旋转日志。

选项2: 普通的 Rails 日志 + logrol

另一种选择是简单地配置 logrotleto 拾取 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 应用程序。

编辑: 删除“ sharedscript/endscript”,因为它们不在这里使用,并根据注释导致问题。并删除 create 640 root adm按照评论建议。

如果您正在使用 logrotate.d,那么您可以通过在/etc/logrotate.d/目录中放置一个 conf 文件来选择下面所示的任何一个选项。

# 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
}

请注意,copy truncate 会备份当前日志的副本,然后清除日志文件以便继续写入。另一种方法是使用 create,它将通过重命名当前文件,然后创建与旧文件同名的新日志文件来执行轮换。除非您知道需要创建,否则使用复制截断 我强烈建议。原因是,即使旧日志文件的名称已经更改,Rails 可能仍然会继续指向旧日志文件,而且可能需要重新启动才能找到新的日志文件。Coptruncate 通过保持与活动文件相同的文件来避免这种情况。

允许使用 Rails logglier 将日志发送到日志记录器,如下所示,位于我的 Environment/production.rb 文件中。 Rails 版本是4.1

RailsApplication::Application.configure do
require 'logglier'
config.logger = Logglier.new(<https://logs-01.loggly.com/inputs/inputkey>)
log.info("hello from logglier")
end

对于 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 日志,Rpush 日志,..。 您可以在您的服务配置文件中这样使用:

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

它的意思是: 分割后只保存1个以前的日志文件。 主日志大小从不超过20MB。

对于 铁路5,如果您想要每天进行日志旋转,您只需要:

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

根据 文件,你可以使用 dailyweeklymonthly