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