総論
VisualStudio 2010 SP1を使用して、Windowsプラットフォームでライブラリを構築および操作するプロセスを検討しています。 ログは、いつものように、コンソールとファイルの両方に保存したいです。 ログに国のアルファベットの類似文字(ユニコードを読む)が含まれている可能性があることを特に強調する価値があります。
この記事は初心者を対象としており、ライブラリの詳細な調査ではなく、クイックスタートのための資料が含まれています。
図書館
- 図書館のウェブサイト: http : //logging.apache.org/log4cxx/index.html
- ライセンス:Apacheライセンス、バージョン2.0
- 依存:Apache Portable Runtime(APR)( http://apr.apache.org/ )
- 必要なアセンブリ:sed(GNU Utilsから)
組立
最初に、依存関係とライブラリ自体をダウンロードする必要があります。 良い場合は、 SVNプロジェクトからダウンロードする必要があります。 コミットから判断すると、バグは修正されましたが、何らかの理由で、リスクを負わず、安定版0.10.0で試してみることにしました。
さあ、行こう!
ダウンロード:
: www.apache.org/dyn/closer.cgi/logging/log4cxx/0.10.0/apache-log4cxx-0.10.0.tar.gz
APR: apr.apache.org/download.cgi ( APR 1.4.2, APR-util 1.3.10 , APR iconv 1.2.1)
Sed: sourceforge.net/projects/gnuwin32/files//sed/4.2.1/sed-4.2.1-bin.zip/download
Sed:
sourceforge.net/projects/gnuwin32/files/libintl/0.14.4/libintl-0.14.4-bin.zip/download
sourceforge.net/projects/gnuwin32/files/libiconv/1.9.2-1/libiconv-1.9.2-1-bin.zip/download
sourceforge.net/projects/gnuwin32/files/regex/2.7/regex-2.7-bin.zip/download
Fuf、最も難しい部分は後ろにあります...
開梱:
- Cのソース:\ temp \ log4cxx_test \ apache-log4cxx-0.10.0 \
- CのAPR:\ temp \ log4cxx_test \ apr \(アーカイブフォルダの名前を変更することを忘れないでください)
- CのAPR Util:\ temp \ log4cxx_test \ apr-util \(アーカイブフォルダーの名前を変更することを忘れないでください)
- CのAPR:\ temp \ log4cxx_test \ apr-util \(アーカイブフォルダーの名前を変更することを忘れないでください)
マシンにsedは必要ありませんが、構成スクリプトに必要です。C:\ temp \ log4cxx \ apache-log4cxx-0.10.0 \をドロップして、依存するすべてのdllファイルを配置する必要があります。 麻酔薬は、将来sedが必要な場合、%SystemRoot%\ System32 \にsedとdllの両方をスローできます。
次に:コマンドラインVS2010を実行し、ディレクトリCに移動します:\ temp \ log4cxx \ apache-log4cxx-0.10.0 \順番に実行します。
>configure
>configure-aprutil
エラーはないはずです。
それはアセンブリ自体の番でした。 ここでは、スタジオ自体(devenv)を起動してc:\ temp \ log4cxx \ apache-log4cxx-0.10.0 \ projects \ log4cxx.dswを開く価値があります。 スタジオからプロジェクトの変換を求められますが、これが必要です。
ビルドを押しますが、お茶を飲みに行きません。 アセンブリプロセスは、約300マイルのエラーですぐに終了します。 LOG4CXX_LIST_DEFマクロに誓います。 このようなマクロはすべて、クラスの前にレンダリングする必要があります(クラス内で宣言されます)。
これらのエラーを削除すると、不明なstd :: insert_iteratorに関連するエラーが発生します。ファイルの先頭に#include <iterator>を追加するだけです。
次に、KeySetの不確実性に関するエラーが表示されます。そのようなエラーはすべて変更する必要があります(例)。
LoggingEvent::KeySet set;
KeySet set;
(クラスの外部でこれらの同じキーセットを形成するマクロを削除したため)。
この「シャーマニズム」の後、アセンブリは成功しますが、一部の機能の不確実性に関するメッセージでリンクが「失敗」します。 スタジオは、変換時にプロジェクト内の必要なファイルへのリンクを作成するのを忘れただけです。
それらは単にlog4cxxプロジェクトのプロパティに追加する必要があります(一度だけのビルドの期間にのみこれを必要とするため、絶対に簡単にするためにパスをハードコーディングしました):
その後、リンクが機能します。
簡単にアーキテクチャについて
log4cxxは、アペンダー、レイアウト、およびターゲットの概念で動作します。
appender-受信者(ターゲット)メッセージフロー(本質的に行のログ)のパラメーターセットを定義し、レイアウトへのリンクを含みます。レイアウトへのリンクは、メッセージのフォーマットのルールを決定します。
プロジェクトのウェブサイトでアーキテクチャの詳細をご覧ください 。
テスト作業
環境変数を介して同様の基本ライブラリをプログラムにドラッグすることを好みます(ただし、ライブラリの異なるバージョンで作業するため、ユーザーの環境変数として定義しないようにしています)。 したがって、コマンドラインVS2010を実行すると、次のようになります。
>SET LOG4CXX=C:\temp\log4cxx\apache-log4cxx-0.10.0\src\main\include\
>SET LOG4CXXLIB=C:\temp\log4cxx\apache-log4cxx-0.10.0\projects\Debug\
>devnenv
(リリース用にデバッグモードで収集しましたが、もちろん、パスは少し異なります)。
次に、簡単なC ++コンソールアプリケーションプロジェクトを作成します-これがテストプロジェクトになります。
その中で、環境変数に従って、プロジェクトのセットアップで一般的なインクルードファイルとライブラリへのパスを追加します。
およびリンク用:
必要なインクルードを追加する番です:
//apache log4cxx #pragma warning(push) #pragma warning(disable: 4231 4250) //warning C4231: nonstandard extension used : 'extern' before template explicit instantiation c:\libs\apache\apache-log4cxx-0.10.0\src\main\include\log4cxx\rolling\timebasedrollingpolicy.h 221 p2jbTestApp //warning C4250: 'log4cxx::rolling::TimeBasedRollingPolicy' : inherits 'log4cxx::rolling::RollingPolicyBase::log4cxx::rolling::RollingPolicyBase::setOption' via dominance #include <log4cxx/rolling/rollingfileappender.h> #include <log4cxx/logger.h> #include <log4cxx/consoleappender.h> #include <log4cxx/logmanager.h> #include <log4cxx/patternlayout.h> #include <log4cxx/rolling/timebasedrollingpolicy.h> #include <log4cxx/helpers/simpledateformat.h> #include <log4cxx/helpers/stringhelper.h> #include <log4cxx/xml/domconfigurator.h> #pragma warning(pop)
次に、構成ファイルを作成する必要があります。 私はこのようにしました:
<?xml version="1.0" encoding="UTF-8" ?> <!-- debug="true" --> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" > <appender name="ConsoleAppender" class="org.apache.log4j.ConsoleAppender"> <param name="Target" value="System.out"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %level %c{2}#%M %F:%L - %m%n"/> </layout> </appender> <appender name="DailyRollingFileAppender" class="org.apache.log4j.rolling.DailyRollingFileAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %level %c{2}#%M %F:%L - %m%n"/> </layout> <param name="Encoding" value="UTF-16" /> <param name="file" value="logfile.log"/> <param name="DatePattern" value="'.'yyyy-MM-dd" /> <param name="append" value="true"/> </appender> <root> <priority value="all" /> <appender-ref ref="DailyRollingFileAppender"/> <appender-ref ref="ConsoleAppender"/> </root> </log4j:configuration>
log4jのドキュメントで詳細を読むことができます。 ファイル形式は「ほぼ一致」。
さて、テストプログラムの下:
void foo(void*) { log4cxx::LoggerPtr logger = log4cxx::Logger::getRootLogger(); for(int i=0;i<10;++i){ LOG4CXX_DEBUG((logger), L"debug" << L"other debug message"); LOG4CXX_TRACE((logger), L"trace"); LOG4CXX_INFO((logger), L", !"); LOG4CXX_WARN((logger), L"WARN"); LOG4CXX_ERROR((logger), L"error"); LOG4CXX_FATAL((logger), L"FATAL"); } } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "Russian_Russia.OCP"); // TCHAR selfName[MAX_PATH]; HMODULE hModule = GetModuleHandle(NULL); GetModuleFileName(hModule, selfName, _countof(selfName)); std::wstring configFile(selfName); configFile.append(L".logconfig"); log4cxx::xml::DOMConfigurator::configure(configFile); for(int i=0;i<10;++i){ _beginthread(foo,0,NULL); } std::cin.get(); return 0; }
使用の「トリック」に注意してください。
LOG4CXX_DEBUG((logger), L"debug" << L"other debug message");
「仕組み」サイクルから。 事実は、マクロの2番目の引数がストリーム入力に渡されるためです。そのため、演算子<<を使用して、テキストだけでなく複数のメッセージをここに書き込むことができます。
おわりに
簡単な例を使用して、log4cxxのアセンブリと基本的なセットアップを調べました。
ライブラリの利点の中でも、設定ファイル、カスタマイズ可能な「アウトオブボックス」(出力ファイルのさまざまなエンコーディングを含む)を通じてカスタマイズ性を強調する価値があります。
マイナスの点として、アセンブリの相対的な複雑さに注目する価値があります。また、ライブラリが流れており、それほど高速ではないとも言います。
このトピック以外は、高度な設定、他のロガーとの比較、「リークの神話」の検証などです。
素敵なログを記録してください!