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访问/错误日志(我在乘客下运行我的应用程序).
我只使用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个旋转日志.
我们最近不得不处理这个问题,并意识到 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)
| 归档时间: |
|
| 查看次数: |
7959 次 |
| 最近记录: |