1

今私は持っています:

  • 一般的な静的ライブラリと動的 DLL を使用する、マルチスレッドWindows サービス。C++
  • 各スレッドは異なるタスクを実行し、異なるエラー (DB エラー、関数呼び出しエラーなど) を生成します。各スレッドはさらに として機能しますlogger client(そして、すべてのメッセージを に送信しますlogger server)。
  • 本体はまだありませんが、からのすべてのログ メッセージを処理するためのとして機能する別のスレッドです。logger serverlogger clients

次のアイデアを実用的なソリューションに実装する方法について、良いアドバイスが必要です。アイデアは、次の要件を備えたマルチスレッド サーバーにサーバー クライアント ロギング アーキテクチャを追加することです (一部の部分は自分で実装する必要がありますが、 と の基本的なアイデアだけを考慮してくださいlogger client) logger server

  1. たくさんあるはずですlog clients(既に述べたように、これlog clientは既存の作業スレッドにすぎません)。それぞれが一意の名前または IDを持つエンティティを登録し、次の動作を行う必要があります。

    • logger serverが稼働していて、現在動作している場合、log clientログ メッセージの送信が開始されます。

    • それ以外の場合(logger serverがダウンしている場合)、 は短いタイムアウトを使用してlog clientに自分自身を登録しようと無限に試みます。log server

  2. logger server次の動作を持つが存在する必要があります。

    • log serverすべてlog clientsを一意の名前または/IDで登録し、登録する新しいログクライアントが表示されるかどうかを際限なくチェックします

    • ログサーバーは、異なるものからのすべてのメッセージを処理し log clients、DB、ファイルなどに書き込みます。

    • 外部アプリケーションからへの接続を確立する機会 が必要です(たとえば、すべてのスレッド アクティビティ/エラー/その他を監視するMySuperThreadViewerProgram )。接続時に、は外部アプリケーションをもう 1 つの と見なす必要があります。最も重要な要件です。log serverlog server log client

要約すると、実装するアーキテクチャ部分は 3 つあります。

  1. サーバー クライアントロガー アーキテクチャ。
  2. log clientsとの間のメッセージ キュー機能log server。また、登録できる利用可能なログ クライアントがあるかどうかlog server を定期的にチェックします。
  3. log serverと外部アプリケーションの間のプロセス間通信log client。後者は新しい として機能します。

logger serverを一種のログ メッセージ ルーターと見なすことに注意してください。

したがって、主な質問は次のとおりです。

上記のすべての機能を備えたソリューション(ソフトウェアフレームワーク)はありますか(これは非常に望ましい)、またはパーツごとに異なるライブラリを使用する必要がありますか?

答えが「そのような解決策はありません」の場合、私が行った選択を見直していただけますか。

  • #1の場合:Pantheiosロガーフレームワークを使用。
  • #2の場合:サーバークライアントアーキテクチャとメッセージキューサポートを備えたあらゆる種類の登録購読ライブラリを使用する(更新ipcライブラリ);
  • #3: Boost.Interprocess を使用- SharedMemoryを使用。

アップデート:

#2 の良い例は、この ipc ライブラリです。logger client - logger server リレーションの説明が少し間違っていたかもしれませんが、私が実際に意味するのは、アプローチに似ており、完全に説明され、ipcライブラリに実装されています。 )。そして、この手法の一種を使用して、ロギング アーキテクチャを実装したいと考えています。しかし、どのように?


更新 2:

OSはWindowsです。ええ、知っています。Linux には、便利なツールとフレームワーク (D-Bus、Syslog) がたくさんあります。役に立つクロスプラットフォーム ライブラリへのリンクを提供してくれる人がいるかもしれません。Windows でD-Bus を介したロガー フレームワークがあるのではないでしょうか?


どんなコメントでも大歓迎です。

どうもありがとう!

4

3 に答える 3

1

ØMQ (ZeroMQ) は、要件に沿った多くの機能を備えているため、言及した ipc ライブラリの実行可能な代替手段になる可能性があります。

PUB/SUB モデルを完全にサポートし、スレッド間、プロセス間、さらにはマシン間での作業を可能にします。これはクライアント サーバー アーキテクチャであり、メッセージ キューであり、IPC としても機能します。

もちろん、メッセージをコーディングおよびデコードする特定の方法が必要です。プロトコル バッファは確かに優れたアイデアです。

于 2012-05-25T09:24:56.380 に答える
0

私の知る限り、ロギングバックエンドpantheiosが使用するもの(つまり、ログシンク:DB、ファイルなど)はリンク時に指定されます。バックエンドに送られるログの重大度は、起動時に指定でき、実行時にもいくつかの簡単な調整を行うことができます。

私が正しければ、複数のワーカースレッドが実行されている1つのプロセス(外部アプリケーションについては少しだけ忘れましょう)があります。これらのスレッドの一部は、共通のバックエンド(DBなど)にログを記録し、一部は別のスレッドにログを記録する必要があります。pantheiosはこれをすぐに実行できないため、ログを正しいバックエンドにルーティングできるカスタムバックエンドを作成する必要があります。

メモリ消費が問題ではなく、最速のロギングパフォーマンスが必要ない場合は、log4cxxを調べることをお勧めします。これは、高度に構成可能であり、すべての同期を備えたクライアントサーバーアーキテクチャの実装を免れる可能性があるためです。それがもたらす問題。

外部アプリケーションについて:外部クライアントが1つだけであることを保証できる場合は、パイプメカニズムを使用してサービスと通信できます。サービスプロセスには、サーバースレッドに対応する別のスレッドがあり、名前付きパイプを開き、ログシンクとして指定して、ワーカースレッドが他のログシンク(DB、ファイル)と同様にログに記録できるようにします。等。)。

于 2012-05-23T09:25:51.453 に答える