C++日志系统设计与实现:从入门到精通,面试必考的可观测性架构全解析
C++日志系统设计与实现:从入门到精通,面试必考的可观测性架构全解析引言日志系统是C++生产级项目的基础设施,也是大厂面试的系统设计考点。一个好的日志系统能帮助快速定位问题、监控系统状态、追踪业务流程。本文将手把手带你设计和实现一个高性能的C++日志系统,掌握可观测性架构的核心技术。一、日志系统基础1.1 日志级别级别说明使用场景TRACE最详细的跟踪信息开发调试DEBUG调试信息开发/测试环境INFO一般信息正常业务流程WARN警告信息潜在问题ERROR错误信息可恢复的错误FATAL致命错误不可恢复,程序将终止1.2 日志系统的设计目标核心目标: 1. 高性能:日志不应成为性能瓶颈 2. 线程安全:多线程环境下安全使用 3. 灵活性:支持多种输出目标(文件、控制台、网络) 4. 可配置:运行时调整日志级别和格式 5. 低侵入:使用简单,对业务代码影响小 6. 日志滚动:自动按大小/时间切割日志文件二、基础日志系统实现2.1 简单日志类#includeiostream#includefstream#includestring#includectime#includemutex#includesstream#includeiomanipenumclassLogLevel{TRACE=0,DEBUG,INFO,WARN,ERROR,FATAL};classLogger{private:staticLogger*instance;staticstd::mutex mtx;LogLevel level;std::ofstream file;boolenableConsole;std::mutex logMtx;Logger():level(LogLevel::INFO),enableConsole(true){}std::stringgetTimestamp(){autonow=std::time(nullptr);std::ostringstream ss;ssstd::put_time(std::localtime(now),"%Y-%m-%d %H:%M:%S");returnss.str();}std::stringlevelToString(LogLevel lvl){switch(lvl){caseLogLevel::TRACE:return"TRACE";caseLogLevel::DEBUG:return"DEBUG";caseLogLevel::INFO:return"INFO ";caseLogLevel::WARN:return"WARN ";caseLogLevel::ERROR:return"ERROR";caseLogLevel::FATAL:return"FATAL";default:return"UNKNOWN";}}public:staticLoggergetInstance(){std::lock_guardstd::mutexlock(mtx);if(!instance){instance=newLogger();}return*instance;}voidsetLevel(LogLevel lvl){level=lvl;}voidsetLogFile(conststd::stringfilename){file.open(filename,std::ios::app);}voidenableConsoleOutput(boolenable){enableConsole=enable;}voidlog(LogLevel lvl,conststd::stringmessage,constchar*file,intline,constchar*func){if(lvllevel)return;std::lock_guardstd::mutexlock(logMtx);std::ostringstream ss;ss"["getTimestamp()"] ""["levelToString(lvl)"] ""["file":"line" "func"] "message"\n";std::string logLine=ss.str();if(enableConsole){std::coutlogLine;}if(file.is_open()){filelogLine;file.flush();}}};Logger*Logger::instance=nullptr;std::mutex Logger::mtx;// 宏定义,自动获取文件、行号、函数名#defineLOG_TRACE(msg)Logger::getInstance().log(LogLevel::TRACE,msg,__FILE__,__LINE__,__func__)#defineLOG_DEBUG(msg)Logger::getInstance().log(LogLevel::DEBUG,msg,__FILE__,__LINE__,__func__)#defineLOG_INFO(msg)Logger::getInstance().log
上一篇/下一篇内容由系统自动关联
返回资讯列表 →