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