當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


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類。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。