如何使用Poco Logger

时间:2015-08-06 13:45:47

标签: logging global poco

我是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;
}

我尝试创建一个全局记录器,可以在我的应用程序中的其他函数和类中使用(示例代码如下)。 在上面的示例中,记录器在main中声明并初始化,如果我没有将记录器传递给myClass,我无法在myFun中使用它(我不想要传递logger作为参数,它看起来很尴尬,因为我需要在整个应用程序中使用记录器,在多个文件中);我试过这种方式:将Logger& logger = Logger::get("TestLogger");放在main()之外,作为全局变量,main中的所有其他部分保持不变,但这不起作用,我运行后不生成sample.log应用程序。我不能这样做:只需在函数外部声明Logger& 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;
}

1 个答案:

答案 0 :(得分:2)

没有Logger::get()作为单身人员授予对Logger个对象的全局池的访问权限吗?

如果您在上面运行代码段,即在main()中初始化记录器并通过myClass::myFun()Logger::get( "TestLogger" )中引用它时,会发生什么?这应该可以正常工作。

当然,您无法访问main()中的Logger& myClass::myFun()个引用,但您应该可以通过Logger::get()与其联系。