本文简要介绍ruby语言中 Logger类
的用法。
说明
Logger
类提供了一个简单但复杂的日志记录实用程序,您可以使用它来输出消息。
消息具有相关的级别,例如INFO
或ERROR
,表明它们的重要性。然后,您可以给 Logger
一个级别,并且只会打印该级别或更高级别的消息。
级别是:
UNKNOWN
-
应始终记录的未知消息。
FATAL
-
导致程序崩溃的无法处理的错误。
ERROR
-
可处理的错误条件。
WARN
-
一个警告。
INFO
-
有关系统操作的一般(有用)信息。
DEBUG
-
开发人员的低级信息。
例如,在生产系统中,您可能将 Logger
设置为 INFO
甚至 WARN
。但是,在开发系统时,您可能想了解程序的内部状态,并将 Logger
设置为 DEBUG
。
注意: Logger
不会转义或清理传递给它的任何消息。开发人员应注意何时将潜在的恶意数据(user-input)传递给 Logger
,并手动转义不受信任的数据:
logger.info("User-input: #{input.dump}")
logger.info("User-input: %p" % input)
您可以使用 formatter=
转义所有数据。
original_formatter = Logger::Formatter.new
logger.formatter = proc { |severity, datetime, progname, msg|
original_formatter.call(severity, datetime, progname, msg.dump)
}
logger.info(input)
示例
这将创建一个输出到标准输出流的 Logger
,其级别为 WARN
:
require 'logger'
logger = Logger.new(STDOUT)
logger.level = Logger::WARN
logger.debug("Created logger")
logger.info("Program started")
logger.warn("Nothing to do!")
path = "a_non_existent_file"
begin
File.foreach(path) do |line|
unless line =~ /^(\w+) = (.*)$/
logger.error("Line in wrong format: #{line.chomp}")
end
end
rescue => err
logger.fatal("Caught exception; exiting")
logger.fatal(err)
end
因为 Logger 的级别设置为 WARN
,所以只记录警告、错误和致命消息。调试和信息消息被静默丢弃。
特征
Logger
提供了几个有趣的函数,例如日志文件的auto-rolling、设置日志消息的格式以及与消息一起指定程序名称。下一节将向您展示如何实现这些目标。
指南
如何创建记录器
以下选项为您提供了各种选择,或多或少地增加了复杂性。
-
创建一个将消息记录到 STDERR/STDOUT 的记录器。
logger = Logger.new(STDERR) logger = Logger.new(STDOUT)
-
为具有指定名称的文件创建一个记录器。
logger = Logger.new('logfile.log')
-
为指定文件创建记录器。
file = File.open('foo.log', File::WRONLY | File::APPEND) # To create new logfile, add File::CREAT like: # file = File.open('foo.log', File::WRONLY | File::APPEND | File::CREAT) logger = Logger.new(file)
-
创建一个记录器,一旦它达到一定大小,它就会对日志文件进行老化。保留 10 个 “old” 日志文件,每个文件大约 1,024,000 字节。
logger = Logger.new('foo.log', 10, 1024000)
-
创建一个记录器,它每天/每周/每月对日志文件进行老化。
logger = Logger.new('foo.log', 'daily') logger = Logger.new('foo.log', 'weekly') logger = Logger.new('foo.log', 'monthly')
如何记录消息
请注意用于记录各种级别消息的不同方法(fatal
、error
、info
)?该系列中的其他方法是 warn
和 debug
。 add
下面用于记录任意(可能是动态)级别的消息。
-
块中的消息。
logger.fatal { "Argument 'foo' not given." }
-
字符串形式的消息。
logger.error "Argument #{@foo} mismatch."
-
与程序名。
logger.info('initialize') { "Initializing..." }
-
带有严重性。
logger.add(Logger::FATAL) { 'Fatal error!' }
块形式允许您创建可能复杂的日志消息,但延迟它们的评估直到并且除非消息被记录。例如,如果我们有以下内容:
logger.debug { "This is a " + potentially + " expensive operation" }
如果记录器的级别为INFO
或更高,则不会记录调试消息,甚至不会评估整个块。与此相比:
logger.debug("This is a " + potentially + " expensive operation")
在这里,每次都进行字符串连接,即使日志级别未设置为显示调试消息。
如何关闭记录器
logger.close
设置严重性阈值
-
原始接口。
logger.sev_threshold = Logger::WARN
-
Log4r(有点)兼容接口。
logger.level = Logger::INFO # DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN
-
logger.level = :info logger.level = 'INFO' # :debug < :info < :warn < :error < :fatal < :unknown
-
构造函数
Logger.new(logdev, level: Logger::INFO) Logger.new(logdev, level: :info) Logger.new(logdev, level: 'INFO')
格式
默认情况下,日志消息以某种格式呈现在输出流中。默认格式和示例如下所示:
日志格式:
SeverityID, [DateTime #pid] SeverityLabel -- ProgName: message
日志样本:
I, [1999-03-03T02:34:24.895701 #19074] INFO -- Main: info.
您可以通过 datetime_format=
更改日期和时间格式。
logger.datetime_format = '%Y-%m-%d %H:%M:%S'
# e.g. "2004-01-03 00:54:26"
或通过构造函数。
Logger.new(logdev, datetime_format: '%Y-%m-%d %H:%M:%S')
或者,您可以通过 formatter=
方法更改整体格式。
logger.formatter = proc do |severity, datetime, progname, msg|
"#{datetime}: #{msg}\n"
end
# e.g. "2005-09-22 08:51:08 +0900: hello world"
或通过构造函数。
Logger.new(logdev, formatter: proc {|severity, datetime, progname, msg|
"#{datetime}: #{msg}\n"
})
1.2.7 后未使用。只是为了兼容。
相关用法
- Ruby Logger.info用法及代码示例
- Ruby LoadError类用法及代码示例
- Ruby Location.lineno用法及代码示例
- Ruby Location.label用法及代码示例
- Ruby Location.path用法及代码示例
- Ruby Location类用法及代码示例
- Ruby LocalJumpError类用法及代码示例
- Ruby Lazy.collect用法及代码示例
- Ruby Lazy.collect_concat用法及代码示例
- Ruby Lazy.flat_map用法及代码示例
- Ruby List.append用法及代码示例
- Ruby Lazy._enumerable_map用法及代码示例
- Ruby Lazy.enum_for用法及代码示例
- Ruby List.prepend用法及代码示例
- Ruby LDAP.build用法及代码示例
- Ruby Lazy._enumerable_flat_map用法及代码示例
- Ruby Lazy.new用法及代码示例
- Ruby Lazy._enumerable_filter_map用法及代码示例
- Ruby Lazy._enumerable_collect用法及代码示例
- Ruby Lazy.filter_map用法及代码示例
- Ruby Lazy.to_enum用法及代码示例
- Ruby Lazy._enumerable_collect_concat用法及代码示例
- Ruby Lazy.map用法及代码示例
- Ruby LDAP.new用法及代码示例
- Ruby Lazy类用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 Logger类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。