Ich habe einige Probleme mit dem Logging Framework. Ich habe eine Konfigurationsdatei wie folgt:Probleme mit der Logger-Hierarchie in 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
Mein Programm verwendet Poco :: Util: Serveranwendung Rahmen, aus dem Subsysteme Schema profitieren. Ich habe mehrere Subsysteme und jedes speichert einen Verweis auf ein Poco :: Logger-Objekt, das mit der Methode Poco :: Logger :: get ("Loggername") erhalten wurde. Ich versuche zu verwenden, um die Protokollhierarchie, mit dem "Kern" -Log, wie in der Konfigurationsdatei oben gezeigt, als das Stammverzeichnis meiner Protokollierungshierarchie. Der folgende Code veranschaulicht, was ich in jedem susbsystem so mache:
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()))),
...
Das für die Anmeldung funktioniert. Es ist nett, weil ich die Konfiguration von der Eigenschaftendatei geerbt habe und jedes Subsystem einen anderen Poco :: Message-Quellennamen hat, wodurch es einfach ist zu identifizieren, von welchem Subsystem der Logging-Eintrag kommt.
Das Problem tritt auf, wenn ich versuche, eine Eigenschaft einer Instanz eines Loggers zu ändern (z. B. aus dem Logger des Subsystems1). Wenn ich zum Beispiel den Pfad des Kanals ändere, wird die Änderung an die gesamte Hierarchie weitergegeben. Der folgende Code demonstriert die Frage:
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
Ich bin verwirrt, weil es in der Header-Datei der Poco :: Logger-Klasse angegeben wird, dass „Einmal ein Logger erstellt wurde, und es hat den Kanal und die Ebene übernommen von seinem Vorfahren verliert er die Verbindung zu ihm. So ändern Änderungen an der Ebene oder dem Kanal eines Loggers seine Nachkommen nicht ".
Übrigens ist mein Root-Logger (Kern) auch von der Änderung betroffen.
Fehle ich etwas? Danke.
Poco-Bibliothek Version: 1.5.1
Um dies zu beheben, geben Sie jedem Logger einen separaten Kanal. Stellen Sie es mit 'subsystem2Logger.setChannel (......);' mit einem neuen Kanal ein. Es gibt Beispiele in der [Logging-Präsentation] (http://pocoproject.org/slides/110-Logging.pdf). –