gpt4 book ai didi

c++ - Poco Logging Framework 中记录器层次结构的问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:38:11 25 4
gpt4 key购买 nike

我在使用日志框架时遇到了一些问题。我有一个配置文件如下:

# 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

我的程序使用 Poco::Util:ServerApplication 框架,受益于子系统架构。我有多个子系统,每个子系统都存储对 Poco::Logger 对象的引用,该对象是通过使用 Poco::Logger::get("logger name") 方法获得的。我正在尝试使用日志层次结构,将“核心”日志作为我的日志层次结构的根,如上面的配置文件所示。以下代码举例说明了我在每个子系统中所做的事情:

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()))),
...

这适用于日志记录。这很好,因为我已经从属性文件中继承了配置,并且每个子系统都会有一个不同的 Poco::Message 源名称,这样可以很容易地识别日志条目来自哪个子系统。

当我尝试更改记录器实例的属性时(例如,从 Subsystem1 的记录器),问题就来了。例如,如果我更改它的 channel 路径,更改将传播到整个层次结构。以下代码演示了该问题:

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

我很困惑,因为它在 Poco::Logger 类的头文件中声明“一旦创建了一个记录器并且它从其祖先那里继承了 channel 和级别,它就会失去与它的连接。因此,对记录器级别或 channel 的更改不会影响其后代。

顺便说一下,我的根记录器(核心)也受到了变化的影响。

我错过了什么吗?谢谢。

Poco 库版本:1.5.1

最佳答案

我认为您对记录器和 channel 感到困惑。

记录器核核心子系统1核心.子系统2

都附加到同一个 channel c1,因为它们在创建时是 Core 的拷贝。

这是您通过 Logger.getChannel() 函数更改的 channel c1。

如果记录器连接到不同的 channel ,那么您的方法将会奏效。

关于c++ - Poco Logging Framework 中记录器层次结构的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16551617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com