Ruby 中如何自定义日志消息的格式?
Ruby 的 Logger 类通过设置 formatter(proc)自定义日志格式,可控制时间格式、级别、消息排版。本文给出完整示例及常用格式字段说明。
Ruby 标准库 Logger 的日志格式通过 logger.formatter = proc { |severity, datetime, progname, msg| ... } 自定义——proc 接收四个参数,返回的字符串就是每条日志的最终样子。
完整示例
require 'logger'
logger = Logger.new('application.log')
# 自定义格式
logger.formatter = proc do |severity, datetime, progname, msg|
"#{datetime.strftime('%Y-%m-%d %H:%M:%S')} [#{severity}] #{msg}\n"
end
logger.level = Logger::INFO
logger.debug("调试信息") # 级别低于 INFO,不会输出
logger.info("普通信息") # 输出: 2024-01-15 10:30:00 [INFO] 普通信息
logger.error("错误信息")
formatter 的四个参数
| 参数 | 含义 |
|---|---|
severity |
级别字符串(DEBUG/INFO/WARN/ERROR/FATAL) |
datetime |
时间对象,用 strftime 格式化 |
progname |
程序名(调用时传入,可为 nil) |
msg |
日志消息内容 |
输出 JSON 格式
结构化日志更利于日志系统解析:
require 'json'
logger.formatter = proc do |severity, datetime, progname, msg|
{ time: datetime, level: severity, message: msg }.to_json + "\n"
end
观测云对照
采集 Ruby 应用日志时,观测云 DataKit 支持直接采集文件日志;如果日志是 JSON 格式,Pipeline 可以直接提取字段(时间、级别、消息),无需再写 grok 规则,检索和告警都更方便。
常见问题(FAQ)
Q:如何同时输出到文件和控制台?
A:Logger 只接收一个 IO。可以创建两个 logger,或用第三方库(如 logging gem)支持多目的地。
Q:日志文件太大怎么办?
A:Logger.new('app.log', 'daily') 按天轮转,或 Logger.new('app.log', 10, 100.megabytes) 按大小保留 10 个文件。
Q:Rails 里怎么自定义格式?
A:Rails 有自己的日志体系,在 config/environments/production.rb 中设置 config.log_formatter,或使用 lograge gem 输出结构化日志。