# AsyncLogger **Repository Path**: F_Jyang/async-logger ## Basic Information - **Project Name**: AsyncLogger - **Description**: AsyncLogger是一个参考muduo实现的基于C++的异步日志库,支持多线程日志输出、日志级别过滤、日志文件滚动。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-05-17 - **Last Updated**: 2025-07-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## AsyncLogger ### 日志库功能需求 1. 日志要有多种级别(level),如DEBUG、ERROR等 2. 日志可能有多个目的地(如文件,socket) 3. 日志的消息格式可配置(layout) 4. 可以设置运行时过滤器(filter),控制不同组件的日志的级别和目的地 muduo中认为处理第一项外,其他几项都是非必要的。 ### AsyncLogger简介 AsyncLogger是一个参考muduo实现的基于C++的异步日志库,支持多线程日志输出,支持日志级别过滤,支持日志文件滚动。 ```cpp // 1、创建全局异步logger对象 std::unique_ptr g_logger(new AsyncLogger::AsyncLogger("./", "test", 1024 * 1024 * 1024, false)); // 2、创建logger回调函数 void asyncLog(const char* logline, int len) { g_logger->append(logline, len); } void thread_func(int s) { std::cout << "start: " << start_ << std::endl; for (int i = s; i < s+1000000; ++i) { // 5、打印不同level的日志 LOG_INFO << std::chrono::system_clock::now().time_since_epoch().count() << ": 第" << i << "次 logfile\n"; // LOG_DEBUG << std::chrono::system_clock::now().time_since_epoch().count() << ": 第" << i << "次 logfile\n"; // LOG_WARN << std::chrono::system_clock::now().time_since_epoch().count() << ": 第" << i << "次 logfile\n"; // LOG_ERROR << std::chrono::system_clock::now().time_since_epoch().count() << ": 第" << i << "次 logfile\n"; } } int main(int argc, char* argv[]) { // 3、设置日志级别和logger输出回调函数 AsyncLogger::Logger::setLogLevel(AsyncLogger::LogLevel::TRACE); AsyncLogger::Logger::setOutput(asyncLog); // 4、创建全局asyncLogger对象 std::string name = argv[0]; g_logger->start(); std::vector threads; auto before = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()); for (int i = 0; i < 10; ++i) { int s = start; threads.push_back(std::thread([=]() { thread_func(s); })); start += 1000000; } for (int i = 0; i < 10; ++i) { threads[i].join(); } auto after = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()); std::cout << "test time: " << (after - before).count() << std::endl; } ``` ### todo 1. 目前一条log的最大字节数量为4096,如果遇到需要超过该尺寸的需求,会导致异常(该需求应该不常见吧emmmmmmm)。见LogStream的<<操作符重载。 ### asynclogger类图 image-20220331212741073 ### asynclogger活动图 image-20220331212741073 ### asynclogger时序图 image-20220331212741073 ### IO分层、提高IO效率:star2: 如图所示,AsyncLogger的 IO 分4层: 1. 用户接口层,封装对用户友好的接口 2. 缓存层,这一层实现**双缓冲区或者多缓冲区** 3. 文件处理层,这一层实现**文件的滚动等功能**,不需要该功能可以去掉 4. 文件IO层,这一层**简单封装文件IO接口,用于真正写入磁盘**