Ruby on Rails生产日志轮换


172

在Ruby on Rails生产应用程序上启用日志循环的最佳方法是什么?

是通过在托管服务器上使用logrotate还是在从应用程序初始化记录器时使用一组选项?


我看到已经有了答案,但是我想问一下您的环境是什么。我自己使用syslog + logrotate方法,但是显然,这种环境(无论是专用的,共享的; * ix OS托管的是哪种类型,还是其他的,等等)在这里都有一定的意义。
ylluminate 2014年

Answers:


203

选项1:syslog + logrotate

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

config / environments / production.rb中的示例。

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

这样,您可以登录syslog,并可以使用默认的logrotate工具来旋转日志。

选项2:正常的Rails日志+ 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应用程序。

编辑:删除了“共享脚本/结束脚本”,因为此处未使用它们,并且根据注释会导致问题。并create 640 root adm根据评论建议删除。


3
为了使用logrotate,应该将config / environments / production.rb中的“ config.logger = SyslogLogger.new”行保留为注释,还是不对其进行注释?
robertwbradford 2011年

2
它应该保持注释状态,以便将日志文件写入(例如):/var/www/myrailsapp/current/log/production.log
Luca Spiller

3
如果使用该logrotate解决方案,则值得@ amit-saxena回答-建议使用copytruncateover create指令。
汤姆·哈里森

3
当您使用copytruncatecreate有没有效果,所以你应该从你的例子大概删除
迈克尔Witrant

3
您可能还需要su your_rails_user your_rails_group在日志文件的所有者和组(即,Rails / Passenger进程的日志文件的所有者和组)或logrotate(的最新版本?)中添加一行内容。
oseiskar,2014年

56

如果您使用的是logrotate,则可以通过将conf文件放置在/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
}

要么

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

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


但是我不应该在每次logrotate运行时重新启动rails吗?
lzap 2012年

2
创建副本后,将原始日志文件截断到位,而不是移动旧日志文件并有选择地创建一个新日志文件,当某些程序无法告知其关闭其日志文件并因此可能继续写入(追加)到永远是以前的日志文件。请注意,复制文件和截断文件之间的时间间隔非常短,因此可能会丢失一些记录数据。使用此选项时,创建选项将无效,因为旧的日志文件将保留在原位。
lzap 2012年

1
如果使用copytruncate,则无需重新启动Rails,因为它仍然指向同一日志文件。
amit_saxena 2012年

该配置是否要求您说明何时旋转日志?例如“每周”或“大小= 20M”?或者,如果您只想手动运行logrotate,您可以忽略吗?
Damainman

1
我不确定我是否正确理解了您的问题,但是您需要指定自动日志轮换的条件。如果您不希望它是自动的,请不要将文件放在/etc/logrotate.d/目录中,并将其保留在其他位置。然后logrotate --force $CONFIG_FILE,您可以通过指定配置文件位置来运行以手动运行它。
amit_saxena 2013年

31

对于Rails 5,这是我必须做的,以限制日志大小并且不更改控制台中的服务器输出:

根据文档,如果要限制日志文件夹的大小,请将其放入环境文件(“ development.rb” /“ production.rb”)中。

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

这样,您的日志文件将永远不会超过50Mb。您可以根据自己的喜好更改大小。第二个参数中的“ 1”表示将保留1个历史日志文件,因此您将拥有多达100Mb的日志-当前日志和前一个50Mb块。

此解决方案的来源


2
简单来说,第一个参数是文件名,即“ log / development.log”。因此,我希望使用更长但透明的方式。而不是config.paths['log'].first我把Rails.root.join('log', "#{Rails.env}.log")
米哈伊尔Chuprynski

1
@ZiaUlRehmanMughal是的,它与Rails 4一起使用。我正在使用Rails 4.2.3,并具有以下配置: config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20*1024*1024)
ThienSuBS

1
为了使它更易于阅读,值得一提的是,您可以依赖ActiveSupport字节扩展名:50.megabytes与相同50 * 1024 * 1024,但更容易理解。有关更多详细信息,请参见ActiveSupport核心扩展
Pierre-Adrien Buisson,

1
经过一番谷歌搜索后再次回到这里(程序员生活:D)。我想知道是否可以配置此行来轮换日志文件夹中的所有日志文件?显然,这条线只会旋转第一行。
Zia Ul Rehman Mughal

请注意,这只会旋转您的log / production.log文件,因为它Rails.application.config.paths['log'].first恰好返回此文件
瓦拉基


2

对于每个日志:Rails日志,Rpush日志,...您可以在服务的配置文件中像这样使用:

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

这意味着:拆分后仅保存1个先前的日志文件。主日志大小永远不会超过20 MB。


-9

启用在我的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

请建议我该怎么做...此代码不起作用
riya khana 2014年

Rails版本是4.1.0,Ruby版本是2.1.1
riya khana 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.