Ruby 1.9.2 リファレンスマニュアル > ライブラリ一覧 > loggerライブラリ
ログを記録するためのライブラリです。
5段階のログレベルに分けてログを記録します。
プログラムをクラッシュさせるような制御不可能なエラー
エラー
警告
一般的な情報
低レベルの情報
全てのメッセージは必ずログレベルを持ちます。また Logger オブジェクトも同じように ログレベルを持ちます。メッセージのログレベルが Logger オブジェクトのログレベルよりも 低い場合メッセージは記録されません。
普段は INFO しか記録していないが、デバッグ情報が必要になった時には、 Logger オブジェクトのログレベルを DEBUG に下げるなどという使い方をします。
require 'logger' log = Logger.new(STDOUT) log.level = Logger::WARN log.debug("Created logger") log.info("Program started") log.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 のみが記録されます。下が出力例です。
W, [2005-02-10T20:03:56.489954 #12469] WARN -- : Nothing to do!
これは log.level が Logger::WARN になっているためです。WARN、 ERROR、FATALログのみが記録の対象になります。DEBUG、INFOログは無視されま す。
例外オブジェクトも記録するメッセージとして使えます。
例:
require 'logger' log = Logger.new(STDOUT) log.level = Logger::ERROR begin File.each_line(path) do |line| unless line =~ /^(\w+) = (.*)$/ log.error("Line in wrong format: #{line}") end end rescue => err log.fatal("Caught exception; exiting") log.fatal(err) end
Logger はログファイルの自動切り替え、ログフォーマットの設定、ログ と一緒に記録するプログラム名の指定といった有用な機能があります。以降で はその使い方について説明します。
以下のいずれかの方法でloggerを作成する事ができます(Logger.new も参照)。
1. STDERR/STDOUTに出力するように指定
logger = Logger.new(STDERR) logger = Logger.new(STDOUT)
2. ログファイル名を指定
logger = Logger.new('logfile.log')
3. File オブジェクトを指定
file = File.open('foo.log', File::WRONLY | File::APPEND) # (古いファイルを削除する)新しいログファイルを作成する場合、以下のよ # うに [[m:File::CREAT]] を指定。 # file = File.open('foo.log', File::WRONLY | File::APPEND | File::CREAT) logger = Logger.new(file)
4. 指定したファイルサイズに達したらログファイルの切り替えを行うように指定。
# 約1,024,000バイトの"古い"ログファイルを10個残す logger = Logger.new('foo.log', 10, 1024000)
5. ログファイルの切り替えを daily/weekly/monthly に指定
logger = Logger.new('foo.log', 'daily') logger = Logger.new('foo.log', 'weekly') logger = Logger.new('foo.log', 'monthly')
ログをレベルごとに記録するのに Logger#fatal、Logger#error、 Logger#warn、Logger#info、Logger#debug メソッドを使用 します。動的に任意のログレベルを設定したい場合は Logger#add を使 用します。
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
ログはデフォルトでは特定のフォーマットで記録されます。デフォルトのフォー マットとその場合のログの例は以下のようになります。
フォーマット:
SeverityID, [DateTime #pid] SeverityLabel -- ProgName: message
例:
I, [1999-03-03T02:34:24.895701 #19074] INFO -- Main: info.
Logger#datetime_format= を用いてログに記録する時の日時のフォーマッ トを変更することもできます。
logger.datetime_format = '%Y-%m-%d %H:%M:%S' # e.g. "2004-01-03 00:54:26"
Logger#formatter= を用いてフォーマットを変更することもできます。
logger.formatter = proc do |severity, datetime, progname, msg| "#{datetime}: #{msg}\n" end # => "2005-09-22 08:51:08 +0900: hello world"
Logger | ログを記録するためのクラスです。 |
Logger::Application | ユーザ定義のアプリケーションにログ機能を簡単に追加することができます。 |
Logger::Formatter | ロガーのフォーマット文字列を扱うクラス。 |
Logger::LogDevice | Logger の内部で使用するログの出力先を表すクラスです。 |
Logger::LogDevice::LogDeviceMutex | ログの出力先ファイルを同期するためのクラスです。 |
Logger::Severity | logger で使用するログレベルを定義したモジュール。 |
Logger::Error | このライブラリで使用する例外です。 |
Logger::ShiftingError | ログファイルの切り替えに失敗した場合に発生する例外です。 |