2013-05-14 13 views
5

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

Odpowiedz

3

myślę, że są coraz mylić pomiędzy rejestratorem i kanałem.

Rejestratory rdzeniowe Core.Subsystem1 Core.Subsystem2

są podłączone do tego samego kanału c1, ponieważ są one kopią Rdzenia, gdy są one tworzone.

To kanał c1, który zmienia się za pomocą funkcji Logger.getChannel().

Jeśli rejestratory były podłączone do różnych kanałów, to Twoje podejście działałoby.

+2

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). –