Ruby on Rails生产日志轮换

cni*_*aou 166 logging ruby-on-rails production-environment

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

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

ber*_*kes 201

选项1:syslog + logrotate

您可以配置rails,以使用系统日志工具.

config/environments/production.rb中的一个示例.

# Use a different logger for distributed setups
config.logger = SyslogLogger.new
Run Code Online (Sandbox Code Playgroud)

这样,您就可以登录到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
}
Run Code Online (Sandbox Code Playgroud)

根据下面的建议,在Rails中建议使用copytruncate,以避免重新启动Rails应用程序.

编辑:删除"sharedscripts/endscript",因为它们在这里没有使用,并根据评论引起问题.并create 640 root adm根据评论建议删除.

  • 为了使用logrotate,config/environments/production.rb中的"config.logger = SyslogLogger.new"行是否仍然被注释掉,还是应该取消注释? (3认同)
  • 如果使用`logrotate`解决方案,值得@ amit-saxena的回答 - 建议在`create`指令上使用`copytruncate`. (3认同)
  • 它应该保持注释掉,以便日志文件写入(例如):/ var/www/myrailsapp/current/log/production.log (2认同)
  • 当你使用`copytruncate`时,`create`没有效果,所以你应该从你的例子中删除它 (2认同)
  • 您可能还需要添加"su your_rails_user your_rails_group"行以及日志文件的所有者和组(即Rails/Passenger进程的那些)或(最新版本的?)logrotate可能会抱怨权限. (2认同)
  • 测试您的 logrotation 文件是个好主意,这样您就可以查看它是否抛出任何错误:`sudo logrotate -f /etc/logrotate.d/rails_example_com`。这样我发现我必须像oseiskar建议的那样添加“surails_userrails_user_group”。 (2认同)

ami*_*ena 55

如果您使用的是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
}
Run Code Online (Sandbox Code Playgroud)

要么

# Rotate Rails application logs weekly
/path/to/your/rails/applicaton/log/*.log {
  weekly
  missingok
  rotate 52
  compress
  delaycompress
  notifempty
  copytruncate
}
Run Code Online (Sandbox Code Playgroud)

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

  • 在创建副本后截断原始日志文件,而不是移动旧日志文件并可选地创建新日志文件,当某些程序无法被告知关闭其日志文件时可以使用它,因此可以继续写入(追加)到以前的日志文件永远.请注意,复制文件和截断文件之间的时间间隔非常短,因此某些日志数据可能会丢失.使用此选项时,create选项将不起作用,因为旧的日志文件保持不变. (2认同)

Fel*_*ger 29

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

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

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

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

来源于此解决方案.

  • 第一个参数是文件名,简单地说,即'log/development.log'。所以我更喜欢更长但透明的方式。而不是`config.paths['log'].first`我会放`Rails.root.join('log', "#{Rails.env}.log")` (2认同)
  • 为了使这更容易阅读,值得一提的是,您可以依赖 ActiveSupport 字节扩展:`50.megabytes` 与 `50 * 1024 * 1024` 相同,但更容易理解。有关更多详细信息,请参阅 [ActiveSupport 核心扩展](https://edgeguides.rubyonrails.org/active_support_core_extensions.html#bytes)。 (2认同)

Rae*_*nha 6

对于Rails 5,如果你想要每日日志轮换,你只需要这个:

  config.logger = ActiveSupport::Logger.new(config.paths['log'].first, shift_age = 'daily')
Run Code Online (Sandbox Code Playgroud)

根据文档,您可以使用daily,weeklymonthly


Thi*_*uBS 5

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

 config.log_file = 'log/rpush.log'
 config.logger = ActiveSupport::Logger.new(config.log_file, 1, 20.megabytes)
Run Code Online (Sandbox Code Playgroud)

意思是:分割后只保存之前的1个日志文件。主日志大小永远不会超过 20 MB。