POCO C++库学习和分析 -- 日志 (一)

POCO C++库学习和分析 -- 日志 (一)


         日志对于程序来说是非常重要的,特别是对一些大型程序而言。一旦程序被发布,在现场日志几乎是程序员唯一可以获取程序信息的手段。Poco作为一个框架类库,提供了非常多的日志种类供程序员选用。文章将分两个部分,对于Poco日志进行介绍。第一部分主要以翻译Poco文档为主,第二部分则探讨Poco日志的实现。


1. Poco库日志接口

1.1  总体介绍 

         Poco中的日志模块主要涉及下列几个部分。
          1. 消息,日志和通道
          2. 格式
          3. 执行效率的考量

          模块框架图:






1.2  消息(Message类):

          1. 所有的消息都被存储并通过类Poco::Message传递
          2. 一个消息包括了下述特性:
             a. 优先级
             b. 消息源
             c. 消息内容
             d. 时间戳
             e. 进程与线程标记
             f. 可选参数(名字-值)对

           消息优先级:
           Poco定义了8种消息优先级:
                PRIO_FATAL
                PRIO_CRITICAL
                PRIO_ERROR
                PRIO_WARNING
                PRIO_NOTICE
                PRIO_INFORMATION
                PRIO_DEBUG
                PRIO_TRACE
          可以通过函数设置和获取消息优先级:
                void setPriority(Priority prio)
                Priority getPriority() const

           消息源:
          消息源用来描述日志消息的源。通常状态下,使用Poco::Logger的名字来命名。因此应该合理的命名Poco::Logger的名字。
          可以通过函数设置和获取消息源:
                void setSource(const std::string& source)
                const std::string& getSource() const 

   
           消息内容:
          在Poco中消息内容是不考虑格式和长度等问题的,只是消息内容。当消息最终输出时,消息内容有可能被类Poco::formatter修改。
          可以通过函数设置和获取消息内容:
                void setText(const std::string& text)
                const std::string& getText() const

           消息时间戳:
          记录消息产生时的时间戳,精度为毫秒。
          可以通过函数设置和获取时间戳:  
                void setTime(const Timestamp& time)
                const Timestamp& getTime() const

           进程和线程标识符:
          进程标识符(PID)为长整形的int值,用来存储系统的进程ID。
          线程标识符(TID)同样为长整形的int值,用于存储当前线程的ID值。
          同样的当前线程的名字也会被存储。进程标识符(PID)、线程标识符(TID)、线程名在Poco::Message初始化时会自动生成。
          可以使用下列函数对进程标识符(PID)、线程标识符(TID)、线程名进行操作:
             void setThread(const std::string& threadName)
             const std::string& getThread() const
             void setTid(long tid)
             long getTid() const
             void setPid(long pid)
             long getPid() const

           消息参数:
          一个消息可以存储任意数目的name-value对 。
          name-value可以是任意字符串。
          消息参数可以被用于最终的格式输出。
          消息参数支持下标索引。

1.3 Logger类:

          应用程序可以使用Poco::Logger类去产生日志消息。每一个日志对象内部都包含了一个通道对象(Channel),通
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,我会为您解析 Poco C++网络模块的 HttpServer 示例。 HttpServer 是一个用于创建 HTTP 服务器的类,可以用于处理 HTTP 请求和响应。下面是一个简单的 HttpServer 示例,它监听来自客户端的请求并返回一个简单的响应: ```cpp #include "Poco/Net/HTTPServer.h" #include "Poco/Net/ServerSocket.h" #include "Poco/Util/ServerApplication.h" #include "Poco/Net/HTTPRequestHandlerFactory.h" #include "Poco/Net/HTTPRequestHandler.h" #include "Poco/Net/HTTPServerRequest.h" #include "Poco/Net/HTTPServerResponse.h" #include <iostream> using namespace Poco::Net; using namespace Poco::Util; using namespace std; class MyRequestHandler: public HTTPRequestHandler { public: void handleRequest(HTTPServerRequest& request, HTTPServerResponse& response) { response.setChunkedTransferEncoding(true); response.setContentType("text/html"); ostream& ostr = response.send(); ostr << "<html><head><title>My 1st HTTP Server</title></head>"; ostr << "<body><h1>Hello, world!</h1></body></html>"; } }; class MyRequestHandlerFactory: public HTTPRequestHandlerFactory { public: HTTPRequestHandler* createRequestHandler(const HTTPServerRequest&) { return new MyRequestHandler; } }; class MyServerApp: public ServerApplication { protected: int main(const vector<string>&) { HTTPServer server(new MyRequestHandlerFactory, ServerSocket(8080), new HTTPServerParams); server.start(); cout << "Server started" << endl; waitForTerminationRequest(); server.stop(); cout << "Server stopped" << endl; return Application::EXIT_OK; } }; int main(int argc, char** argv) { MyServerApp app; return app.run(argc, argv); } ``` 在这个示例中,我们定义了一个 MyRequestHandler 类来处理 HTTP 请求。这个类只有一个方法 handleRequest,它接收 HTTPServerRequest 对象和 HTTPServerResponse 对象作为参数。 handleRequest 方法设置 HTTP 响应的头信息,然后通过 HTTPServerResponse 对象发送响应的正文。代码中发送的响应正文是一个简单的 HTML 页面,其中包含一个标题和一个“Hello, world!”的消息。 MyRequestHandlerFactory 类是一个工厂类,它实现了 HTTPRequestHandlerFactory 接口。当服务器接收到一个新的请求时,它调用 MyRequestHandlerFactory 的 createRequestHandler 方法来创建一个新的 MyRequestHandler 对象来处理该请求。 MyServerApp 类继承了 ServerApplication 类,它用于启动和停止 HTTP 服务器。在 main 方法中,我们创建了一个 HTTPServer 对象,并将 MyRequestHandlerFactory、ServerSocket 和 HTTPServerParams 对象传递给它。然后,我们调用 HTTPServer 对象的 start 方法来启动服务器,并调用 waitForTerminationRequest 方法来等待服务器终止请求。最后,我们调用 HTTPServer 对象的 stop 方法来停止服务器。 这就是 Poco C++网络模块中的 HttpServer 示例的解析。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值