2013-05-14 2 views
5

Je rencontre des problèmes lors de l'utilisation de Logging Framework. J'ai un fichier de configuration comme suit:Problèmes avec la hiérarchie des loggers dans 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 

Mon programme utilise Poco :: Util: cadre ServerApplication, bénéficiant du schéma de sous-systèmes. J'ai plusieurs sous-systèmes, et chacun stocke une référence à un objet Poco :: Logger, obtenu en utilisant la méthode Poco :: Logger :: get ("nom du logger"). J'essaye d'employer pour employer la hiérarchie de notation, ayant le journal de «noyau», comme montré dans le fichier de configuration ci-dessus, en tant que racine de ma hiérarchie de notation. Le code suivant illustre ce que je fais dans chaque 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()))), 
     ... 

Cela fonctionne pour la journalisation. C'est bien parce que j'ai hérité de la configuration du fichier de propriétés, et chaque sous-système aura un nom de source Poco :: Message différent, ce qui facilitera l'identification du sous-système duquel provient l'entrée de journalisation.

Le problème survient lorsque j'essaie de modifier une propriété d'une instance d'un enregistreur (par exemple, à partir de l'enregistreur du sous-système 1). Si je change le chemin de son canal, par exemple, le changement est propagé à l'ensemble de la hiérarchie. Le code suivant démontre la question:

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 

Je suis confus, parce qu'il est indiqué dans le fichier d'en-tête de la Poco :: classe Logger que « Une fois qu'un enregistreur a été créé et il a hérité du canal et le niveau à partir de son ancêtre, il perd la connexion à celui-ci.Alors les changements au niveau ou au canal d'un enregistreur n'affectent pas ses descendants ". Par ailleurs, mon enregistreur racine (core) est également affecté par le changement.

Ai-je raté quelque chose? Merci.

Version Poco Bibliothèque: 1.5.1

Répondre

3

Je pense que vous se confondre entre un enregistreur et un canal.

Les enregistreurs de base Core.Subsystem1 Core.Subsystem2

sont tous attachés au même canal c1, parce qu'ils sont une copie de base lors de leur création.

C'est le canal c1 que vous modifiez via la fonction Logger.getChannel().

Si les enregistreurs étaient connectés à des canaux différents, votre approche fonctionnerait.

+2

Pour résoudre ce problème, attribuez un canal distinct à chaque enregistreur. Réglez-le en utilisant 'subsystem2Logger.setChannel (......);' avec un nouveau canal. Il y a des exemples dans la [Présentation de la journalisation] (http://pocoproject.org/slides/110-Logging.pdf). –

Questions connexes