Ruby 自带的 Logger 并不复杂,但真正写进项目时,开发者通常会卡在几个具体问题上:日志该输出到哪里、该保留哪些级别、格式要不要改、文件变大后怎么处理。下面按这些实际场景展开,带你把 Logger 的基础能力和常见配置一次理清。
看完后,你可以判断什么时候只用默认配置就够了,什么时候需要调整日志级别、自定义格式,或者给长期运行的程序加上日志滚动策略。
Logger 是什么,适合解决什么问题
在 Ruby 中,Logger 是标准库提供的日志工具,用来记录程序运行过程中的关键信息。它既能帮助你排查错误,也适合保留程序状态、重要操作和异常上下文,方便后续维护。
和随手写 puts 相比,Logger 的优势在于:它有明确的日志级别、有统一的输出格式,也能把日志写到文件或终端,适合逐步演变为正式项目中的日志方案。
先理解日志级别:哪些消息会被记录
Logger 支持多种日志级别,当前级别会决定“哪些消息能被写出去”。默认规则是:记录所有等于或高于当前设置级别的消息。

- DEBUG:最详细的调试信息,适合开发和排错阶段。
- INFO:常规运行信息,用来描述系统正常状态。
- WARN:警告信息,表示出现了风险信号,但程序通常还能继续执行。
- ERROR:错误信息,表示发生了明确失败。
- FATAL:致命错误,通常意味着程序无法继续运行。
如果你的程序只想保留错误和更严重的问题,可以把级别调高到 Logger::ERROR:
logger.level = Logger::ERROR
这样一来,DEBUG、INFO 和 WARN 都不会被记录,日志量会明显减少。
如何创建 Logger 并开始写日志
创建实例
创建一个 Logger 实例最直接的方式,就是调用 Logger.new 并传入日志文件路径:
logger = Logger.new("app.log")
这会把日志写入 app.log。如果不传文件路径,日志通常会输出到标准输出设备,也就是终端。
记录不同级别的消息
实例创建好以后,就可以直接调用对应方法写日志。常见方法包括 debug、info、warn、error 和 fatal:

logger.debug "This is a debug message."
logger.info "The system has started."
logger.warn "Low disk space detected."
logger.error "Failed to open file: #{file_path}"
logger.fatal "An unexpected error occurred: #{e.message}"
这类写法的好处是,业务语义比较清楚。后续你查看日志时,可以很快区分这是普通状态、风险提示,还是已经影响运行的错误。
默认格式不够用时,怎么自定义输出格式
默认情况下,Logger 会带上时间戳、日志级别和消息内容。如果你希望日志格式更贴合团队习惯,或者方便后续采集处理,可以通过 formatter 自定义输出。
logger.formatter = proc do |severity, datetime, progname, msg|
"#{datetime}: [#{severity}] - #{msg}n"
end
这段示例展示了自定义格式的基本方式:severity 表示级别,datetime 表示时间,msg 是日志正文。实际使用时,你通常会根据排查需要决定保留哪些字段。
需要注意的是,上面代码里的结尾是 n,这是源文示例中的原样写法。实际项目中如果希望换行,通常会写成换行符形式。
进阶配置:多输出目标与日志滚动
同时输出到终端和文件
有些场景下,你可能既想在终端实时查看日志,又想把日志持久化到文件。源文给出的示例如下:
// www.ja vascriptcn.com code example
logger = Logger.new(STDOUT)
logger.formatter = proc { |*args| args.join(' ') }
file_logger = Logger.new("app.log")
file_logger.formatter = proc { |*args| args.join(' ') }
multi_logger = Logger::LogDevice.new(nil, shift_age: nil)
multi_logger << logger
multi_logger << file_logger
multi_logger.info "Logging to multiple devices."
从思路上看,这段代码想表达的是“把同一份日志同时发往多个输出目标”。对读者来说,重点不在记住每一行,而在理解多目标输出的用途:一份给开发者实时观察,一份留给文件归档和故障追踪。
给长期运行程序加上日志滚动
如果应用会持续运行,日志文件很容易不断膨胀,最终占满磁盘空间。这时就需要启用日志滚动,让旧日志按周期或大小自动切换。
logger = Logger.new("app.log", shift_age: 'daily', shift_size: 10485760)
按照源文说明,这个配置表示日志文件每天滚动一次,并将单个文件大小限制在 10485760 字节,也就是 10MB。
对服务端程序、定时任务和后台处理脚本来说,这类设置很实用。它能在不改变业务逻辑的前提下,降低日志无限增长带来的维护成本。
实际使用时,优先把这几件事配好
如果你准备把 Logger 用到真实项目里,建议先完成这几项基础配置:
- 根据环境设定日志级别,开发环境可以更详细,生产环境避免无意义噪音。
- 确定输出位置,是只打到终端,还是同时写入文件。
- 根据排错需求决定是否自定义格式,尤其是时间、级别和错误上下文。
- 对长期运行程序启用日志滚动,避免日志文件持续膨胀。
做到这一步,Logger 就已经能覆盖大多数 Ruby 项目的基础日志需求。
总结
Ruby 的 Logger 胜在开箱即用,同时又保留了足够的配置空间。入门时先掌握实例创建、日志级别和消息记录,基本就能满足调试与日常维护;等项目进入长期运行阶段,再补上格式定制、多目标输出和日志滚动,会更符合生产环境的使用方式。







