Rails LogRotate 文件到另一个目录
Rails LogRotate files to another directory
我的应用程序中有一个 rails 自定义记录器。
class ApplicationController < ActionController::API
@@logger = nil
def custom_logger
return @@logger if @@logger
FileUtils.touch(Rails.root.join('log/custom.json'))
@@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily')
@@logger.level = Logger::INFO
@@logger.formatter = proc do |severity, datetime, progname, msg|
"#{msg}\n"
end
@@logger
end
end
在我的应用程序中,我可以使用
记录消息
custom_logger.info "My log message"
我的自定义日志消息和轮换的文件记录如下
- 路径 - /
/current/log
- 文件 - custom.json custom.json.20210712
这是我的要求
- 旋转的文件应该放在不同的位置,即 /
/current/log/archive/custom.json.20210712
- 旋转文件的名称也应该有小时和分钟,即我需要
custom.json.202107121020
而不是 custom.json.20210712
。格式 custom.json.{yyyyMMddHHmm,UTC}
我可以使用 Logger class 或任何其他记录器 gem 或通过继承 Logger class.
编写我自己的记录器 class
在实例化 Logger 时,第一个要求是 仅 将存档日志放在不同的路径中是不可能的。替代方法是使用 cronjob 或后台作业。
而且,更改文件名的第二个要求是通过在选项中传递 shift_period_suffix
键来实现。
@@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily', shift_period_suffix: "%Y%m%d%H%m, %Z")
发布第一个需求的解决方案。
记录器没有给我们提供将旋转文件添加到 archive
路径的方法。
所以在返回记录器对象之前,我正在检查目录中是否有旋转文件。如果它们存在,则将文件移动到存档路径。
class ApplicationController < ActionController::API
@@logger = nil
def custom_logger
rolled_files = Find.find(Rails.root.join('log').grep(/custom.json.[\d]{12}/)
mv_rolled_files(rolled_files) if !rolled_files.empty?
return @@logger if @@logger
FileUtils.touch(Rails.root.join('log/custom.json'))
@@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily')
@@logger.level = Logger::INFO
@@logger.formatter = proc do |severity, datetime, progname, msg|
"#{msg}\n"
end
@@logger
end
private
def mv_rolled_files(rolled_files)
# Move rotated files to an archive location.
end
end
我知道这不是一个有效的方法。在找到更好的方法之前,我将暂时采用当前方法。
我的应用程序中有一个 rails 自定义记录器。
class ApplicationController < ActionController::API
@@logger = nil
def custom_logger
return @@logger if @@logger
FileUtils.touch(Rails.root.join('log/custom.json'))
@@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily')
@@logger.level = Logger::INFO
@@logger.formatter = proc do |severity, datetime, progname, msg|
"#{msg}\n"
end
@@logger
end
end
在我的应用程序中,我可以使用
记录消息custom_logger.info "My log message"
我的自定义日志消息和轮换的文件记录如下
- 路径 - /
/current/log - 文件 - custom.json custom.json.20210712
这是我的要求
- 旋转的文件应该放在不同的位置,即 /
/current/log/archive/custom.json.20210712 - 旋转文件的名称也应该有小时和分钟,即我需要
custom.json.202107121020
而不是custom.json.20210712
。格式custom.json.{yyyyMMddHHmm,UTC}
我可以使用 Logger class 或任何其他记录器 gem 或通过继承 Logger class.
编写我自己的记录器 class在实例化 Logger 时,第一个要求是 仅 将存档日志放在不同的路径中是不可能的。替代方法是使用 cronjob 或后台作业。
而且,更改文件名的第二个要求是通过在选项中传递 shift_period_suffix
键来实现。
@@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily', shift_period_suffix: "%Y%m%d%H%m, %Z")
发布第一个需求的解决方案。
记录器没有给我们提供将旋转文件添加到 archive
路径的方法。
所以在返回记录器对象之前,我正在检查目录中是否有旋转文件。如果它们存在,则将文件移动到存档路径。
class ApplicationController < ActionController::API
@@logger = nil
def custom_logger
rolled_files = Find.find(Rails.root.join('log').grep(/custom.json.[\d]{12}/)
mv_rolled_files(rolled_files) if !rolled_files.empty?
return @@logger if @@logger
FileUtils.touch(Rails.root.join('log/custom.json'))
@@logger = Logger.new(Rails.root.join('log/custom.json'), shift_age = 'daily')
@@logger.level = Logger::INFO
@@logger.formatter = proc do |severity, datetime, progname, msg|
"#{msg}\n"
end
@@logger
end
private
def mv_rolled_files(rolled_files)
# Move rotated files to an archive location.
end
end
我知道这不是一个有效的方法。在找到更好的方法之前,我将暂时采用当前方法。