何らかの方法で、誰もがプログラムにロギングシステムを組み込む必要がありました。 多くの人が自分で書きます
他の最も最適なもの
よりもスマートであると考え
てください 。 他の人は、生活を大幅に簡素化できる既製のライブラリを使用します。
今日、パンテーオスのロギングライブラリについてお話ししたいと思います。作成者によると、このライブラリは
非常に高速で 、マルチスレッド、Unicodeをサポートし、異なるログ受信者への同時出力を備えています。
総論
t.zのロガーを検討します。 Windowsで、Visual Studio 2010 SP1に付属のコンパイラーを使用して、ログをUTF-16LE(ファイル内)に保存し、同時にペイントでコンソールに出力したい場合に使用します。 国別アルファベットでの出力をサポートするために、スキーヤーにUnicodeモードでログを出力できることも重要です。
この記事は、初心者向けと、ライブラリをすばやく理解するために書かれています。
図書館
図書館集会
したがって、アセンブリには実際のソースファイルpantheiosおよびstlsoftが必要です。
最初のものは
ここからダウンロードでき、STLSoft STL
はここからダウンロードでき
ます 。
明確にするために、pantheios-1.0.1-beta211およびstlsoft-1.9.108の最新の安定したソースバージョンを使用しました。
結果のソースをC:\ tempで解凍し、アセンブリを続行します。
VS2010コンソールを起動し、STLSOFT環境変数を指定してアセンブリを実行します。
>SET STLSOFT=c:\temp\stlsoft-1.9.108\
>cd C:\temp\pantheios-1.0.1-beta211\build\vc10
>nmake 2>&1 > out.log
すべてが集まる間、煙が出ます。
結果は
c:\temp\pantheios-1.0.1-beta211\bin\ --
c:\temp\pantheios-1.0.1-beta211\lib\ --
c:\temp\pantheios-1.0.1-beta211\include\ -- include
libを簡単に見ると、さまざまなビルドモードでコンパイルされた多数のライブラリを見ることができます。
しかし、ロガーの動作モードを選択するためのユーティリティを書いた親切な人々がいます。これは、ライブラリとヘッダーのこのスープセットを機能するロガーに変える方法の良い手がかりを与えます。
簡単にアーキテクチャについて
ライブラリは、実際にはレイヤーのチェッターに分割されています。
- コア
- アプリケーション用のAPI
- フロントエンド
- バックエンド
コアは、ライブラリの他のすべての部分の接続部分です。
アプリケーションのAPIは、アプリケーションのログに直接出力するために直接使用できる関数のセットです。
フロントエンド -ログレベルごとにメッセージを表示しようとするフィルタリングを行うサブシステム。
バックエンド -特定の受信者(ファイル、コンソール、syslogなど)へのメッセージの出力と、この受信者の構成(出力形式など)を担当するサブシステム。
アーキテクチャの詳細について
は、プロジェクト自体をご覧ください。
作業テスト
次のように環境変数を追加し、VS2010を実行します。
>set PANTHEIOS_ROOT=c:\temp\pantheios-1.0.1-beta211\
>set STLSOFT=c:\temp\stlsoft-1.9.108\
>devnev.exe
標準のC ++コンソールプロジェクトを作成し、環境変数を通じてライブラリを表示できるようにプロジェクトを構成しましょう。
テストの実際の記述を行う時間です。
思い出したように、タスクは以前に設定されていました。ログとカラフルなコンソールに同時にUTF-16で出力されました。
これらの目的のために、あなたと私は、cosnolとファイルの2つのバックエンドを使用する必要があります。 バックエンドとフロントエンドの両方を、事前に準備されたインクルードファイルを使用してプログラムに接続できます。 これにより、ロギングの構成が大幅に簡素化されます。
構成をさらに簡素化するために、必要なヘッダーの組み合わせを選択できるユーティリティが作成されました。
ここで取ることができ
ます 。 外部インターフェイスは非常にシンプルです。
実際、スクリーンショットは必要なオプションのみを示しています。
簡単に説明してください:
- フロントエンドブロックは、「シンプルなフロントエンド」を定義します-これは、ロギングレベルで何もフィルタリングしないフロントエンド「fe.simple」です。
- バックエンドブロックは、受信メッセージストリームをファイルとWindowsコンソールの2つに分割するバックエンド「be.lrsplit」を定義します。
残りは直感的だと思います。
これで、ユーティリティが生成したものをコピーして修正できるようになりました(はい、彼女はbe.ltsplitの選択を間違えました。おそらく、それが保存されていたファイルの名前が変更され、ユーティリティでは考慮されませんでした)。 また、インクルードを核に直接追加する必要があります。
その結果、次のファイルが取得されます。
#include <pantheios/pantheios.hpp> #include <pantheios/inserters/args.hpp> #include <pantheios\backends\bec.file.h> #include <pantheios/implicit_link/core.h> #include <pantheios/implicit_link/util.h> #include <pantheios/implicit_link/fe.simple.h> #include <pantheios/implicit_link/be.lrsplit.h> #include <pantheios/implicit_link/bel.file.h> #include <pantheios/implicit_link/ber.WindowsConsole.h>
次に、fe.simpleが追加のアプリケーション名を必要とすることを考慮に入れる必要があります(ログファイルに記録するため)。
これを行うには、変数を宣言します。
extern "C" const TCHAR PANTHEIOS_FE_PROCESS_IDENTITY[] = L"MyMegaLogger";
さて、実際にテストを実装します。
void testfoo(void*) { for(int i=0;i<10;++i) { try { pantheios::log_DEBUG(TEXT(", UTF16?")); pantheios::log_DEBUG(TEXT("debug")); pantheios::log_INFORMATIONAL(TEXT("informational")); pantheios::log_NOTICE(TEXT("notice")); pantheios::log_WARNING(TEXT("warning")); pantheios::log_ERROR(TEXT("error")); pantheios::log_CRITICAL(TEXT("critical")); pantheios::log_ALERT(TEXT("alert")); pantheios::log_EMERGENCY(TEXT("EMERGENCY")); } catch(std::bad_alloc&) { pantheios::log_ALERT(TEXT("out of memory")); } catch(std::exception& x) { pantheios::log_CRITICAL(TEXT("Exception: "), x); } catch(...) { pantheios::logputs(pantheios::emergency, TEXT("Unexpected unknown error")); } } } int _tmain(int argc, _TCHAR* argv[]) { pantheios::log(pantheios::debug, TEXT("Entering main("), pantheios::args(argc, argv, pantheios::args::arg0FileOnly), TEXT(")")); pantheios_be_file_setFilePath(TEXT("local.log"), PANTHEIOS_BE_FILE_F_TRUNCATE, PANTHEIOS_BE_FILE_F_TRUNCATE, PANTHEIOS_BEID_LOCAL); for(int i=0;i<5;++i){ _beginthread(testfoo, 0, NULL); } std::cin.get(); return EXIT_SUCCESS; }
結果を取得します。
そして、
local.logファイル内の同様の(ただし、色なし)。
おわりに
pantheiosロガーの非常に基本的な部分を調べましたが、まだ多くの興味深いことがあります。
利点には、速度、すぐに使えるUnicodeサポート、クロスプラットフォーム、タイプセーフが含まれます。
マイナス面のうち、ファイルからかなり混乱した使用手順とサポートされていない構成を選び出します。 ただし、多くの場合、これらのマイナスは無視できます。
船外では、他のロガーとの比較、高度な設定(出力形式)があります。これは別のメモに表示される可能性があります。
最後まで読んで、良い週末を過ごした人々に感謝します!