May 12, 2008

[自分メモ]log4c

Javaプログラマであればロギングにlog4jを利用している人も多いのではないでしょうか。ログレベル、ログの出力先、ログのフォーマット、といった項目を設定ファイルで切り替えられるのは便利です。

で、C言語でプログラミングする時に同じような便利なライブラリが無いかな、と調べた結果見つけたのがlog4cです。こちらはapacheとは関係が無いようです。

早速使ってみようと思ったのですが、Web上では資料が全くといっていいほど見つかりません。

一応、なんとなく使いかたが分かったのでメモしておきます。

1. インストール
ソースコードをダウンロードし、解凍後、configure→make→make installでインストールできます。デフォルトのインストール先は/usr/local/の下です。コンパイル時のリンカオプションで-llog4cを指定することになります。

2. 設定ファイル
ロギングの設定を記述した設定ファイルを用意する必要があります。ファイルは、
* ${LOG4C_RCPATH}/log4crc
* ${HOME}/.log4crc
* ./log4crc
のいずれかに置きます。
まずは設定例から
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE log4c SYSTEM "">

<log4c version="1.2.1">
 <config>
  <bufsize>0</bufsize>
  <nocleanup>0</nocleanup>
 </config>
 <rollingpolicy name="rp" type="sizewin" maxsize="1024" maxnum="4"/>
 <appender name="ap" type="rollingfile" logdir="/var/log/sample/" prefix="sample.log" layout="dated" rollingpolicy="rp"/>
 <category name="sample" priority="TRACE", appender="ap"/>
</log4c>


rollingpolicyタグにはログファイルのローテーションポリシーを記述します。各属性の意味は以下の通り。
・name 識別子。他のタグ属性から参照される。
・type ローテーションのタイプ。"sizewin"はファイルサイズによる切り替え。
・maxsize ログファイルのサイズがここで設定した値を越えた場合ファイルが切り替えられる。
・maxnum 保存されるログファイルの世代数。

appenderタグにはログの出力先や出力形式を記述します。各属性の意味は以下の通り。
・name 識別子。他のタグ属性から参照される。
・type ログの出力先。"rollingfile"はファイルに出力し、ローテーションが行われる。
・logdir ログを出力するディレクトリのパス。
・prefix ログファイルのファイル名に付けられるプレフィックス。
・layout ログのフォーマット
・rollingpolicy ログファイルのローテーションポリシー。rollingpolicyタグのname属性の値を指定する。

categoryタグにはプログラム内から参照される情報を記述します。各属性の意味は以下の通り。
・name 識別子。プログラム内から参照される。
・priority ログの優先度。プログラム内から参照される。
・appender appenderタグのname属性の値を指定する。

3. ソースコード
log4cを用いたロギングを行うソースコードの例は以下の通り。
#include <stdio.h>
#include "log4c.h"

int main(int argc, char **argv){
 log4c_category_t *lc;
 log4c_init();
 lc = log4c_category_get("sample");
 if(log4c_category_is_priority_enabled(lc, LOG4C_PRIORITY_TRACE)){
  log4c_category_log(lc, LOG4C_PRIORITY_TRACE,
  "this is trace %s:%d",__FILE__,__LINE__);
 }
 if(log4c_category_is_priority_enabled(lc, LOG4C_PRIORITY_DEBUG)){
  log4c_category_log(lc, LOG4C_PRIORITY_DEBUG,
  "this is debug %s:%d",__FILE__,__LINE__);
 }
 if(log4c_category_is_priority_enabled(lc, LOG4C_PRIORITY_INFO)){
  log4c_category_log(lc, LOG4C_PRIORITY_INFO,
  "this is info %s:%d",__FILE__,__LINE__);
 }
 if(log4c_category_is_priority_enabled(lc, LOG4C_PRIORITY_ERROR)){
  log4c_category_log(lc, LOG4C_PRIORITY_ERROR,
"this is error %s:%d",__FILE__,__LINE__);
 }
 log4c_fini();
return 0;
}

この例ではログを出力するかどうかを
log4c_category_is_priority_enabled
関数で判定しています。この関数は設定ファイルのpriority属性を参照し、第2引数で指定したpriorityが設定ファイルと同じか設定ファイルよりも優先度が高い場合に1を返します。

さらに詳しい使い方が知りたい場合はlog4c本体のパッケージに含まれるexamplesが参考になります。

最後に、冒頭でも触れたようにこのライブラリは仕様例や使い方を解説したサイトがすごく少ないです。あまり使われていないようで、バグやパフォーマンス面での不具合があるかもしれません。実際に使う場合にはプリプロセッサで消去できるようにしておいた方が無難です。

matssaku at 23:03│Comments(0)TrackBack(0)clip!C 

トラックバックURL

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔