当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby Logger类用法及代码示例


本文简要介绍ruby语言中 Logger类 的用法。

说明

Logger 类提供了一个简单但复杂的日志记录实用程序,您可以使用它来输出消息。

消息具有相关的级别,例如INFOERROR,表明它们的重要性。然后,您可以给 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、设置日志消息的格式以及与消息一起指定程序名称。下一节将向您展示如何实现这些目标。

指南

如何创建记录器

以下选项为您提供了各种选择,或多或少地增加了复杂性。

  1. 创建一个将消息记录到 STDERR/STDOUT 的记录器。

    logger = Logger.new(STDERR)
    logger = Logger.new(STDOUT)
  2. 为具有指定名称的文件创建一个记录器。

    logger = Logger.new('logfile.log')
  3. 为指定文件创建记录器。

    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)
  4. 创建一个记录器,一旦它达到一定大小,它就会对日志文件进行老化。保留 10 个 “old” 日志文件,每个文件大约 1,024,000 字节。

    logger = Logger.new('foo.log', 10, 1024000)
  5. 创建一个记录器,它每天/每周/每月对日志文件进行老化。

    logger = Logger.new('foo.log', 'daily')
    logger = Logger.new('foo.log', 'weekly')
    logger = Logger.new('foo.log', 'monthly')

如何记录消息

请注意用于记录各种级别消息的不同方法(fatalerrorinfo)?该系列中的其他方法是 warndebugadd 下面用于记录任意(可能是动态)级别的消息。

  1. 块中的消息。

    logger.fatal { "Argument 'foo' not given." }
  2. 字符串形式的消息。

    logger.error "Argument #{@foo} mismatch."
  3. 与程序名。

    logger.info('initialize') { "Initializing..." }
  4. 带有严重性。

    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

设置严重性阈值

  1. 原始接口。

    logger.sev_threshold = Logger::WARN
  2. Log4r(有点)兼容接口。

    logger.level = Logger::INFO
    
    # DEBUG < INFO < WARN < ERROR < FATAL < UNKNOWN
  3. Symbol String (不区分大小写)

    logger.level = :info
    logger.level = 'INFO'
    
    # :debug < :info < :warn < :error < :fatal < :unknown
  4. 构造函数

    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-lang.org大神的英文原创作品 Logger类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。