Ruby 中如何自定义日志消息的格式?

Ruby 的 Logger 类通过设置 formatter(proc)自定义日志格式,可控制时间格式、级别、消息排版。本文给出完整示例及常用格式字段说明。

最佳实践
Ruby 中如何自定义日志消息的格式?封面

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 输出结构化日志。

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台