2013-05-14 11 views
5

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

Antwort

3

Ich glaube, Sie werden immer zwischen einem Logger und einem Kanal verwechselt.

Der Logger Kern Core.Subsystem1 Core.Subsystem2

sind alle auf den gleichen Kanal c1 angebracht, weil sie eine Kopie der Core sind, wenn sie erstellt werden.

Es ist der Kanal c1, den Sie über die Funktion Logger.getChannel() ändern.

Wenn die Logger an verschiedene Kanäle angeschlossen waren, würde Ihr Ansatz funktionieren.

+2

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

Verwandte Themen