Poco::Application logger()方法的使用

我们通过继承Poco::ServerApplication类可以很方便地实现自己的服务类的代码,Poco::ServerApplication类又继承了Application类,通过Application类可以方便地管理自己实现的每一个SubSystem类,只需要在服务器类的构造函数执行的时候,通过调用addSubsystem()方法就可以了
下面提供一个简易的框架代码

class myServer:public Poco::Util::ServerApplication
{
    myServer()
    {
        //构造函数中可以去添加自己实现的Subsystem类
        addSubsystem(new mySubsystem);
    }
    //析构函数
    virtual ~myServer(){}
    //以下几个方法是继承自Application类的方法,是需要自己去实现
    //这个初始化函数的执行会在自己的构造函数之前,在这个位置去读取配置文件,由于Application是单例模式,因此在此位置获取的配置信息可以在程序的任何地方获得,这是一个非常使用的功能
    void initialize(Application& self)
    {
            Poco::Util::Application::loadConfiguration("/path");
    Poco::Util::ServerApplication::initialize(self);
    logger().information("starting up",__FILE__,__LINE__);
    }
    void uninitialize()
    {
        ServerApplication::uninitialize();

    }
    //下边的三个函数,可以定义一些命令行的操作
    void defineOptions(Poco::Util::OptionSet& options);

    void handleOption(const std::string& name, const std::string& value);

    void handleHelp(const std::string& name, const std::string& value);

    void displayHelp();
//这个是我们要实现的server需要执行的代码
    int main(const std::vector<std::string>& args)
    {
        //Start()方法是自己实现的,这个位置是调用subsystem的线程执行方法
        getSubsystem<mySubsystem>().Start();
        // wait for CTRL-C or kill
        waitForTerminationRequest();
        //这是程序终止后要做的工作,Stop()方法是自己实现的,这个位置是调用subsystem的线程结束的时候,做的一些后续处理工作
        getSubsystem<mySubsystem>().Stop();
        return Application::EXIT_OK;
    }
}
//最后我们通过一个宏定义启动我们的服务器
POCO_SERVER_MAIN(myServer)

下面我要说的是,Application的Logger&logger() const;方法,因为我们通过load配置信息后,可以很方便的获得日志的配置信息,这样就可以直接实现日志功能,简直是方便的不要不要的。

下面提供一个Poco官网提供的日志配置的代码
https://pocoproject.org/docs/Poco.Util.LoggingConfigurator.html
参考这个网址,我做了稍微的改动

//这个是对formatter的配置
logging.formatters.f1.class = PatternFormatter
logging.formatters.f1.pattern = %s: [%p] %t
logging.formatters.f1.times = UTC
//这是对于channel的配置,由于c1是ConsoleChannel所以不需要配置路径
//我们把c2的formatter也配置成f1
logging.channels.c1.class = ConsoleChannel
logging.channels.c1.formatter = f1
logging.channels.c2.class = FileChannel
logging.channels.c2.path = ${system.tempDir}/sample.log
logging.channels.c2.formatter = f1
//只有root可以直接使用,其余的logger是需要定义名字的,我们l1的channel配置成c2
logging.loggers.root.channel = c1
logging.loggers.root.level = warning
logging.loggers.l1.name = logger1
logging.loggers.l1.channel = c2
logging.loggers.l1.level = information

好了,那么回到服务器的代码,当我们在void initialize(Application& self)函数中完成了加载配置文件之后,通过logger()函数就可以得到配置文件的logger,默认的是root的那个logger,只能够使用一个配置信息,那么我们在配置文件中配置了另外一个logger ——logging.loggers.l1.name = logger1怎么拿到呢,很简单,通过logger().get(“logger1”)就可以得到了,这样非常方便,我们只需要,在主线程中配置好配置信息,然后,每一个subsystem子线程,去拿到不同的logger去打印属于自己的不同的日志信息就可以了。

猜你喜欢

转载自blog.csdn.net/veghlreywg/article/details/72597816
今日推荐