muduo网络库学习之Logger类、LogStream类、LogFile类封装中的知识点

本文深入剖析了muduo网络库中的Logger和LogFile类,详细介绍了日志级别、Logger类的实现以及LogFile类如何进行日志滚动。通过示例展示了如何使用Logger进行日志输出,并解释了日志文件命名规则和滚动策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


一、Logger类、LogStream类

1、日志作用

开发过程中:
调试错误
更好的理解程序
运行过程中:
诊断系统故障并处理
记录系统运行状态

2、日志级别

TRACE
指出比DEBUG粒度更细的一些信息事件(开发过程中使用)
DEBUG
指出细粒度信息事件对调试应用程序是非常有帮助的。(开发过程中使用)
INFO
表明消息在粗粒度级别上突出强调应用程序的运行过程。
WARN
系统能正常运行,但可能会出现潜在错误的情形。
ERROR
指出虽然发生错误事件,但仍然不影响系统的继续运行。
FATAL
指出每个严重的错误事件将会导致应用程序的退出。


class  Logger
{
public:
enum  LogLevel
  {
    TRACE,
    DEBUG,
    INFO,
    WARN,
    ERROR,
    FATAL,
    NUM_LOG_LEVELS,
  };
// compile time calculation of basename of source file
class  SourceFile { };
private:
       class  Impl { };
};


template<int SIZE>
class  FixedBuffer  : boost::noncopyable

class  LogStream : boost::noncopyable
{
typedef LogStream  self;
public:                                        // 4000
 typedef detail::FixedBuffer<detail::kSmallBuffer>  Buffer;
};

class Fmt //
<think>嗯,用户现在问的是如何用C++11重写muduo网络库中的TcpClient及其头文件。首先,我需要回忆一下muduo库的结构。muduo是陈硕开发的一个基于Reactor模式的高性能网络库,它大量使用了C++11之前的特性,比如Boost库中的智能指针和绑定器。用户希望用C++11的新特性来重构,这可能是为了减少对Boost的依赖,提高代码的现代性和可维护性。 接下来,我需要考虑TcpClientmuduo中的职责。TcpClient主要用于建立到服务器的TCP连接,管理连接的生命周期,处理连接建立、断开、消息接收等事件。原来的实现可能使用了Boost的shared_ptr和function,以及一些旧的线程同步机制。用C++11重构的话,需要替换这些部分,比如使用std::shared_ptr代替boost::shared_ptr,使用std::function和lambda表达式替代boost的绑定器。 然后,头文件的设计需要符合C++11的标准。可能要将原来的boost::noncopyable替换为删除默认的拷贝构造函数和赋值操作符,使用= delete语法。另外,原来的回调机制可能使用了boost::function,现在应改为std::function,并利用右值引用和移动语义来提高性能。 还需要考虑线程安全性。muduo库的TcpClient可能在多线程环境下运行,因此在重构时需要注意使用std::mutex和std::lock_guard来替代Boost的线程库,确保线程安全。 用户可能希望得到一个具体的示例代码,展示如何将原来的Boost依赖替换为C++11标准库的实现。比如,TcpClient的成员变量中的连接对象可能使用std::unique_ptr来管理,避免手动管理内存。同时,事件回调的处理可以使用std::function和lambda表达式,使代码更简洁。 另外,需要处理连接建立过程中的异步操作。原来的muduo可能使用了Boost.Asio或者自己的事件循环,但用C++11的话,可能需要结合std::thread和标准库中的网络功能,不过实际上C++标准库在网络方面直到C++17之后才有部分支持,所以这里可能需要继续使用原生的socket API,但用C++11的智能指针和线程库来管理资源。 在编写头文件时,应该包含必要的头文件,比如<memory>、<functional>、<string>、<mutex>等,并定义TcpClient,包含构造函数、连接方法、断开方法、设置回调函数的方法等。需要确保的接口清晰,并且内部实现利用C++11的新特性来简化代码。 可能还需要处理错误处理和资源释放的问题。使用RAII机制,通过智能指针自动管理资源,避免内存泄漏。例如,在连接断开时,确保相关的socket资源被正确释放,回调函数被正确清理。 最后,用户可能希望了解重构后的TcpClient与原来的版本有何不同,以及如何在实际项目中使用。因此,在示例代码中需要展示如何实例化TcpClient对象,设置消息回调、连接回调等,并启动事件循环。 总结一下,用户的需求是通过使用C++11的新特性,重构muduo中的TcpClient,去除对Boost的依赖,提升代码的现代性和可维护性。需要关注的点包括智能指针、lambda表达式、std::function、线程安全、资源管理以及接口设计。</think>以下是用C++11重构`TcpClient`的基本实现思路(含关键代码示例): --- ### **头文件设计 TcpClient.h** ```cpp #pragma once #include <memory> #include <functional> #include <string> #include <mutex> class EventLoop; class Connector; class TcpConnection; class TcpClient { public: using ConnectionCallback = std::function<void(const std::shared_ptr<TcpConnection>&)>; using MessageCallback = std::function<void(const std::shared_ptr<TcpConnection>&, const char* data, ssize_t len)>; TcpClient(EventLoop* loop, const std::string& serverAddr, uint16_t serverPort); ~TcpClient(); // 禁用拷贝 TcpClient(const TcpClient&) = delete; TcpClient& operator=(const TcpClient&) = delete; void connect(); // 发起连接 void disconnect(); // 主动断开 // 设置回调(线程安全) void setConnectionCallback(ConnectionCallback cb) { std::lock_guard<std::mutex> lock(mutex_); connectionCallback_ = std::move(cb); } void setMessageCallback(MessageCallback cb) { std::lock_guard<std::mutex> lock(mutex_); messageCallback_ = std::move(cb); } private: void newConnection(int sockfd); // 连接建立回调 void removeConnection(const std::shared_ptr<TcpConnection>& conn); EventLoop* loop_; std::unique_ptr<Connector> connector_; std::shared_ptr<TcpConnection> connection_; std::mutex mutex_; ConnectionCallback connectionCallback_; MessageCallback messageCallback_; bool connected_; }; ``` --- ### **核心实现要点** #### **1. 智能指针管理资源** ```cpp // 使用unique_ptr管理Connector std::unique_ptr<Connector> connector_; // 使用shared_ptr管理TCP连接 std::shared_ptr<TcpConnection> connection_; ``` #### **2. 线程安全回调设置** ```cpp // 使用mutex保护回调函数 std::mutex mutex_; void setMessageCallback(MessageCallback cb) { std::lock_guard<std::mutex> lock(mutex_); messageCallback_ = std::move(cb); // 使用移动语义 } ``` #### **3. Lambda处理异步连接** ```cpp void TcpClient::newConnection(int sockfd) { // 创建TcpConnection时绑定回调 auto conn = std::make_shared<TcpConnection>(loop_, sockfd); conn->setMessageCallback([this](auto&&... args) { // 通过中间层转发保证线程安全 std::lock_guard<std::mutex> lock(mutex_); if (messageCallback_) { messageCallback_(std::forward<decltype(args)>(args)...); } }); connection_ = conn; conn->connectEstablished(); } ``` --- ### **关键优化对比** | 特性 | 原始muduo实现 | C++11重构版 | |--------------|-----------------------|---------------------------| | 内存管理 | boost::shared_ptr | std::shared_ptr | | 回调绑定 | boost::function/bind | std::function + lambda | | 线程同步 | boost::mutex | std::mutex + lock_guard | | 对象不可复制 | boost::noncopyable | = delete语法 | | 网络核心 | poll(2)系统调用 | 可替换为epoll(需修改Poller)| --- ### **使用示例** ```cpp EventLoop loop; TcpClient client(&loop, "127.0.0.1", 8888); // 设置消息回调(自动型推导) client.setMessageCallback([](auto conn, const char* data, ssize_t len) { std::string msg(data, len); std::cout << "Received: " << msg << std::endl; conn->send("ACK\n"); // 自动管理发送缓冲区 }); client.connect(); loop.loop(); // 启动事件循环 ``` --- ### **注意事项** 1. 需要配套实现`Connector`和`TcpConnection`的C++11版本 2. 事件循环需使用`std::chrono`处理定时器 3. 缓冲区建议改用`std::vector<char>`+分散读写 4. 异常处理需配合`noexcept`和`try-catch` 完整实现需要约800-1200行代码(含相关依赖),建议参考[muduo源码](https://github.com/chenshuo/muduo)进行模块化改造。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值