为rails应用程序旋转日志的最佳方法是什么

Rog*_*ger 15 logging ruby-on-rails

我有一个来自slicehost的1GB片段,我在该盒子上运行了4个项目.所有4个应用程序都是ruby on rails应用程序.我想知道什么是确保日志文件旋转的最佳方法.

我希望每个应用程序有一个4个不同的日志文件,而不是所有4个应用程序都有一个大的日志文件.

我正在运行ubuntu.

我正在跑客.

Bil*_*ner 16

我也使用logrotate(你必须通过apt-get安装).在/etc/logrotate.d/目录中创建一个新的logrotate文件.这是我的一个例子:

# for the rails logs
/home/apps/*/shared/log/*log {
  daily
  rotate 14
  notifempty
  missingok
  compress
  sharedscripts
  postrotate
    /usr/bin/touch /home/apps/application1/current/tmp/restart.txt
    /usr/bin/touch /home/apps/application2/current/tmp/restart.txt
  endscript
}
# for the apache logs
/home/apps/logs/*log {
  daily
  rotate 14
  notifempty
  missingok
  compress
  sharedscripts
  postrotate
    /etc/init.d/apache2 restart
  endscript
}
Run Code Online (Sandbox Code Playgroud)

这会旋转rails production.log日志和apache访问/错误日志(我在乘客下运行我的应用程序).


Gab*_*ley 5

我只使用rails logger提供的内置旋转:

# in config/application.rb
config.logger = Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 3, 10.megabytes)
Run Code Online (Sandbox Code Playgroud)

这将在日志文件达到10MB时旋转它们并保存最近的3个旋转日志.

  • 使用Logger而不是默认的BufferedLogger的唯一问题是,如果您在应用服务器中使用多个进程/线程(Passenger,Unicorn ......除了Webrick之外的任何东西),消息将交错. (2认同)

Shy*_*ada 5

我们最近不得不处理这个问题,并意识到 logrotate不是最好的解决方案。使用它需要在每次轮换日志时重新启动 rails 应用程序,这似乎是不必要的性能损失。

更好的解决方案是覆盖应用程序配置文件中的默认 rails 记录器。

# in config/environments/development.rb
config.logger = Logger.new("#{Rails.env}.log", "daily")
Run Code Online (Sandbox Code Playgroud)

然后使用一个脚本来清理超过 n 天的文件。如果您愿意,您可以在这部分使用 logrotate。我们使用 rake 任务,例如,

desc "Cleanup application logs older than 30 days"
task :logs => :environment do
  require 'fileutils'
  Dir.glob("#{Rails.root}/log/*.log.*").
    select{|f| File.mtime(f) < (Time.now - (60*60*24*30)) }. # older than 30 days
    each { |f| 
      puts "Removing #{f}"
      FileUtils.rm f 
    }
end
Run Code Online (Sandbox Code Playgroud)

  • `logrotate` `copytruncate` 选项允许就地截断原始日志文件,从而确保在轮换日志时 rails 服务器可以继续写入日志。所以没有必要为了日志轮换而重启rails。 (5认同)