Rails Log

本文总结一下 rails 中的日志相关知识点, 如日志输出, 设置日志等级, 创建新日志, 设置日志格式的方法.

输出日志

通过使用 logger 对象从 Controller, Model, View 输出日志到输出目的地:

logger.debug "输出debug级别的日志"
logger.fatal "输出致命错误信息"
logger.error "输出错误信息"
logger.warn "输出警告"
logger.info "输出通知信息"

在其它 lib 中如果要输出日志需要使用 Rails.logger.info 之类的写法。

设定日志级别

5种日志的意义

fatal # 程序错误, 无法进行错误处理的
error # 可以处理的错误
warn # 警告
info # 系统运行信息
debug # 方便开发者的详细信息

显示日志

以上几种日志的优先级 fatal > error > warn > info > debug

rails 中可以在 config/development.rb, config/test.rb, config/production.rb 中针对这三种不同的环境设定日志级别.

# fatal > error > warn > info > debug
# 优先级低于warn的不会被显示
config.log_level = :warn

改变显示日志的级别

如果临时需要显示warn以下等级的日志info debug等, 可以这样:

class UsersController < ApplicationController
  def index
    Rails.logger.level = Logger::DEBUG # Rails.logger.level = 0 也行
  end
end

各个环境默认显示日志的级别

development # => debug
test # => debug
production # => info

设定日志格式

默认的日志格式

# config/RAILS_ENV.rb
config.logger.formatter = ::Logger::Formatter.new
# 输出
D, [2015-02-25T14:24:39.780844 #24934] DEBUG -- :

自定义日志格式

config.logger.formatter = proc do |severity, datetime, progname, msg|
 "[#{severity}]#{datetime}: #{progname} ---- #{msg}\n"
end
# 日志内容
[INFO]2015-02-25 14:33:59 +0800: ---- Started GET "/assets/application-0019"

Log Tags

config.log_tags = [:uuid, :remote_ip, lambda { |req| Time.now }]
# 日志内容
Started GET "/" for 127.0.0.1 at 2012-04-23 21:39:58 +0100
[f069842f0099b8063d1549771b6b9645] [127.0.0.1] [2012-04-23 21:39:58 +0100] Processing by ArticlesController#index as HTML

生成新 logger

可以指定日志输出文件, 可以在 config/development.rb、config/test.rb、config/production.rb 进行如下配置:

# 输出日志到log/development.log.yyyyMMdd 中, 每天的日志输出到当日的文件中
config.logger = Logger.new('log/development.log', 'daily')
# 配置第二个输出文件
config.special_logger = Logger.new('log/development_specail.log', 'daily')

日志的输出:

logger.debug "log/development.log"
Rails.application.config.special_logger.debug "log/development_special.log输出"

Formatting Log Output

如果想自定义更复杂的输出格式,只能自己新建一个文件覆盖 Logger::SimpleFormatter 方法了。

# /config/initializers/log_formatter.rb
class Logger::SimpleFormatter
  def call(severity, time, progname, msg)
    "[#{severity}] #{msg}\n"
  end
end

如果觉得我的文章对您有用,请在支付宝公益平台找个项目捐点钱。 @Victor Feb 26, 2015

奉献爱心