【问题标题】:How to use Poco Logger如何使用 Poco 记录器
【发布时间】:2024-01-17 21:20:01
【问题描述】:

我是 Poco 新手,我在 Poco 在线帮助中看到了以下示例:

int main(int argc, char** argv)
{
    AutoPtr<SimpleFileChannel> pChannel(new SimpleFileChannel);
    pChannel->setProperty("path", "sample.log");
    pChannel->setProperty("rotation", "2 K");
    Logger::root().setChannel(pChannel);
    Logger& logger = Logger::get("TestLogger"); // inherits root channel
    for (int i = 0; i < 100; ++i)
        logger.information("Testing SimpleFileChannel");
    return 0;
}

我尝试创建一个全局记录器,它也可以在我的应用程序中的其他函数和类中使用(示例代码如下)。 在上面的例子中,logger 在 main 中声明和初始化,如果我不将 logger 传递给 myFun,我不能在 myClass 中使用它(我不想将 logger 作为参数传递,它看起来很尴尬,因为我需要在整个应用程序中使用记录器,在多个文件中);我试过这样:将Logger&amp; logger = Logger::get("TestLogger");放在main()之外,作为全局变量,main中的所有其他部分保持不变,但这不起作用,我运行应用程序后不会生成sample.log。我不能这样做:只需在函数外部声明Logger&amp; logger,然后在main() 中对其进行初始化,因为 logger 是一个引用,必须在声明时进行初始化。怎么做?

class myClass
{
public:
     myClass() { }
     ~myClass() { }
     myFun() { /*calling logger...*/ } 
};

int main(int argc, char** argv)
{
    AutoPtr<SimpleFileChannel> pChannel(new SimpleFileChannel);
    pChannel->setProperty("path", "sample.log");
    pChannel->setProperty("rotation", "2 K");
    Logger::root().setChannel(pChannel);
    Logger& logger = Logger::get("TestLogger"); // inherits root channel
    logger.information("starting up");

    myClass aClass;
    aClass.myFun();
    return 0;
}

【问题讨论】:

    标签: logging global poco


    【解决方案1】:

    Logger::get() 不授予对 Logger 对象的全局池的访问权限吗?

    如果您运行上面的代码 sn-p 会发生什么,即当您在 main() 中初始化记录器并通过 Logger::get( "TestLogger" )myClass::myFun() 中引用它时会发生什么?应该没问题。

    当然,您在myClass::myFun() 中无权访问main()s Logger&amp;reference,但您应该可以通过Logger::get() 访问它。

    【讨论】: