我有一个来自Slicehost的1GB切片,并且在该服务器上运行了4个项目。所有4个应用程序都是Ruby on Rails应用程序。我想知道确保日志文件轮换的最佳方法是什么。
我希望有4个不同的日志文件,每个应用程序对应一个,而不是一个包含所有4个应用程序日志的大日志文件。
我正在运行Ubuntu操作系统。
我正在运行Passenger。
我有一个来自Slicehost的1GB切片,并且在该服务器上运行了4个项目。所有4个应用程序都是Ruby on Rails应用程序。我想知道确保日志文件轮换的最佳方法是什么。
我希望有4个不同的日志文件,每个应用程序对应一个,而不是一个包含所有4个应用程序日志的大日志文件。
我正在运行Ubuntu操作系统。
我正在运行Passenger。
我也使用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
}
这会旋转Rails的production.log日志和Apache的访问/错误日志(我在Passenger下运行我的应用程序)。
我会建议您使用Rails Logger提供的内置旋转功能:
# in config/application.rb
config.logger = Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 3, 10.megabytes)
当日志文件达到10MB时,这将会轮替日志文件并保存最近的3个轮替日志。
# in config/environments/development.rb
config.logger = Logger.new("#{Rails.env}.log", "daily")
然后使用一个脚本清理 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
logrotate
的 copytruncate
选项允许原始日志文件进行原地截断,从而确保在旋转日志时 Rails 服务器可以继续写入日志。因此,在进行日志轮换时无需重启 Rails。 - Prakash Murthyapachectl graceful
会产生明显的性能影响吗? - timurblib/tasks
文件夹中吗? - ltdevlogrotate
是许多操作系统的标准包,如果您还没有安装,可以使用apt-get install logrotate
命令进行安装。您可以强制它按照您想要的计划旋转任何日志,并使用不同的策略(如每个文件“gzip 7天然后删除”)。/etc/logrotate.d
。以下是我的Capistrano安装步骤。我将其复制到部署文件中,并在创建应用程序的服务器环境或日志轮换配置更改时运行它。
namespace :setup do
task :install_logrotation, :roles => :app do
logrotate = <<-BASH
#{shared_path}/log/*.log {
daily
missingok
rotate 30
compress
size 5M
delaycompress
sharedscripts
postrotate
#{signal_unicorn("USR1")}
endscript
}
BASH
tmpfile = "/tmp/#{application}.logrotate"
put(logrotate, tmpfile)
run "#{sudo} chown root:root #{tmpfile} && #{sudo} mv -f #{tmpfile} /etc/logrotate.d/#{application}"
end
end
signal_unicorn
会执行"#{sudo} kill -s #{signal} cat #{unicorn_pid}
"命令。USR1信号会告诉它重新加载所有文件,因此它将附加到新的日志文件中。如上所述,为了避免需要重新启动应用程序,您可以使用以下完整的logrotate配置:
/etc/logrotate.d/rails
<path_to_rails_app>/log/*.log {
daily
size 100M
missingok
notifempty
rotate 4
compress
delaycompress
copytruncate
nodateext
}
ActiveSupport::Logger
是根据 Rails General Configuration 的默认记录器。
这将为每个512兆字节轮换日志文件,并保留最新的50个文件。
config.logger = ActiveSupport::Logger.new(Rails.root.join('log', "#{Rails.env}.log"), 50, 512 * 1024 * 1024)