Mam do czynienia z niektórymi problemami podczas korzystania z Logging Framework. Mam plik konfiguracyjny w następujący sposób:Problemy z hierarchią rejestratorów w Poco 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
Mój program używa Poco :: Util: ramy ServerApplication, korzystając ze schematu podsystemów. Mam wiele podsystemów i każdy przechowuje odwołanie do obiektu Poco :: Logger, uzyskanego przy użyciu metody Poco :: Logger :: get ("nazwa loggera"). Próbuję użyć do użycia hierarchii dzienników, mając logiczny "rdzeń", jak pokazano w powyższym pliku konfiguracyjnym, jako katalog główny mojej hierarchii rejestrowania. Poniższy kod ilustruje to, co robię w każdym systemie susbsystem:
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()))),
...
To służy do logowania. To miłe, ponieważ odziedziczyłem konfigurację z pliku właściwości, a każdy podsystem będzie miał inną nazwę źródła Poco :: Message, dzięki czemu można łatwo zidentyfikować, z którego podsystem pochodzi wpis logujący.
Problem pojawia się, gdy próbuję zmienić właściwość wystąpienia programu rejestrującego (na przykład z programu rejestrującego podsystem1). Jeśli na przykład zmieniam ścieżkę kanału, zmiana jest propagowana do całej hierarchii. Poniższy kod wykazać problem:
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
Jestem zdezorientowany, ponieważ jest zawarta w pliku nagłówkowym klasy Poco :: Logger, że „Gdy rejestrator został stworzony i odziedziczył kanału oraz poziom od swojego przodka, traci połączenie z nim, więc zmiany poziomu lub kanału rejestratora nie wpływają na jego potomków ".
Nawiasem mówiąc, mój root logger (core) również podlega zmianom.
Czy brakuje mi czegoś? Dzięki.
wersja Poco Biblioteka: 1.5.1
Aby to naprawić, nadaj każdemu rejestratorowi osobny kanał. Ustaw go za pomocą 'subsystem2Logger.setChannel (......);' z nowym kanałem. Istnieją przykłady w [Logging presentation] (http://pocoproject.org/slides/110-Logging.pdf). –