Log4cpp memo

Log4Cppは、Log4JのC++への移植である。sampleコードを以下に示す。 このコードは、log4cpp_test.logというファイルと、syslogにlogを残す。

#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/SyslogAppender.hh>

using namespace log4cpp;

int main(void){
  Category &logger = Category::getInstance("chomy");
  logger.setPriority(Priority::INFO);
  FileAppender fapp("file", "log4cpp_test.log");
  logger.addAppender(&fapp);

  SyslogAppender sapp("syslog", "log4cpp");
  logger.addAppender(&sapp);

  logger.debug("Debug message");
  logger.info("Information");
  logger.notice("Notice");
  logger.warn("Warning!");
  logger.error("Error");
  logger.crit("Critical");
  logger.alert("Help ASAP!");
  logger.emerg("Oh no!");
  logger.fatal("Oh my god!");
  return 0;
}

このプログラムを実行すると、ファイルには、次のようなlogが残る。

1132745900 INFO chomy : Information
1132745900 NOTICE chomy : Notice
1132745900 WARN chomy : Warning!
1132745900 ERROR chomy : Error
1132745900 CRIT chomy : Critical
1132745900 ALERT chomy : Help ASAP!
1132745900 FATAL chomy : Oh no!
1132745900 FATAL chomy : Oh my god!

またsyslogには次のように残る。

Nov 23 20:38:20 cookie log4cpp: 1132745900 INFO chomy : Information 
Nov 23 20:38:20 cookie log4cpp: 1132745900 NOTICE chomy : Notice 
Nov 23 20:38:20 cookie log4cpp: 1132745900 WARN chomy : Warning! 
Nov 23 20:38:20 cookie log4cpp: 1132745900 ERROR chomy : Error 
Nov 23 20:38:20 cookie log4cpp: 1132745900 CRIT chomy : Critical 
Nov 23 20:38:20 cookie log4cpp: 1132745900 ALERT chomy : Help ASAP! 
Nov 23 20:38:20 cookie log4cpp: 1132745900 FATAL chomy : Oh no! 
Nov 23 20:38:20 cookie log4cpp: 1132745900 FATAL chomy : Oh my god! 

Logレベルは優先度順に以下の通りとなる。どうやらsyslogの優先度と同じのようだ。括弧内はsyslog(3)にあった、優先度の説明である。

  1. EMERG, FATAL(システムが使用不可)
  2. ALERT(ただちに行動を起こさなければならない)
  3. CRIT(危険な状態)
  4. ERROR(エラーの状態)
  5. WARN(ワーニングの状態)
  6. NOTICE(通常だが重要な状態)
  7. INFO(インフォメーションメッセージ)
  8. DEBUG(デバッグレベルのメッセージ)

記録するlogレベルはCategorクラスのsetPriorityで決めることができる。 上のサンプルコードではPriorityがINFOになっているので、INFO以上の優先度を持つLogメッセージが記録される。このためDebugレベルのメッセージがファイルにもsyslogにも記録されていない。

サンプルコードを見て見当がつくと思うが、syslogおよびfileに書く処理をしているのはSyslogAppenderとFileAppenderのインスタンスである。今回使用したlog4cpp version 0.2.8ではこの二つのAppenderの他にRemoteSyslogAppenderがある。

logの書式を変えるには、PatternLayoutインスタンスに書式を設定して、Appenderに登録すればいい。例えば、上のサンプルコードでは、ファイルに書いたlogでは時刻がよくわからないし、syslogでは時刻情報が冗長なので書式を設定することでこの問題を解決しよう。

#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/SyslogAppender.hh>
#include <log4cpp/PatternLayout.hh>
#include <iostream>
using namespace log4cpp;

int main(void){
  Category &logger = Category::getInstance("chomy");
  //logger.setPriority(Priority::DEBUG);

  FileAppender fapp("file", "log4cpp_test.log");
  logger.addAppender(&fapp);

  SyslogAppender sapp("syslog", "log4cpp");
  logger.addAppender(&sapp);


  PatternLayout *layout4file, *layout4syslog;

  layout4file = new PatternLayout();
  if(false == layout4file->setConversionPattern("%d %p %c : %m%n"))
    std::cerr<< "setConversionPattern fail"<<std::endl;}	   
  fapp.setLayout(pattern4file);

  layout4syslog = new PatternLayout();
  if(false == layout4syslog->setConversionPattern("%p %c : %m%n"))
    std::cerr<< "setConversionPattern fail"<<std::endl;
  sapp.setLayout(layout4syslog);


  logger.debug("Debug message");
  logger.info("Information");
  logger.notice("Notice");
  logger.warn("Warning!");
  logger.error("Error");
  logger.crit("Critical");
  logger.alert("Help ASAP!");
  logger.emerg("Oh no!");
  logger.fatal("Oh my god!");
  return 0;
}

このプログラムを実行すると、ファイルには以下のようにlogが残る。

Wed Nov 23 21:34:16 2005 INFO chomy : Information
Wed Nov 23 21:34:16 2005 NOTICE chomy : Notice
Wed Nov 23 21:34:16 2005 WARN chomy : Warning!
Wed Nov 23 21:34:16 2005 ERROR chomy : Error
Wed Nov 23 21:34:16 2005 CRIT chomy : Critical
Wed Nov 23 21:34:16 2005 ALERT chomy : Help ASAP!
Wed Nov 23 21:34:16 2005 FATAL chomy : Oh no!
Wed Nov 23 21:34:16 2005 FATAL chomy : Oh my god!

またsyslogには次のように記録され、一件落着。

Nov 23 21:34:16 cookie log4cpp: INFO chomy : Information 
Nov 23 21:34:16 cookie log4cpp: NOTICE chomy : Notice 
Nov 23 21:34:16 cookie log4cpp: WARN chomy : Warning! 
Nov 23 21:34:16 cookie log4cpp: ERROR chomy : Error 
Nov 23 21:34:16 cookie log4cpp: CRIT chomy : Critical 
Nov 23 21:34:16 cookie log4cpp: ALERT chomy : Help ASAP! 
Nov 23 21:34:16 cookie log4cpp: FATAL chomy : Oh no! 
Nov 23 21:34:16 cookie log4cpp: FATAL chomy : Oh my god! 

書式を指定する、PatternLayoutクラスのsetConversionPattern関数に渡す書式文字列は以下の通り。Defaultは"%m%n"。


Valid HTML 4.01 Strict