TOP>>OBAQ>>ロギング 概略ツアー<OBAQ>構成定義アプリケーションサーバリファレンスサイトマップ

出力先の設定


ファイルへの出力

下記のような設定をすると、全てのログがファイル(sample1.log)に出力されます。

Log::setup_inline <<-END
  LogControler
    LogOutputFile out1 sample1.log

  LogConfig ""
    output=out1
END

同じコマンドをファイルに書いて、そのファイルをLog::setup_fileで読みこんでも同じです。

ファイルとコンソールの使いわけ

複数の出力先を設定して、それをカテゴリごとに使いわけることもできます。

Log::setup_inline <<-END
  LogControler
    LogOutputStdout console 
    LogOutputFile file sample1.log

  LogConfig "msg"
    output=console
  LogConfig "file"
    output=file
END

log1 = Log::lgc.get_category("msg")
log1.info("message to console") # コンソールに出力される

log2 = Log::lgc.get_category("msg.subcategory.a")
log2.info("message to console") # コンソールに出力される


log3 = Log::lgc.get_category("file")
log3.info("message to file")    # ファイルに出力される

log4 = Log::lgc.get_category("file.subcategory.b")
log4.info("message to file")    # ファイルに出力される

ファイルとコンソール両方に出力する

ログ出力先の設定は、インデントのレベルで階層化されています。

Log::setup_inline <<-END
  LogControler
    LogOutputStdout console 
      LogOutputFile both sample1.log

  LogConfig "msg"
    output=console
  LogConfig "file"
    output=both
END

このように、LogOutputFileの行のインデントを下げると、 「LogOutputFile both」は「LogOutputStdout console」の下位のオブジェクトになります。 下位オブジェクトへの出力は、そのまま上位へも転送されます。

そのため、カテゴリー file.xxx.xxxに対する出力(つまり output=bothに対する出力)は ファイルに出力された後にコンソールへ出力されます。

次のように両者の上下関係を反対にすると、

LogOutputFile file sample1.log
  LogOutputStdout console 

output=fileのカテゴリに対するログはファイルのみ、 output=consoleのカテゴリに対するログはファイルとコンソール両方に出力されます。

出力項目を指定する

SimpleLayoutというのはログ出力オブジェクトですが、 実際の出力は行なわず、メッセージフォーマットを設定して上位に転送するだけのオブジェクトです。 これを利用すると、出力内容を指定することができます。

Log::setup_inline <<-END
  LogControler
    LogOutputStdout 
      SimpleLayout console 
        filename lno method

  LogConfig "msg"
    output=console
END

出力結果
log2.rb:100:main:message to console

SimpleLayoutもLogOutputFile等と同じように、 複数の設定ができます。 次の例は、コンソールメッセージには時間を付加し、 デバッグメッセージには、ファイル名と行番号とメソッド名を付加する例です。

def Sample5.main
  Log::setup_inline <<-END
    LogControler
      LogOutputStdout 
        SimpleLayout msg
          time
        SimpleLayout debug
          filename lno method

    LogConfig msg
      output=msg

    LogConfig debug
      priority=LOG_DEBUG
      output=debug
  END

  msg = Log::lgc.get_category("msg")
  msg.info("message")

  debug = Log::lgc.get_category("debug")
  debug.debug("debug log")
end

出力結果
2001/05/23 23:53:19:message
log2.rb:128:main:debug log

応用例

カテゴリごとに出力先とフォーマットを両方指定した場合です。

Log::setup_inline <<-END
  LogControler
    LogOutputFile file sample1.log
      SimpleLayout                                #a
          time filename lno method reformat
        LogOutputStdout 
          SimpleLayout msg                        #b
             time
        SimpleLayout debug                        #c
          filename lno method

    LogConfig msg
      output=msg

    LogConfig debug
      priority=LOG_DEBUG
      output=debug
END


tnaka@rymoa log]$ ruby log2.rb 
2001/05/23 23:59:17:message                        #1
[tnaka@rymoa log]$ cat sample1.log 
2001/05/23 23:59:17:log2.rb:156:main:message       #2
log2.rb:159:main:debug log                         #3

コンソール出力(カテゴリ=msg)のメッセージは #bに送られます。 ここで、時刻を付加されその上位でコンソールに出力されます。 さらに、その上位(#b)でフォーマットを変更してから、 上位のファイル出力(sample1.log)に送られます。 その結果、ファイルには#2のように行番号等を付加されて出力されています。

ファイル出力は、#cのフォーマットに従い、#3のようにファイルに出力されます。


ページトップへ