SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

オープンソースC++用クラスライブラリPOCO活用講座

5分で使えるLoggingフレームワーク - POCO::Foundation -

オープンソースC++用クラスライブラリPOCO活用講座(2)

Channel派生クラスの使い方

 以下では、先ほどの一覧表で★マークをつけた、6つのChannel派生クラスの使い方をサンプルコードを交えて説明します。

ConsoleChannel

 ConsoleChannelクラスは、コンソール画面(std::clog)、またはstd::ostreamに書き込むChannelクラスです。具体的な使い方は、先ほどのサンプルコードを参照してください。

コンストラクタ

 コンストラクタの引数にstd::ostreamを指定することもできますが、使い道はあまりないかもしれません。ファイルに出力する場合は、次のFileChannelクラスを利用するほうが便利です。

FileChannel

 FileChannelクラスは、ログメッセージをテキストファイルに書き込むChannelクラスです。単純にメッセージを追記して行く機能はもちろん、ログファイルを運用する機能も持っています。

機能一覧
機能名概要
ローテーション機能特定の時間や、ファイルサイズでログファイルをリセットする機能。
アーカイブ機能リセット前のファイルを保存しておく機能。ZIP圧縮も可能。
世代管理機能アーカイブしたログを自動で削除する機能。保持しておく期間を指定する。

 サンプルコードは、次のようになります。各設定は、先ほどの説明で出てきたsetProperty関数を用います。

FileChannelのサンプルコード
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オブジェクトを設定します。

FormattingChannelのサンプルコード
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)

 その他、書式指定の詳細については、オンラインドキュメントを参照してください。

次のページ
最後に

この記事は参考になりましたか?

オープンソースC++用クラスライブラリPOCO活用講座連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 高江 賢(タカエ ケン)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1901 2007/12/05 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー