本文总结一下 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"
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输出"
如果想自定义更复杂的输出格式,只能自己新建一个文件覆盖 Logger::SimpleFormatter
方法了。
# /config/initializers/log_formatter.rb
class Logger::SimpleFormatter
def call(severity, time, progname, msg)
"[#{severity}] #{msg}\n"
end
end