6

Logging Framework を使用しているときに、いくつかの問題に直面しています。次のような構成ファイルがあります。

# core channel
logging.channels.c1.class = FileChannel
logging.channels.c1.path = <somePath>/core.log
logging.channels.c1.archive = timestamp
logging.channels.c1.times = utc
logging.channels.c1.rotation = daily
logging.channels.c1.formatter.class = PatternFormatter
logging.channels.c1.formatter.pattern = %Y-%m-%d %H:%M:%S %s: [%p] %t

# core logger
logging.loggers.l1.name = core
logging.loggers.l1.level = information
logging.loggers.l1.channel = c1

私のプログラムは Poco::Util:ServerApplication フレームワークを使用しており、サブシステム スキーマの恩恵を受けています。複数のサブシステムがあり、それぞれが Poco::Logger::get("logger name") メソッドを使用して取得した Poco::Logger オブジェクトへの参照を格納しています。上記の構成ファイルに示されているように、ログ階層のルートとして「コア」ログを持つログ階層を使用しようとしています。次のコードは、各サブシステムで行っていることの例です。

Subsystem1::Subsystem1() :
   Poco::Util::Subsystem(),      
   logger_(Poco::Logger::get("core." + std::string(name()))),
        ...

Subsystem2::Subsystem2() :
   Poco::Util::Subsystem(),      
   logger_(Poco::Logger::get("core." + std::string(name()))),
        ...

それはロギングのために機能します。プロパティ ファイルから構成を継承し、サブシステムごとに異なる Poco::Message ソース名が付けられるため、ログ エントリがどのサブシステムからのものかを簡単に識別できるため、これは素晴らしいことです。

ロガーのインスタンスのプロパティを変更しようとすると (たとえば、Subsystem1 のロガーから)、問題が発生します。たとえば、チャネルのパスを変更すると、その変更は階層全体に伝播されます。次のコードは、この問題を示しています。

Poco::Logger& subsystem1Logger = Poco::Logger::get("core.Subsystem1");
Poco::Logger& subsystem2Logger = Poco::Logger::get("core.Subsystem2");
subsystem1Logger.getChannel()->close(); //without this, the change to the channel's   path does nothing
subsystem1Logger.getChannel()->setProperty("path", <someOtherPath>/core2.log); // Ok, it's changed
poco_information(subsystem1Logger "some message"); // Ok, it logs to  <someOtherPath>/core2.log
poco_information(subsystem2Logger "some message"); // NOT OK, it also logs to  <someOtherPath>/core2.log instead of  <somePath>/core.log

Poco::Logger クラスのヘッダー ファイルに「ロガーが作成され、祖先からチャネルとレベルを継承すると、ロガーへの接続が失われる」と記載されているため、混乱しています。ロガーのレベルまたはチャネルは、その子孫には影響しません。」

ちなみに私のルートロガー(コア)も変更の影響を受けています。

何か不足していますか?ありがとう。

Poco ライブラリのバージョン: 1.5.1

4

1 に答える 1

4

ロガーとチャネルの間で混乱していると思います。

ロガー Core Core.Subsystem1 Core.Subsystem2

これらは作成時に Core のコピーであるため、すべて同じチャネル c1 に接続されます。

Logger.getChannel() 関数で変更するのはチャネル c1 です。

ロガーが異なるチャネルに接続されている場合、アプローチは機能します。

于 2015-05-27T13:56:22.433 に答える