Logger详解

作者:周星 发布:2017-10-07

       今天来给大家分享一下 Rails 中的 Logger,可能在一些 Rails 开发者的眼里,Logger 无非是创建一个文件,然后在需要记录日志的地方 logger.info 一下字符串信息,如果您也这样认为,那我们真的应该一起来学习一下 Logger 了。

       Logger 在运行时保存信息到日志文件里,而且会默认根据运行环境来区分写到哪个日志中,比如大家都懂的 development.log 和 production.log,你可以在 controller 、model、mailer,当然还有出现频露更高的 rake 里记录日志,通过记录日志,我们可以方便的看到程序出现的问题、操作的流程、记录的信息等一些不常规的动作。那么什么是 Logger 呢?我们使用的 Logger 实际上是使用了 ActiveSupport::Logger 类来写日志信息,当然你也可以通过配置使用其它的工具比如 Log4r,首先我们看如何创建一个 Logger:

filename  = File.join(Rails.root, 'log', "study.log")
logger     = Logger.new(filename)

       这样我们就创建了一个 logger,通过执行写入方法,每个信息都会写在 study.log 文件里,默认情况下每个 log 文件都会创建在 Rails.root/log 目录下,不过你也可以根据需求放在 Rails.root/tmp 目录下。

       我们平时经常使用 logger.info 来写日志,但是 Logger 提供了很多种写入的方法,这个时候我们就要引入一个概念:日志级别,你可以先找一个项目,打开 console,执行下面的代码,来看一下当前日志的级别:

irb(main):003:0* Rails.logger.level
=> 0

       Logger 的级别一共有 6 种,从0到5分别为: :debug, :info, :warn, :error, :fatal 和 :unknown,在所有的环境下,Logger 的默认级别都是 debug,如果你想改变它,你需要在对应的 environment 配置文件下手动修改:

config.log_level = :warn
# 重新开一个 console
irb(main):001:0> Rails.logger.level
=> 2

       这个时候你可能会好奇,配置这玩意儿有什么用呢?Rails 只会写级别大于等于配置的级别 log,咦,好像有点抽象,那我们接着上面的例子好了,我们手动把日志级别改为 warn,然后再开一个窗口,tail -f 一下 development.log,好,我们在 console 里执行一下 Rails.logger.info "xxxx",看看 development.log 的变化

# 在 console 里执行
irb(main):007:0* Rails.logger.info "xx"
=> true

development.log 没有任何输出对不对?!我们改变一下写入的方法:

irb(main):010:0* Rails.logger.warn "xx"
=> true

       development.log 里是不是打印出了 xx,这就是因为我们配置的日志级别为 warn,但是 info 的级别低于 warn,所以 info 方法写不进去;而 warn 等于日志级别,所以写进去了,你可以试一下 error 方法可否写日志进去,赶快到 console 里执行 Rails.logger.error "error" 吧。试过之后千万别忘了把日志级别改回来。

       当你的应用多用户操作时,你可能需要使用一些规则来区分这些记录的信息,比如区分哪些是 zhouxing 记录的,哪些是 jerry 记录的,哪些是 zhongfox 记录的,或者区分哪些来自于 google.com,哪些来自于 twitter.com,ActiveSupport 里的 ToggledLogging 帮助我们完美的解决了这一问题,来看下面的例子:

logger = Rails.logger
logger.tagged("zhouxing") { logger.warn "I am zhouxing" }
# [zhouxing] I am zhouxing
logger.tagged("zhouxing", "jerry") { logger.info "we are zhouxing and jerry" }
# [zhouxing] [jerry] we are zhouxing and jerry
logger.tagged("zhongfox") { logger.tagged("jerry") { logger.info "They are ..." } }
[zhongfox] [jerry] They are ...

       好吧,例子已经清晰到不需要我讲什么了,就是 tagged 方法,它的使用方法例子中也很详细了,嗯,关于它我不说什么了。

       既然是记录日志文件,尤其是往硬盘里写,那么一个避免不了的问题就是性能了,虽然日志这点东西在现在动则几百G硬盘、I7CPU、16G内存的计算机上已经不算什么了,但是我们还是应该了解它

       首先,使用 :debug 级别来记录日志会产生更大的性能问题,因为它会产生更多的字符串,另外一个隐藏的问题是,你可能会这样记录日志:

logger.debug "Person attributes hash: #{@person.attributes.inspect}"

       上面的例子的问题是,即使 :debug 级别不在允许写入日志的范围内,它还是会造成性能问题,因为 ruby 会执行这个字符串,并且内插变量,这会耗费一定的时间,因此你最好在记录日志时加上一个 block,这样只有当写入的方法级别大于等于日志级别时才会执行 block,所以,上面的方法你可以这么写:

logger.debug {"Person attributes hash: #{@person.attributes.inspect}"}

可能这不会节省太多的消耗,但是这是 best practise,你应该习惯它。

如果你不知道 tail -f,请务必 google。

如果您对本文有什么意见或建议,请联系博主。

支付宝扫码赞助博主


评论(0)