Log for C++

はじめに

このページは、本家サイトを日本語に翻訳したものです。
翻訳者:宮崎 崇

Log4cppはファイル、syslog、IDSAやその他の出力先への柔軟なログをするためのC++のクラスライブラリです。 Log4cppはJavaのLog4jを元にして作成されています。そのAPIに似せることが合理的なためです。

ダウンロード

ソースはSourceForgesのダウンロードのページから利用可能です。
多くの互換性のないABI (Application Binary Interface) (例えばg++ 2.95、2.96、3.0、3.2)や異なるパッケージフォーマットのため、バイナリはまだ提供していません。
log4cppの古いバージョン(0.2.5)はDebianの安定版で提供されています。 http://packages.debian.org/stable/libs/liblog4cpp0.htmlを参照してください(訳注:リンク切れしてます)。
FreeBSDユーザはports collectionにて、log4cpp (0.2.7)を見つけることができます。 http://www.freebsd.org/ports/devel.htmlを参照してください。
Datagrid Project Central Repositoryの人たちは自分自身が使用しているソースとバイナリのRPMパッケージを公開しています。 これらは RedHat Linux 6.2 向けです。
Pascal Bleserはhttp://guru.unixtech.be/rpm/packages/Development/log4cpp/(訳注:リンク切れしてます)にてSuSE Linux用のRPMパッケージを作成し、それらを利用可能にしました。
Log4cppはRPMパッケージの作成が可能です。ソースのtar-ballから自分自身で作成することは簡単です。

rpm -ta log4cpp-x.y.z.tar.gz

Log4cppのビルド

log4cpp version 0.2.0現在、autoconfをサポートするプラットフォーム上で、それを使用してビルドできます。以下を行ってください:

./configure
make
make check
make install

/usr/local 下にlog4cppがインストールされます。他の場所にインストールを行うためにはconfigureを行うときに--prefix=<location>を指定してください。

./configure時のオプション

--prefixのような./configure時の通常のオプションの他に、いくつかが利用可能です:
--with-idsa
IDSA(http://jade.cs.uct.ac.za/idsa/index.html)へのログ出力用のサポートを含みます。 これによりIdsaAppender Appender クラスが提供されます。
--with-omnithreads[=<path-to-omniORB>]
omniORB4のomniThreads MT用抽象化ライブラリ(http://www.omniorb.org)を使用してマルチスレッドサポートを有効にします。 configureは<path-to-omniORB>/includeにomnithreadのヘッダファイルが、<path-to-omniORB>/libにライブラリが存在することを期待します(すなわち、プラットフォーム固有のサブディレクトリ内ではないこと)。 シンボリックリンクは必要に応じて作成してください。
注意: omniORB4が必要です:omniORB3はスレッド固有データを十分にサポートしていないため、十分ではありません。2002年8月現在、omniORB4はβ版ですが、ほとんどの部品、特にスレッドライブラリは十分安定しているように見えます。
--with-pthreads
POSIXスレッドライブラリ「pthread」を使用してマルチスレッドのサポートを有効にします。 このオプションは--with-omnithreadsオプションとは一緒に使用できません。
--enable-doxyen
Dimitri van HeeschsのDoxygen(http://www.doxygen.org/)によるAPIドキュメントの生成を有効にします。doxygenが検索パスで見つけることができた場合はデフォルトでyesです。
--enable-html-docs
doxygenを有効にした場合、HTML形式のドキュメントが生成されます。
--enable-latex-docs
doxygenを有効にした場合、LaTeX形式のドキュメントが生成されます。
--enable-dot
グラフを描画するGraphViz (http://www.graphviz.org)の「dot」ツールを使用して、Doxygenを使ってみましょう。

特定のプラットフォームでのビルド時の注意

*nix(訳注:UnixやLinuxなど) - g++ compiler
g++とGNU makeを使用して、ちゃんとした*nixシステム上で修正なしにLog4cppをビルドできるでしょう。 主要な開発プラットフォームはRedHat Linux 7.3(g++ 2.96-rh使用)ですが、目的はg++ 2.95以上からの互換性です。 g++ 3.xが広く採用される場合、古いバージョンのg++に対してのサポートを止めるかもしれません。
Solaris - Sun CC compiler
Suns CC compiler でコンパイルする場合、いくつかの環境変数を設定する必要があります。 また、静的ライブラリが動作していないように見えます。要するに、以下としてください:
CC=CC CXX=CC LD="CC -KPIC" ./configure --disable-static
Win32 - MSVC++ 6
「msvc6」サブディレクトリにあるワークスペースとプロジェクトファイルを使用してください。 特定の要求のためinclude/log4cpp/config-win32.hとプロジェクトファイルを調整する必要があります。
Win32 - MSVC++ 5
MSVC++ 5でのlog4cppのビルドはサポートされておらず、誰かがソースコードを削ることなしにビルドできる方法を見つけない限りは、できません。
Win32 - Borland C++ Builder 5
「bcb5」サブディレクトリにあるプロジェクトファイルとmakeファイルを使用してください。
Win32 - Cygwin
「./configure; make; make install」を使用してください。
このプラットフォームでは非常に少ない成功あるいは失敗のレポートが警告されます。 そのため、スムーズに動作するか、あるいは誰もCygwinでlog4cppを積極的に使用しません。:-)
OpenVMS
別の設定が必要な場合include/log4cpp/config-openvms.hを編集してください。
これはOpenVMS Alpha v7.3とCompaq C++ V6.3-020でのみテストされています。
1) srcとincludeディレクトリ(その中身とサブディレクトリ全部)をOpenVMSシステムへコピーしてください 。
2) 以下のコマンドにより、各ソースファイル(srcディレクトリの中の*.CPP と *.C)をコンパイルしてください。
cxx /include=("/a1\$dkb0/user/tony/project/log4cpp/include") /define=(__USE_STD_IOSTREAM,__OPENVMS__) /repository=a1$dkb0:[user.tony.project.log4cpp.repository] APPENDER.CPP
cxx /include=("/a1\$dkb0/user/tony/project/log4cpp/include") /define=(__USE_STD_IOSTREAM,__OPENVMS__) /repository=a1$dkb0:[user.tony.project.log4cpp.repository] APPENDERSKELETON.CPP
...など。
includeディレクトリをを正しいパスに置き換えてください。Unix形式のディレクトリ名は/include引数を必要とします。 この例では、パスは次のとおりです。A1$DKBO:[USER.TONY.PROJECT.LOG4CPP.INCLUDE]
リポジトリのディレクトリは、A1$DKB0:[USER.TONY.PROJECT.LOG4CPP.REPOSITORY]のようにここで指定されています。
3) 静的ライブラリ LOG4CPP.OLB を作成します。
lib/create log4cpp
4) LOG4CPP.OLBにすべてのコンパイル済みOBJファイルを入れてください。
lib/insert log4cpp appender
lib/insert log4cpp appenderskeleton
...など。
5) log4cpp.olbと一緒にプログラムをリンクします。例えば:
cxx /include=("/a1\$dkb0/user/tony/project/log4cpp/include") /define=(__USE_STD_IOSTREAM,__OPENVMS__) testlog4cpp.cxx

cxxlink /repository=a1$dkb0:[user.tony.project.log4cpp.repository] testlog4cpp,log4cpp/library

リリース

警告:開発ブランチ(development branch)からのリリースは進行中の作業であり、ビルド失敗、クラッシュ、デスクトップの再構築を引き起こす可能性があります。

0.3.4b - development branch (2002年10月29日)
MSVC6とMSVC7のビルド対する修正(今度こそ本当に):-)。
0.3.4 - development branch (2002年10月28日)
MSVC6とMSVC7のビルド対する修正。
Log4cppCleanupを削除。
0.3.3 - development branch (2002年10月26日)
バグ修正 #628211: MSVC 6.0でのビルド失敗。
バグ修正 #625811: RemoteSyslogAppender内のログファシリティ。
バグ修正(恐らく) #415160: Solaris 2.6上で、ダイナミックリンクライブラリでのクラッシュ。
PatternLayoutを新しくし、より速く、より完全な実装に置き換えました。
0.3.2 - development branch (2002年10月5日)
バグ修正 #614903: Sun CC 5.3でのプログラムのコンパイル。
抜けファイル(MSVC6 .dsp)を追加しました。
RemoteSyslogAppender内のログファシリティを修正。
log4cpp-devel RPMの再配置可能性を修正。
0.3.2rc5 - development branch (2002年10月5日)
マージ #604991: PropertyConfigでadditivy設定をサポート.
マージ #605143: QNX Neutrinoでのコンパイルをサポート。
0.3.2rc4 - development branch (2002年8月16日)
*nix(訳注:UnixやLinuxなど)とWin32プラットフォームの両方でのコンパイルが起きない失敗の直前まで修正。
0.3.2rc2 - development branch (2002年8月12日)
POSIXスレッドのサポートを追加。
PropertyConfiguratorを追加。
ドキュメントを整理。
さまざまなバグを修正。
0.3.2rc1 - development branch (2002年6月19日)
Win32スレッドのサポートを追加。
NTEventLogAppenderを追加。
Win32DebugAppenderを追加。
深さが2より大きいときのNDC(ネスト化診断コンテキスト)の問題を修正。
aclocalのサポートを追加。
0.3.1 - development branch (2002年4月4日)
RollingFileAppenderクラスを追加。
バグ修正 #572467: イテレータの使用が無効になる。
バグ修正 #527475: 文字列のフォーマットのバグ。
バグ修正 #530332: 'std::'の指定ミス。
機能要求を処理 #536668、 #527760、 #527381。
0.3.0 - development branch (2002年2月18日)
マルチスレッドアプリケーションのための実験的サポートを追加。 この実装はomniORB4sスレッドライブラリを使用しています。このようなBoostのような他のスレッドライブラリは、同様に使用することもできますが、これはまだ実装していません。
0.2.7 - stable branch (2002年1月27日)
カテゴリに複数のアペンダの所属のサポートを追加(機能要求 #501360)。
SyslogAppenderでの変数のスコープのバグを修正(バグ #499315)
SyslogAppenderとRemoteSyslogAppenderでのメモリリークを修正(バグ #499524)。
Filterでのコンパイルの問題を修正(バグ)。
SimpleConfiguratorでの設定ファイルの解析の問題を修正(バグ #500766)。
FATALレベルでのログ出力するメソッドを追加(バグ #504314)。
Win32でのコンパイルの問題を修正(バグ #506907)。
0.2.6 (2001年12月11日)
OpenVMSを予備でサポート。
PatternLayout、SimpleConfigurator、RemoteSyslogAppenderを追加。
0.2.5 (2001年6月11日)
Borland C++ Builderでのサポートを追加。
ライブラリバージョン1.0.0:このリリースでは以前のものとバイナリ互換ではありません。 (バージョンの更新が0.2.4で行われている必要があります)。
0.2.2 (2001年3月4日)
Win32プラットフォーム(MSVC++ 6.0)のサポートを追加。
0.2.1 (2001年2月15日)
ライセンスをLGPLに変更。
0.2.0 (2000年12月10日)
log4cppはautoconfとautomakeを使用。

CVS

Log4cppは、直接CVSからも入手できます。手順についてはSourceForge CVS pageを見てください。 CVSには現在2つのブランチがあります:

MAINlog4cppの開発向け
BRANCH_MAINT_0_2log4cppの安定版(0.2.x)のメンテナンス向け

各リリースにはREL_x_y_zと言う名前のタグが振られています。

最新のlog4cppのリビジョンをチェックアウトして作業を開始するには、始めに./autogen.sshを実行してください。./configureと必要なMakefile.inが作成されると思います。autoconf 2.50とautomake 1.6.0、libtool 1.4が必要になります。

ドキュメント

Doxygenで生成したAPIドキュメントが、こちらにあります。
Solaris Developer ConnectionにMo Budlonによるlog4cpp 0.2.xを使った'Logging and Tracing in C++ Simplified(C++による簡単なログ出力とトレース出力)'が特集記事としてあります。 log4cppを使用する方法を理解しようとするのであれば、読むことをお勧めします!

よくある質問

1. 一般的な質問

1.1. Log for C++とは何ですか?

Log for C++はファイルやsyslog、その他の出力先へログ出力する柔軟なC++ライブラリです。 Log for C++はJava向けのLogライブラリ(http://jakarta.apache.org/log4j/)を模倣しています。そのAPIに似せることが合理的なためです。

1.2. Log for C++はLog4jとどのような関係にありますか? ちゃんとした移植なのでしょうか?

Log for C++はJavaで提供されているLog4jと同じようにC++でのログ出力向けの似ているインタフェースを提供するために努めています。 しかしながら、実装は、Javaコードの翻訳ではありません。その意味でLog for C++は、Log4jの"移植"ではありません。もちろんLog for C++はLog4jの多くの構想を参考にしています。

1.3. プロジェクトの名前は何でしょうか?「Log for C++」なのか「log4cpp」なのか?

プロジェクトの「公式」で長い名前は「Log for C++」ですが,実際には略称である「log4cpp」が便利であることが証明されています。

1.4. Log for C++は何のライセンスの元で利用可能ですか?

バージョン0.2.1のLog for C++はGNU Lesser General Public License (LGPL)の元でリリースされています。 その前のバージョンはGPLでリリースされています。GPLからLGPLへ切り替えた背景についてはSourceForgeのフォーラムでのライセンスの説明を参照してください。

1.5. 当社の法務部門はLGPLを好きではありません。ライセンスXYZの元でLog for C++をリリースできないでしょうか?

無理です。
長い回答: 全ての貢献者が同意すれば技術的に可能ですが、貢献者が増えているためますます難しくなっています。 しかし、これが克服できたとしてもありえません。
もちろん、LGPLを使用すると代わりにLGPLのGPLを選択することができますが、XYZはGPLのことではないのですよね?

2. コンパイルとインストール

3. 使用方法

3.1. log4cppのコンパイルに成功しました。それで、これをどのように使用したらよいのでしょうか?

log4cppを使用した小さなサンプルについては「tests」サブディレクトリを見てください。また、APIドキュメントとより多くの使用方法については、ドキュメントを見てください。

3.2. log4cppはスレッドセーフでしょうか?

訳注:回答が書かれていませんでした。

4. 問題とエラーメッセージ

4.1. 「Naming collision for 'ERROR' detected. Please read the FAQ for a workaround.」('ERROR'という名前の衝突を検出。この問題を回避するために、よくある質問をお読みください。)が出ました。

これは#defineによって名前空間を分けたいくつかのプラットフォーム上での間違いによって引き起こされます。 より正確に言うと、Win32APIでは'ERROR'、'DEBUG'が#defineで定義されています。プリプロセッサはC++名前付けスコープを知らないので、 文字通りいたるところでERRORとDEBUGという単語が識別子が予約されてしまいます。特に、これはlog4cpp::Prioritiy::ERRORとlog4cpp::Priority::DEBUGで衝突します。 これら後者の二つの名前は、log4jからのものなので、私たち自身が作成したものではありません。
それらWin32の作成者はプリプロセッサを通してこれらの一般的な名前を要求すべきではありませんでした。はるかに良い選択肢があります:
  1. それを定数値として使用したい場合、言語構造を使用して宣言してください。 「enum {ERROR=1};」や「static const int ERROR=1;」が良いでしょう。
  2. 名前の競合の可能性を減らすために、「WIN32API_ERROR」のような一般的でない名前を使用してください。
  3. このケースでは条件付コンパイルのフラグとして使用しています。「#define DEBUG DEBUG」と「#if defined(DEBUG)」を使用しています。 その場合、プリプロセッサは単に、ソースコード中の「DEBUG」の全ての箇所を「DEBUG」でそのまま置き換えるだけとなります。実質的に影響を与えません。

もちろん、問題の当事者(Win32の作成者)が上記の方法のいずれかを使用のであれば、適切な解決方法となります。 しかし、これが実際に直るまで待つ必要が出てきます。そのため代替方法として、log4ppではこれらの#defineを回避することができます。 回避策のコードはプラットフォームのヘッダファイルを「#include」して、log4ppのヘッダファイルを「#include」をする前に「#define LOG4CPP_FIX_ERROR_COLLISION 1」を有効にしています。 Win32プラットフォームではこの「#define」は「log4cpp/config-win32.h」にすでに含まれています。

一度log4cppがlog4jを1.2 APIに更新すれば、ログレベルの新しい名前を採用することにより、この問題を取り除くことができます。 (訳注:いろいろ調べましたが、言っている意味が理解できませんでした。log4j 1.2がリリースされる前に書いた文章でしょうか?)

4.2. Solaris 7のマシン上でSunWorkshopコンパイラ(CC)を使用してlog4cppパッケージをリンク/コンパイルしようとしています。ライブラリはビルドされますが、testmainのコードがリンクに失敗します。

この問題に対する適切な解決策は、(提案も歓迎する)まだ見つかっていませんが、James Emeryが、次の回避策と成功を報告しました: 一言で言えば、configureで:
export LD="CC -Kpic" && ./configure --disable-static

4.3. プラットフォームXYZにおいて「snprintf()」が検出できず./configureが失敗します。

./configureは単にC99準拠かどうか調べるのと同じようにsnprintf()関数の存在をチェックするわけではありません。 特に、snprintf()は潜在的なバッファーオーバーフローの問題を回避するために「文字列サイズ」パラメータは厳密に指定しなければなりません。 OSが適切なものを提供しない場合、log4cppはalternative snprintf() implementation(snprintf()の別の実装)で縮退動作します。

状態

バージョン0.3.0の時点で、log4cppは安定版と開発版の別々のブランチがあります。 リリースx.y.zにおいて、yが偶数の場合は安定版、奇数の場合は実験版(一部or全機能が破壊されることを意味します)です。

最後の安定リリース版は0.2.7です。0.2.xの新しいリリースはバグ修正のみとなり、新機能は0.3.x、最終的には0.4.xに移ります。 (訳注:・・・と書いてありますが、現時点(2012/1/28)での最新は1.0.xです。)

貢献者

2000年後半に私(Bastiaan Bakker)がLog4cppのコーディングを始めました。それ以来、他の人がプロジェクトに参加したり、コードを寄稿したりしました:

Cedric Le Goater <cedric(at)legoater.com>autoconfのセットアップ、様々な改善
Marc Welz <marc(at)jade.cs.uct.ac.za>IdsaAppender
Lynn Owen <opl(at)agoby.com>MSVC++のサポート
Steve Ostlind <s.ostlind(at)pentasafe.com>MSVC++のサポート、様々な修正
Marcel Harkema <marcel(at)debian.org>Debianパッケージング
Uwe Jäger <jaeger(at)varial.de>Borland C++ Builderのサポート
Walter Stroebel <walter.stroebel(at)lifeline.nl>RemoteSyslogAppender
Glen Scott <glen_s(at)yahoo.com>PatternLayout、SimpleConfigurator
Tony Cheung <dragonman(at)asiayeah.com>OpenVMSのサポート
Alex Tapaccos <ATapaccos(at)redfig.com>DailyRollingFileAppender
Brendan B. Boerner <bboerner(at)texas.net>Multiple Appender support for Categories
Paulo Pizarro <paulo.pizarro(at)digitro.com.br>RollingFileAppender
David Resnick <dresnick(at)mobilespear.com>NTEventAppender、統合作業
Aaron Ingram <ai8(at)yahoo.com>MSThreadsのサポート
Alan Anderson <alan(at)rushmore.com>Win32DebugAppender、PropertyConfigurator
Emiliano Martin <emilianomc(at)terra.es>PThreadsのサポート

プロジェクトページ

SourceForge Logo Log4cppのプロジェクトページはSourceForgeの中のhttp://sourceforge.net/projects/log4cpp/です。
SourceForge.JP 日本語訳のプロジェクトページはSourceForge.jpの中のhttp://sourceforge.jp/projects/log4cpp-jp/です。

関係プロジェクト

Log4cppはたくさんあるLog4j APIの移植/実装の1つです。全てではありませんが、一覧です:

log4cCedric LegoaterによるCによる実装
log4cplusTad Smithによる独自のC++実装。 なんらかの理由でlog4cppが駄目な場合、チェックする価値があります。

ライセンス

バージョン0.2.1の時点で、このライブラリのライセンスはGPLの代わりにLGPLとなっています。それ以上のライセンスの変更は計画されていません:-)。

Log for C++ (略称:log4cpp)は柔軟なログ出力のためのC++ライブラリです。
Copyright (C) 2000-2002 LifeLine Networks bv
Copyright (C) 2000-2002 Bastiaan Bakker
他の部分の著作権についてはTHANKSファイルやソースコードを参照してください。

このライブラリはフリーソフトウェアです。フリーソフトウェア財団によって発行された
GNU 劣等一般公衆利用許諾書(LGPL)の条件の下で再配布や修正をしてかまいません。
LGPLのバージョンは2.1以上か、(任意で)それより高いバージョンのいずれかです。

このライブラリは、有益であることを願って配布されています。
しかし、まったくの無保証です。特定の目的に対する商品性または適合性の保証もありません。
詳細については、GNU劣等一般公衆利用許諾契約書(LGPL)を参照してください。

このライブラリとともに、GNU劣等一般公衆利用許諾契約書(LGPL)のコピーを受け取っているはずです。
そうでなければ、フリーソフトウェア財団、
59 Temple Place, Suite 330, Boston, MA  02111-1307  USAに知らせてください。