我们通过继承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去打印属于自己的不同的日志信息就可以了。