Channel派生クラスの使い方
以下では、先ほどの一覧表で★マークをつけた、6つのChannel派生クラスの使い方をサンプルコードを交えて説明します。
ConsoleChannel
ConsoleChannelクラスは、コンソール画面(std::clog)、またはstd::ostreamに書き込むChannelクラスです。具体的な使い方は、先ほどのサンプルコードを参照してください。
コンストラクタ
コンストラクタの引数にstd::ostreamを指定することもできますが、使い道はあまりないかもしれません。ファイルに出力する場合は、次のFileChannelクラスを利用するほうが便利です。
FileChannel
FileChannelクラスは、ログメッセージをテキストファイルに書き込むChannelクラスです。単純にメッセージを追記して行く機能はもちろん、ログファイルを運用する機能も持っています。
| 機能名 | 概要 |
| ローテーション機能 | 特定の時間や、ファイルサイズでログファイルをリセットする機能。 |
| アーカイブ機能 | リセット前のファイルを保存しておく機能。ZIP圧縮も可能。 |
| 世代管理機能 | アーカイブしたログを自動で削除する機能。保持しておく期間を指定する。 |
サンプルコードは、次のようになります。各設定は、先ほどの説明で出てきたsetProperty関数を用います。
Poco::Logger& fileLogger = Poco::Logger::create( "FileLogger", new Poco::FileChannel("test.log"), Poco::Message::PRIO_INFORMATION ); // ローカル時刻指定 fileLogger.getChannel()->setProperty( Poco::FileChannel::PROP_TIMES, "local" ); // アーカイブに日付時刻文字付加 fileLogger.getChannel()->setProperty( Poco::FileChannel::PROP_ARCHIVE, "timestamp" ); // 圧縮あり fileLogger.getChannel()->setProperty( Poco::FileChannel::PROP_COMPRESS, "true" ); // 日単位でローテーション fileLogger.getChannel()->setProperty( Poco::FileChannel::PROP_ROTATION, "daily" ); // 5日間保持 fileLogger.getChannel()->setProperty( Poco::FileChannel::PROP_PURGEAGE, "5days" ); fileLogger.error( "エラーが発生しました" );
コンストラクタ
出力先のファイル名を指定します。省略した場合はPROP_PATHプロパティで指定します。
プロパティ
setProperty関数で設定可能なプロパティは次のとおりです。
| プロパティ | 設定内容 |
| PROP_PATH | ログファイル名。 |
| PROP_ROTATION | ローテートを開始する、日や時刻の設定、ログファイルの大きさの設定。 |
| PROP_ARCHIVE | アーカイブログファイル名に付加する文字列として連番か時刻かを指定。 |
| PROP_TIMES | 処理の時刻基準としてローカル時刻かUTC時刻かを指定。 |
| PROP_COMPRESS | アーカイブ時の圧縮有無の指定。 |
| PROP_PURGEAGE | アーカイブファイルの保持期間。 |
| PROP_PURGECOUNT | アーカイブファイルの作成数。 |
各プロパティの具体的な設定値などの詳細については、オンラインドキュメントを参照してください。
FormattingChannel
FormattingChannelクラスは、ログメッセージを、C言語で言うpritnfと同じような使い方で整形できるChannelクラスです。また、時刻のように定型的な文字列を付加することもできます。物理的に書き込むChannelオブジェクトの前に、メッセージを整形するChannelオブジェクトを設定します。
Poco::FormattingChannel* pFCFile = new Poco::FormattingChannel( new Poco::PatternFormatter("%Y-%m-%d %H:%M:%S.%c %N[%P]:%s:%q:%t") ); pFCFile->setChannel( new Poco::FileChannel("sample.log") ); Poco::Logger& fileLogger = Poco::Logger::create( "FileLogger", pFCFile, Poco::Message::PRIO_WARNING ); pFCFile->getFormatter()->setProperty( Poco::PatternFormatter::PROP_TIMES, "local" ); // ローカル時刻指定 fileLogger.critical( "重大なエラーが発生しました" ); fileLogger.fatal( "致命的なエラーが発生しました" );
結果
このサンプルを実行すると、次のようなログが出力されます。
2007-11-14 22:39:57.4 MYPC[2832]:FileLogger:C:重大なエラーが発生しました 2007-11-14 22:39:57.5 MYPC[2832]:FileLogger:F:致命的なエラーが発生しました
コンストラクタ
どういう書式で整形するかを定義したFormatterオブジェクトを設定します。なお、Loggingフレームワークで使えるFormatterクラスは、PatternFormatterというクラスのみです。
書き込み先のChannelオブジェクトは、メンバ関数のsetChannel関数で設定します。Loggerオブジェクトの生成時には、FormattingChannelオブジェクトを指定します。これで、Loggerオブジェクト→整形用Channelオブジェクト→書き込み先Channelオブジェクト、というリンク構造になります。各オブジェクトは右隣のオブジェクトへの参照ポインタを保持しています。
変換指定文字
PatternFormatterクラスで指定可能な、おもな変換指定文字は次のとおりです。
| 変換指定文字 | 変換後の文字列 |
| %s | メッセージ発行Loggerオブジェクト名 |
| %t | ログメッセージ文字列 |
| %l | 優先度文字列 (Fatal, Critical, Error, Warning, Notice, Information, Debug, Trace) |
| %q | 優先度文字列の頭1文字 |
| %P | プロセスID |
| %N | ホスト名 |
| %W | ログが書き込まれた曜日名 |
| %B | ログが書き込まれた月名 |
| %d | ログが書き込まれた日(01~31) |
| %m | ログが書き込まれた月(01~12) |
| %Y | ログが書き込まれた西暦(4桁) |
| %H | ログが書き込まれた時刻(00~23) |
| %M | ログが書き込まれた分(00~59) |
| %S | ログが書き込まれた秒(00~59) |
その他、書式指定の詳細については、オンラインドキュメントを参照してください。
