log4cpp
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* log4cpp [#oa019ba0]
ログを吐き出すライブラリ。使い方をマスターすれば便利そう...
*** ソース [#j8807fbb]
ここからダウンロードできる。ソースなのでビルドして使わに...
- [[Log for C++:http://log4cpp.sourceforge.net/]]
- [[Log library for C++:http://sourceforge.net/projects/l...
*** ビルド [#d799f765]
Windows なので、VC++ 6 (.NET) などでビルドして使用する( ...
留意点
- マルチスレッド (/MT または /MTd) にする。
- _ATL_MIN_CRT は外しておく。
ビルドすると log4cpp.lib と log4cpp.dll が作成されるので...
「追加のインクルードディレクトリ」などに追加しちゃっても...
''VC++8(VS2005)以降でコンパイルできない場合''&br;
msvc6 の中にある log4cpp.dsp(log4cppDLL.dsp)をそのまま ...
なので、dsp をテキストエディタなどで開いて、これらの場所...
*** 使用してみる [#x2dbfb7e]
ライブラリへリンク。
#pragma comment( lib, "log4cpp.lib" )
ヘッダをインクルード。(log4cpp というディレクトリをインク...
#define LOG4CPP_HAVE_INT64_T
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/Win32DebugAppender.hh>
#include <log4cpp/SimpleConfigurator.hh>
これだけあれば足りると思う。フィルタを使う場合は次のヘッ...
#include <log4cpp/Filter.hh>
定義する。
static log4cpp::Category& logroot = log4cpp::Category::g...
static log4cpp::Category& logger = log4cpp::Category::ge...
ログだけなら logger だけでいいか。category には、アプリの...
で、初期化。
#ifdef(_DEBUG)
logroot.setPriority( log4cpp::Priority::DEBUG );
#else
logroot.setPriority( log4cpp::Priority::INFO );
#endif
log4cpp::Appender* pDebugAppender = new log4cpp::Win32De...
log4cpp::Appender* pFileAppender = new log4cpp::FileAppe...
logroot.addAppender(pDebugAppender);
logroot.addAppender(pFileAppender);
try {
log4cpp::SimpleConfigurator::configure( "sample.config"...
} catch(log4cpp::ConfigureFailure e) {
logroot.warn("FAILED: Loading %s: %s", "sample.config",...
}
出力レベルを設定して、インスタンスをつくって、設定ファイ...
sample.config は設定ファイルなので、ここに設定を書いてお...
例えばこんな感じ。
<sample.config>
# ログレベルの設定:
# priority {カテゴリ名} {ログレベル}
# 設定したログレベルはカテゴリ階層へカスケードされる。
priority root WARN
priority category DEBUG
# 書式の設定:
appender category pattern file debug.log %d [%c] %p - %m%n
root というカテゴリは WARN レベルまで、category というカ...
高 EMERG, FATAL(システムが使用不可)
↑ ALERT(ただちに行動を起こさなければならない)
CRIT(危険な状態)
ERROR(エラーの状態)
WARN(ワーニングの状態)
NOTICE(通常だが重要な状態)
↓ INFO(インフォメーションメッセージ)
低 DEBUG(デバッグレベルのメッセージ)
書式の意味は次の通り。
%% : %一個
%c : カテゴリ
%d : 日付と時刻
%m : メッセージ
%n : 改行
%p : プライオリティ
%r : レイアウトインスタンスが作られてからの時間(ミリ秒単...
%R : 1970年元旦からの秒数
%u : プロセスが起動してからのclock tics
%x : NDC
書式は、ソースで PatternLayout で設定することもできるっぽ...
ex) メッセージのみを出力する例
#include <PatternLayout.hh>
log4cpp::Appender* appender = new log4cpp::FileAppender(...
log4cpp::PatternLayout* layout = new log4cpp::PatternLay...
layout->setConversionPattern( "%m" );
appender->setLayout( layout );
設定しなければ、デフォルトで "%m%n" となる。
あとは、
logger.debug("ごにょごにょ");
logger.info("ほげほげ");
とかで出力する。
使い終わったらシャットダウン。
logger.shutdown();
logroot.shutdown();
*** フィルタの使い方 [#z83d2a27]
全てのログを書き出すのではなく、ピンポイントで欲しいもの...
といったことをしたいという要請が大抵の場合に出てくる。
そういうときに使うのがログフィルタ。
例えば、カテゴリ名でフィルタしたいときは、次のようなクラ...
#include <Filter.hh>
class CategoryFilter
: public log4cpp::Filter
{
public:
CategoryLogFilter( const std::string& category )
: m_category( category )
{
}
virtual ~CategoryLogFilter()
{
}
protected:
virtual log4cpp::Filter::Decision _decide( const log4...
{
if ( event.categoryName.find( m_category ) != std:...
return Filter::Decision::ACCEPT;
} else {
return Filter::Decision::DENY;
}
}
private:
std::string m_category;
};
_decide() メソッドをオーバーライドして、
その中で書き出したいログ種別の場合にACCEPTを返し、
それ以外の場合にDENYを返せば良いということ。
*** 自作 Appender [#e7e7bb6f]
パッケージには デフォルトでいくつかの標準的な Appender が...
ファイルや標準入出力以外にもログを出してみたいことがある。
そんなときは自分で Appender を作ってしまえばよろしい。
LayoutAppender を継承すれば、簡単に文字列を出力する Appen...
class CustomAppender : public log4cpp::LayoutAppender
{
public:
CustomAppender(const std::string& name)
: log4cpp::LayoutAppender(name)
{
}
virtual ~CustomAppender()
{
close();
}
virtual void close()
{
}
protected:
virtual void _append(const log4cpp::LoggingEvent& eve...
{
// TODO: ここをお好みに書き換える。
// これはデバッグウィンドウに文字列を出す例。
std::string message( _getLayout().format(event) );
::OutputDebugString( CString( message.c_str() ) );
}
};
ただ、log4cpp はアプリケーションとは別のスレッドで動作し...
例えばエディットコントロールなどに文字列を出力しようとす...
スレッドの同期処理が必要になる。
ウィンドウを持つアプリケーションの場合は、
メインウィンドウに対して PostMessage() で通知するのが一番...
通知する側:
virtual void _append(const log4cpp::LoggingEvent& eve...
{
// ウィンドウにポストする例。
std::string message( _getLayout().format(event) );
CString * msg = new CString( message.c_str() );
::PostMessage( hWnd, WM_XXX, 0, (LPARAM)(msg) );
}
メッセージはメインウィンドウの WindowProc() (DefWindowPro...
通知される側:
BOOL OnLogging( WPARAM wParam, LPARAM lParam )
{
CString * msg = (CString*)lParam;
CListBox::AddString( *msg );
delete msg;
}
いわずもがなだが、new したポインタの delete はお忘れなく。
*** 参考サイト [#c2ec8f7d]
- [[Log4cpp memo:http://www.argv.org/~chome/log4cpp.html]]
- [[いろいろ memo:http://www5d.biglobe.ne.jp/~y0ka/cat_lo...
- [[dot.diary:http://d.hatena.ne.jp/dot/20031111]]
- [[SDN(英語):http://developers.sun.com/solaris/articles/...
*** log4ファミリ [#sab73e5b]
- [[Ja-Jakarta Project:http://www.jajakarta.org/]]
-- [[log4j翻訳:http://www.jajakarta.org/log4j/]]
- [[log4j:http://www.ingrid.org/jajakarta/log4j/]]
- [[Log4J徹底解説:http://www.nurs.or.jp/~sug/soft/log4j/i...
- [[TKFM 80.0GHz Radio:http://tkfm.main.jp/wiki/]]
-- [[log4net:http://tkfm.main.jp/wiki/index.php?.NET%2Flo...
- [[CodeZine:http://codezine.jp/]]
-- [[log4net:http://codezine.jp/a/article.aspx?aid=71]]
- [[log4net(英語):http://logging.apache.org/log4net/]]
-----
[[プログラム・開発系メモ]]
終了行:
* log4cpp [#oa019ba0]
ログを吐き出すライブラリ。使い方をマスターすれば便利そう...
*** ソース [#j8807fbb]
ここからダウンロードできる。ソースなのでビルドして使わに...
- [[Log for C++:http://log4cpp.sourceforge.net/]]
- [[Log library for C++:http://sourceforge.net/projects/l...
*** ビルド [#d799f765]
Windows なので、VC++ 6 (.NET) などでビルドして使用する( ...
留意点
- マルチスレッド (/MT または /MTd) にする。
- _ATL_MIN_CRT は外しておく。
ビルドすると log4cpp.lib と log4cpp.dll が作成されるので...
「追加のインクルードディレクトリ」などに追加しちゃっても...
''VC++8(VS2005)以降でコンパイルできない場合''&br;
msvc6 の中にある log4cpp.dsp(log4cppDLL.dsp)をそのまま ...
なので、dsp をテキストエディタなどで開いて、これらの場所...
*** 使用してみる [#x2dbfb7e]
ライブラリへリンク。
#pragma comment( lib, "log4cpp.lib" )
ヘッダをインクルード。(log4cpp というディレクトリをインク...
#define LOG4CPP_HAVE_INT64_T
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/Win32DebugAppender.hh>
#include <log4cpp/SimpleConfigurator.hh>
これだけあれば足りると思う。フィルタを使う場合は次のヘッ...
#include <log4cpp/Filter.hh>
定義する。
static log4cpp::Category& logroot = log4cpp::Category::g...
static log4cpp::Category& logger = log4cpp::Category::ge...
ログだけなら logger だけでいいか。category には、アプリの...
で、初期化。
#ifdef(_DEBUG)
logroot.setPriority( log4cpp::Priority::DEBUG );
#else
logroot.setPriority( log4cpp::Priority::INFO );
#endif
log4cpp::Appender* pDebugAppender = new log4cpp::Win32De...
log4cpp::Appender* pFileAppender = new log4cpp::FileAppe...
logroot.addAppender(pDebugAppender);
logroot.addAppender(pFileAppender);
try {
log4cpp::SimpleConfigurator::configure( "sample.config"...
} catch(log4cpp::ConfigureFailure e) {
logroot.warn("FAILED: Loading %s: %s", "sample.config",...
}
出力レベルを設定して、インスタンスをつくって、設定ファイ...
sample.config は設定ファイルなので、ここに設定を書いてお...
例えばこんな感じ。
<sample.config>
# ログレベルの設定:
# priority {カテゴリ名} {ログレベル}
# 設定したログレベルはカテゴリ階層へカスケードされる。
priority root WARN
priority category DEBUG
# 書式の設定:
appender category pattern file debug.log %d [%c] %p - %m%n
root というカテゴリは WARN レベルまで、category というカ...
高 EMERG, FATAL(システムが使用不可)
↑ ALERT(ただちに行動を起こさなければならない)
CRIT(危険な状態)
ERROR(エラーの状態)
WARN(ワーニングの状態)
NOTICE(通常だが重要な状態)
↓ INFO(インフォメーションメッセージ)
低 DEBUG(デバッグレベルのメッセージ)
書式の意味は次の通り。
%% : %一個
%c : カテゴリ
%d : 日付と時刻
%m : メッセージ
%n : 改行
%p : プライオリティ
%r : レイアウトインスタンスが作られてからの時間(ミリ秒単...
%R : 1970年元旦からの秒数
%u : プロセスが起動してからのclock tics
%x : NDC
書式は、ソースで PatternLayout で設定することもできるっぽ...
ex) メッセージのみを出力する例
#include <PatternLayout.hh>
log4cpp::Appender* appender = new log4cpp::FileAppender(...
log4cpp::PatternLayout* layout = new log4cpp::PatternLay...
layout->setConversionPattern( "%m" );
appender->setLayout( layout );
設定しなければ、デフォルトで "%m%n" となる。
あとは、
logger.debug("ごにょごにょ");
logger.info("ほげほげ");
とかで出力する。
使い終わったらシャットダウン。
logger.shutdown();
logroot.shutdown();
*** フィルタの使い方 [#z83d2a27]
全てのログを書き出すのではなく、ピンポイントで欲しいもの...
といったことをしたいという要請が大抵の場合に出てくる。
そういうときに使うのがログフィルタ。
例えば、カテゴリ名でフィルタしたいときは、次のようなクラ...
#include <Filter.hh>
class CategoryFilter
: public log4cpp::Filter
{
public:
CategoryLogFilter( const std::string& category )
: m_category( category )
{
}
virtual ~CategoryLogFilter()
{
}
protected:
virtual log4cpp::Filter::Decision _decide( const log4...
{
if ( event.categoryName.find( m_category ) != std:...
return Filter::Decision::ACCEPT;
} else {
return Filter::Decision::DENY;
}
}
private:
std::string m_category;
};
_decide() メソッドをオーバーライドして、
その中で書き出したいログ種別の場合にACCEPTを返し、
それ以外の場合にDENYを返せば良いということ。
*** 自作 Appender [#e7e7bb6f]
パッケージには デフォルトでいくつかの標準的な Appender が...
ファイルや標準入出力以外にもログを出してみたいことがある。
そんなときは自分で Appender を作ってしまえばよろしい。
LayoutAppender を継承すれば、簡単に文字列を出力する Appen...
class CustomAppender : public log4cpp::LayoutAppender
{
public:
CustomAppender(const std::string& name)
: log4cpp::LayoutAppender(name)
{
}
virtual ~CustomAppender()
{
close();
}
virtual void close()
{
}
protected:
virtual void _append(const log4cpp::LoggingEvent& eve...
{
// TODO: ここをお好みに書き換える。
// これはデバッグウィンドウに文字列を出す例。
std::string message( _getLayout().format(event) );
::OutputDebugString( CString( message.c_str() ) );
}
};
ただ、log4cpp はアプリケーションとは別のスレッドで動作し...
例えばエディットコントロールなどに文字列を出力しようとす...
スレッドの同期処理が必要になる。
ウィンドウを持つアプリケーションの場合は、
メインウィンドウに対して PostMessage() で通知するのが一番...
通知する側:
virtual void _append(const log4cpp::LoggingEvent& eve...
{
// ウィンドウにポストする例。
std::string message( _getLayout().format(event) );
CString * msg = new CString( message.c_str() );
::PostMessage( hWnd, WM_XXX, 0, (LPARAM)(msg) );
}
メッセージはメインウィンドウの WindowProc() (DefWindowPro...
通知される側:
BOOL OnLogging( WPARAM wParam, LPARAM lParam )
{
CString * msg = (CString*)lParam;
CListBox::AddString( *msg );
delete msg;
}
いわずもがなだが、new したポインタの delete はお忘れなく。
*** 参考サイト [#c2ec8f7d]
- [[Log4cpp memo:http://www.argv.org/~chome/log4cpp.html]]
- [[いろいろ memo:http://www5d.biglobe.ne.jp/~y0ka/cat_lo...
- [[dot.diary:http://d.hatena.ne.jp/dot/20031111]]
- [[SDN(英語):http://developers.sun.com/solaris/articles/...
*** log4ファミリ [#sab73e5b]
- [[Ja-Jakarta Project:http://www.jajakarta.org/]]
-- [[log4j翻訳:http://www.jajakarta.org/log4j/]]
- [[log4j:http://www.ingrid.org/jajakarta/log4j/]]
- [[Log4J徹底解説:http://www.nurs.or.jp/~sug/soft/log4j/i...
- [[TKFM 80.0GHz Radio:http://tkfm.main.jp/wiki/]]
-- [[log4net:http://tkfm.main.jp/wiki/index.php?.NET%2Flo...
- [[CodeZine:http://codezine.jp/]]
-- [[log4net:http://codezine.jp/a/article.aspx?aid=71]]
- [[log4net(英語):http://logging.apache.org/log4net/]]
-----
[[プログラム・開発系メモ]]
ページ名: