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