class Logger

Logger 类提供一个简单但复杂的日志实用程序,您可以使用它为您的程序创建一个或多个 事件日志。每个这样的日志都包含一个按时间顺序排列的条目序列,用于记录程序的活动。

关于示例

此页面上的所有示例都假设已 require Logger

require 'logger'

概要

使用 Logger.new 创建日志

# Single log file.
logger = Logger.new('t.log')
# Size-based rotated logging: 3 10-megabyte files.
logger = Logger.new('t.log', 3, 10485760)
# Period-based rotated logging: daily (also allowed: 'weekly', 'monthly').
logger = Logger.new('t.log', 'daily')
# Log to an IO stream.
logger = Logger.new($stdout)

使用 Logger#add 添加条目(级别,消息)

logger.add(Logger::DEBUG, 'Maximal debugging info')
logger.add(Logger::INFO, 'Non-error information')
logger.add(Logger::WARN, 'Non-error warning')
logger.add(Logger::ERROR, 'Non-fatal error')
logger.add(Logger::FATAL, 'Fatal error')
logger.add(Logger::UNKNOWN, 'Most severe')

使用 Logger#close 关闭日志

logger.close

条目

您可以使用方法 Logger#add 添加条目

logger.add(Logger::DEBUG, 'Maximal debugging info')
logger.add(Logger::INFO, 'Non-error information')
logger.add(Logger::WARN, 'Non-error warning')
logger.add(Logger::ERROR, 'Non-fatal error')
logger.add(Logger::FATAL, 'Fatal error')
logger.add(Logger::UNKNOWN, 'Most severe')

这些简写方法也可以添加条目

logger.debug('Maximal debugging info')
logger.info('Non-error information')
logger.warn('Non-error warning')
logger.error('Non-fatal error')
logger.fatal('Fatal error')
logger.unknown('Most severe')

当您调用这些方法中的任何一个时,条目可能会或可能不会写入日志,具体取决于条目的严重性和日志级别;请参阅 日志级别

一个条目总是具有

并且可能还具有

示例

logger = Logger.new($stdout)
logger.add(Logger::INFO, 'My message.', 'mung')
# => I, [2022-05-07T17:21:46.536234 #20536]  INFO -- mung: My message.

条目的默认格式是

"%s, [%s #%d] %5s -- %s: %s\n"

其中要格式化的值是

您可以通过以下方式使用不同的条目格式

严重性

日志条目的严重性有两个影响

时间戳

日志条目的时间戳是在创建条目时自动生成的。

记录的时间戳由方法 Time#strftime 使用以下格式字符串进行格式化

'%Y-%m-%dT%H:%M:%S.%6N'

示例

logger = Logger.new($stdout)
logger.add(Logger::INFO)
# => I, [2022-05-07T17:04:32.318331 #20536]  INFO -- : nil

您可以使用方法 datetime_format= 设置不同的格式。

消息

消息是条目方法的可选参数

logger = Logger.new($stdout)
logger.add(Logger::INFO, 'My message')
# => I, [2022-05-07T18:15:37.647581 #20536]  INFO -- : My message

对于默认的条目格式化程序 Logger::Formatter,消息对象可以是

注意Logger::Formatter 不会转义或清理传递给它的消息。开发人员应注意,恶意数据(用户输入)可能在消息中,并且应显式转义不受信任的数据。

您可以使用自定义格式化程序来转义消息数据;请参阅 formatter= 的示例。

程序名称

程序名称是条目方法的可选参数

logger = Logger.new($stdout)
logger.add(Logger::INFO, 'My message', 'mung')
# => I, [2022-05-07T18:17:38.084716 #20536]  INFO -- mung: My message

可以在调用 Logger.new 时通过可选关键字参数 progname 设置新记录器的默认程序名称

logger = Logger.new('t.log', progname: 'mung')

可以通过调用方法 progname= 来设置现有记录器的默认程序名称

logger.progname = 'mung'

可以使用方法 progname 检索当前程序名称

logger.progname # => "mung"

日志级别

日志级别设置基于条目的严重性来确定是否实际将条目写入日志。

这些是定义的严重性(从最不严重到最严重)

logger = Logger.new($stdout)
logger.add(Logger::DEBUG, 'Maximal debugging info')
# => D, [2022-05-07T17:57:41.776220 #20536] DEBUG -- : Maximal debugging info
logger.add(Logger::INFO, 'Non-error information')
# => I, [2022-05-07T17:59:14.349167 #20536]  INFO -- : Non-error information
logger.add(Logger::WARN, 'Non-error warning')
# => W, [2022-05-07T18:00:45.337538 #20536]  WARN -- : Non-error warning
logger.add(Logger::ERROR, 'Non-fatal error')
# => E, [2022-05-07T18:02:41.592912 #20536] ERROR -- : Non-fatal error
logger.add(Logger::FATAL, 'Fatal error')
# => F, [2022-05-07T18:05:24.703931 #20536] FATAL -- : Fatal error
logger.add(Logger::UNKNOWN, 'Most severe')
# => A, [2022-05-07T18:07:54.657491 #20536]   ANY -- : Most severe

默认的初始级别设置为 Logger::DEBUG,这是最低级别,这意味着无论严重性如何,所有条目都将被写入

logger = Logger.new($stdout)
logger.level # => 0
logger.add(0, "My message")
# => D, [2022-05-11T15:10:59.773668 #20536] DEBUG -- : My message

您可以使用关键字参数 level 和适当的值在新记录器中指定不同的设置

logger = Logger.new($stdout, level: Logger::ERROR)
logger = Logger.new($stdout, level: 'error')
logger = Logger.new($stdout, level: :error)
logger.level # => 3

使用此级别,将写入严重性为 Logger::ERROR 或更高的条目,而不会写入严重性较低的条目

logger = Logger.new($stdout, level: Logger::ERROR)
logger.add(3)
# => E, [2022-05-11T15:17:20.933362 #20536] ERROR -- : nil
logger.add(2) # Silent.

您可以使用方法 level= 设置现有记录器的日志级别

logger.level = Logger::ERROR

这些简写方法也可以设置级别

logger.debug! # => 0
logger.info!  # => 1
logger.warn!  # => 2
logger.error! # => 3
logger.fatal! # => 4

您可以使用方法 level 检索日志级别。

logger.level = Logger::ERROR
logger.level # => 3

这些方法返回是否要写入给定级别

logger.level = Logger::ERROR
logger.debug? # => false
logger.info?  # => false
logger.warn?  # => false
logger.error? # => true
logger.fatal? # => true

日志 File 轮换

默认情况下,日志文件是单个文件,会无限增长(直到显式关闭);没有文件轮换。

为了使日志文件保持在可管理的大小,您可以使用日志 文件 轮换,它使用多个日志文件

基于大小的轮换

对于基于大小的日志文件轮换,请使用以下参数调用 Logger.new

示例

logger = Logger.new('t.log', 3)           # Three 1-megabyte files.
logger = Logger.new('t.log', 5, 10485760) # Five 10-megabyte files.

对于这些示例,假设

logger = Logger.new('t.log', 3)

日志记录在新日志文件 t.log 中开始;当新条目会导致其大小超过 shift_size 时,日志文件“已满”并准备好进行轮换。

第一次 t.log 已满

第二次 t.log 已满

每次后续 t.log 已满时,日志文件都会轮换

定期轮换

对于定期轮换,请使用以下参数调用 Logger.new

示例

logger = Logger.new('t.log', 'daily')   # Rotate log files daily.
logger = Logger.new('t.log', 'weekly')  # Rotate log files weekly.
logger = Logger.new('t.log', 'monthly') # Rotate log files monthly.

示例

logger = Logger.new('t.log', 'daily')

当给定周期过期时

后缀的默认格式是 '%Y%m%d',它生成的后缀类似于上面的后缀。您可以使用创建时选项 shift_period_suffix 设置不同的格式;请参阅 Time#strftime 中的详细信息和建议。