本文简要介绍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类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。
