Logger
class Logger
Parent:ObjectIncluded modules:Logger::Severity
描述
Logger 类提供了一个简单但复杂的日志实用程序,可用于输出消息。
这些消息具有关联的级别,例如INFO
或者ERROR
表示它们的重要性。然后您可以给Logger一个级别,并且只会打印该级别或更高级别的消息。
这些级别是:
UNKNOWN
应始终记录一条未知消息。
FATAL
导致程序崩溃的无法解决的错误。
ERROR
可处理的错误情况。
WARN
一个警告。
INFO
关于系统操作的通用(有用)信息。
DEBUG
针对开发人员的低级信息。
例如,在生产系统中,您可能会将您的记录器设置为INFO
或甚至WARN
。但是,在开发系统时,您可能想知道程序的内部状态,并将Logger设置为DEBUG
。
注意
:记录器不会转移或清理传递给它的任何消息。开发人员应该知道何时将潜在的恶意数据(用户输入)传递给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)
例
这将创建一个输出到标准输出流的记录器,其级别为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
由于记录器的级别设置为WARN
,仅记录警告,错误和致命消息。调试和信息消息被默默丢弃。
Features
Logger 提供了一些有趣的功能,例如自动滚动日志文件,设置日志消息的格式,以及与消息一起指定程序名称。下一节将向您介绍如何实现这些目标。
HOWTOs
如何创建一个记录器
以下选项为您提供各种选择,或多或少地增加复杂性。
- 创建一个将消息记录到STDERR / STDOUT的记录器。logger = Logger.new(STDERR)logger = Logger.new(STDOUT)
- 为具有指定名称的文件创建一个记录器。
logger = Logger.new('logfile.log')
- 为指定的文件创建一个记录器。file = File.open('foo.log',File :: WRONLY | File :: APPEND)#要创建新的(并删除旧的)日志文件,请添加File :: CREAT,如下所示:#file = File.open('foo .log',File :: WRONLY | File :: APPEND | File :: CREAT)logger = Logger.new(file)
- 创建一个日志记录器,在日志文件达到特定大小后将其老化。保留10个“旧”日志文件,其中每个文件约为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')
1. 消息在块中。
logger.fatal { "Argument 'foo' not given." }
2. 消息为字符串。
3. 用程序名。
logger.info('initialize') { "Initializing..." }
4. 严重。
1. 原始界面。
logger.sev_threshold = Logger::WARN
2. Log4r(somewhat)兼容的界面。
3. 符号或字符串(不区分大小写)
logger.level = :info logger.level = 'INFO' # :debug < :info < :warn < :error < :fatal < :unknown
4. 构造函数
- 日志文件未锁定。
- 追加打开不需要锁定文件。
- 如果操作系统支持多个I/O,则记录可能会混合。
# File lib/logger.rb, line 454
def add(severity, message = nil, progname = nil)
severity ||= UNKNOWN
if @logdev.nil? or severity < @level
return true
end
progname ||= @progname
if message.nil?
if block_given?
message = yield
else
message = progname
progname = @progname
end
end
@logdev.write(
format_message(format_severity(severity), Time.now, progname, message))
true
end
Also aliased as: log
close() Show source
关闭日志记录设备。
# File lib/logger.rb, line 567
def close
@logdev.close if @logdev
end
datetime_format() Show source
返回使用的日期格式。请参阅datetime_format =
# File lib/logger.rb, line 299
def datetime_format
@default_formatter.datetime_format
end
datetime_format=(datetime_format) Show source
Set date-time format.
datetime_format
适合传递给的字符串strftime
。
# File lib/logger.rb, line 294
def datetime_format=(datetime_format)
@default_formatter.datetime_format = datetime_format
end
debug(progname = nil, &block) Show source
记录一条DEBUG
消息。
有关更多信息,请参阅info。
# File lib/logger.rb, line 489
def debug(progname = nil, &block)
add(DEBUG, nil, progname, &block)
end
debug?() Show source
返回true
当且仅当目前的严重性级别允许的打印DEBUG
信息。
# File lib/logger.rb, line 322
def debug?; @level <= DEBUG; end
error(progname = nil, &block) Show source
记录ERROR
消息。
有关更多信息,请参阅info。
# File lib/logger.rb, line 541
def error(progname = nil, &block)
add(ERROR, nil, progname, &block)
end
error?() Show source
返回true
当且仅当目前的严重性级别允许的打印ERROR
信息。
# File lib/logger.rb, line 334
def error?; @level <= ERROR; end
fatal(progname = nil, &block) Show source
Log a FATAL
message.
有关更多信息,请参阅 info。
# File lib/logger.rb, line 550
def fatal(progname = nil, &block)
add(FATAL, nil, progname, &block)
end
fatal?() Show source
返回true
当且仅当目前的严重性级别允许的打印FATAL
信息。
# File lib/logger.rb, line 338
def fatal?; @level <= FATAL; end
info(message) Show source
info(progname, &block)
Log an INFO
message.
message
要记录的消息; 不需要是一个字符串。
progname
在块形式中,这是在日志消息中使用的程序名。默认值可以使用progname =进行设置。
block
评估到要记录的消息。除非记录器的级别足以记录消息,否则不会进行评估。这允许您创建可能昂贵的日志消息,这些日志消息仅在记录器配置为显示它们时才会调用。
例子
logger.info("MainApp") { "Received connection from #{ip}" }
# ...
logger.info "Waiting for input from user"
# ...
logger.info { "User typed #{input}" }
你可能会坚持上面的第二种形式,除非你想提供一个程序名(你也可以用progname =来完成)。
返回
See add.
# File lib/logger.rb, line 523
def info(progname = nil, &block)
add(INFO, nil, progname, &block)
end
info?() Show source
返回true
当且仅当目前的严重性级别允许的打印INFO
信息。
# File lib/logger.rb, line 326
def info?; @level <= INFO; end
level=(severity) Show source
设置日志严重性阈值。
severity
日志消息的严重性。
# File lib/logger.rb, line 265
def level=(severity)
if severity.is_a?(Integer)
@level = severity
else
case severity.to_s.downcase
when 'debug'.freeze
@level = DEBUG
when 'info'.freeze
@level = INFO
when 'warn'.freeze
@level = WARN
when 'error'.freeze
@level = ERROR
when 'fatal'.freeze
@level = FATAL
when 'unknown'.freeze
@level = UNKNOWN
else
raise ArgumentError, "invalid log level: #{severity}"
end
end
end
Also aliased as: sev_threshold=
log(severity, message = nil, progname = nil)
Alias for: add
Logger#reopen Show source
Logger#reopen(logdev)
Args
logdev
日志设备。这是一个文件名(String)或IO对象(典型地STDOUT
,STDERR
或一个打开的文件)。如果是的话nil
,重新打开相同的文件名,对IO不做任何事情。默认是nil
。
描述
重新打开日志设备。
# File lib/logger.rb, line 408
def reopen(logdev = nil)
@logdev.reopen(logdev)
self
end
sev_threshold=(severity)
Alias for: level=
unknown(progname = nil, &block) Show source
记录UNKNOWN
消息。无论记录仪的级别是什么,这都将被打印出来。
有关更多信息,请参阅 info。
# File lib/logger.rb, line 560
def unknown(progname = nil, &block)
add(UNKNOWN, nil, progname, &block)
end
warn(progname = nil, &block) Show source
记录一条WARN
消息。
有关更多信息,请参阅info。
# File lib/logger.rb, line 532
def warn(progname = nil, &block)
add(WARN, nil, progname, &block)
end
warn?() Show source
返回true
当且仅当目前的严重性级别允许的打印WARN
信息。
# File lib/logger.rb, line 330
def warn?; @level <= WARN; end
私有实例方法
format_message(severity, datetime, progname, msg) Show source
# File lib/logger.rb, line 580
def format_message(severity, datetime, progname, msg)
(@formatter || @default_formatter).call(severity, datetime, progname, msg)
end
format_severity(severity) Show source
# File lib/logger.rb, line 576
def format_severity(severity)
SEV_LABEL[severity] || 'ANY'
end