很多 Ruby 项目一开始直接使用默认日志输出,但一旦进入排错、审计或集中分析阶段,默认格式往往不够用。下面就用标准库 Logger 说明,如何在不引入额外依赖的前提下,自定义日志格式,并判断一套输出是否足够适合你的日常调试和后续分析。
为什么要自定义日志格式
日志不只是“把信息打印出来”这么简单。在实际开发中,日志通常承担三类任务:定位故障、观察运行状态、为后续分析保留线索。
如果默认日志格式缺少时间、级别或消息结构不统一,排查问题时就会比较吃力。自定义格式的价值,主要体现在以下几点:
- 让时间、级别、消息顺序固定,便于人工阅读;
- 让不同模块输出风格一致,方便检索和筛选;
- 为后续接入日志分析工具保留更清晰的结构基础。
Ruby 标准库 Logger 能做什么
Ruby 标准库中的 Logger 类本身就支持常见日志场景。默认情况下,它提供多种日志级别,例如 DEBUG、INFO、WARN、ERROR,并按照内置格式输出日志。
如果你只是需要控制输出内容的结构,而不是更换整套日志方案,那么直接基于 Logger 做定制,通常已经够用。
先创建 Logger 实例
第一步是创建一个 Logger 实例,并指定日志写入的位置。可以输出到标准输出,也可以写入文件。
require 'logger'
# 创建一个新的 Logger 实例
logger = Logger.new(STDOUT)
# 或者将日志输出到文件
logger = Logger.new('logfile.log')
开发环境里,输出到 STDOUT 更适合直接观察;如果需要持久化保存,再切换到文件即可。
设置日志级别
Logger 支持设置最低记录级别,低于该级别的内容不会写入日志。这一步决定了你会保留多少运行细节。
logger.level = Logger::DEBUG # 记录所有级别的日志
例如把级别设为 Logger::DEBUG,就能记录更完整的调试信息;如果线上环境更关注稳定性和错误定位,则通常会根据需求提高级别。
如何通过 formatter 自定义输出格式
真正控制日志长什么样的,是 formatter 属性。它负责把一条日志事件转换成最终输出的字符串。

默认情况下,Logger 使用 Logger::Formatter。如果默认结构不符合需要,可以直接替换成自定义的 proc:
logger.formatter = proc do |severity, datetime, progname, msg|
"#{datetime.strftime('%Y-%m-%d %H:%M:%S')} [#{severity}] #{msg}n"
end
这里的 proc 接收四个参数:
severity:日志级别,例如INFO、ERROR;datetime:当前日志的时间戳;progname:程序名或模块标识;msg:实际要记录的消息内容。
在这个例子里,格式化逻辑做了三件事:把时间统一成 %Y-%m-%d %H:%M:%S,把日志级别包在方括号中,再把消息正文接在后面。最终输出会更接近人工排查时习惯阅读的样子。
示例格式长什么样
如果希望日志输出为下面这种形式:
2023-10-10 14:30:55 [INFO] 用户登录成功
那么上面的 formatter 写法就可以直接实现这一目标:
logger.formatter = proc do |severity, datetime, progname, msg|
"#{datetime.strftime('%Y-%m-%d %H:%M:%S')} [#{severity}] #{msg}n"
end
这种格式的优点是非常直接:先看时间,再看级别,最后看具体事件,适合命令行查看和文本检索。
配置完成后怎么记录和检查日志
当 Logger 实例、日志级别和 formatter 都配置完成后,就可以像平常一样写日志:

logger.info "用户登录成功" logger.error "数据库连接失败"
对应输出如下:
2023-10-10 14:30:55 [INFO] 用户登录成功 2023-10-10 14:30:55 [ERROR] 数据库连接失败
检查是否配置成功时,可以重点看三件事:时间格式是否统一、日志级别是否按预期显示、消息正文是否完整可读。只要这三项稳定,后续无论是人工排障还是接入分析工具,都会更省事。
适合什么场景,结论是什么
对于大多数 Ruby 应用来说,直接基于标准库 Logger 自定义 formatter,已经能覆盖相当一部分日志格式需求。它的好处是实现简单、依赖少,而且可以精确控制输出结构。
如果你的目标是把日志整理成统一、易读、便于定位问题的文本格式,这种做法已经足够实用。判断标准也很明确:看日志时能不能快速读出时间、级别和事件本身,检索时能不能稳定筛出你关心的记录。







