【发布时间】:2016-03-23 21:45:06
【问题描述】:
我正在研究记录操作,例如,当您创建一个新用户时,它会将其发送到记录器等。所以每个操作都会被记录下来。我可以看到 logger.info 如何将信息发送到 development.log 文件中。
我想知道如何设置不同的文件,例如users.log,然后当我记录一行或变量时,它会保存在该日志文件而不是 development.log 中?
【问题讨论】:
标签: ruby-on-rails ruby logging
我正在研究记录操作,例如,当您创建一个新用户时,它会将其发送到记录器等。所以每个操作都会被记录下来。我可以看到 logger.info 如何将信息发送到 development.log 文件中。
我想知道如何设置不同的文件,例如users.log,然后当我记录一行或变量时,它会保存在该日志文件而不是 development.log 中?
【问题讨论】:
标签: ruby-on-rails ruby logging
Ruby 在其标准库中有一个Logger 类:http://ruby-doc.org/stdlib-2.1.0/libdoc/logger/rdoc/Logger.html
您将实例化它并将新日志文件的文件路径传递给它,如下所示:
user_log = File.open('logs/users.log', File::WRONLY | File::APPEND)
您可以将它放在您的控制器可以使用的控制器方法中。第一个字符串参数是日志文件的路径,以下是打开文件仅用于写入和追加(以便将每个日志行添加到日志中,而不是每次都覆盖它)。
您可以通过设置格式化程序来自定义每个日志行的格式:
user_log.formatter = proc { |severity, datetime, progname, msg|
"#{severity}, #{datetime}, #{progname}, #{msg.dump}"
}
【讨论】:
可以指定config文件中使用的文件路径,根据环境不同,如下:
config.paths.log = "/some/path/#{Rails.env}.log"
如果您想为每个模型创建不同的日志文件,您可以在需要时简单地创建一个记录器对象,如this answer 中所述。
但是,如果您只是想根据生成的位置以某种方式标记不同的日志,则使用标记日志记录可能更容易:
logger = ActiveSupport::TaggedLogging.new(Logger.new(STDOUT))
logger.tagged("BCX") { logger.info "Stuff" } # Logs "[BCX] Stuff"
logger.tagged("BCX", "Jason") { logger.info "Stuff" } # Logs "[BCX] [Jason] Stuff"
logger.tagged("BCX") { logger.tagged("Jason") { logger.info "Stuff" } } # Logs "[BCX] [Jason] Stuff"
【讨论】: