C boost::log 详解从基础到实战一、C boost::log 详解1、引言2、核心概念2.1 、日志记录器 (Logger)2.2 、严重性级别 (Severity Levels)2.3 、属性 (Attributes)2.4 、接收器 (Sinks)2.5 、格式化器 (Formatters)2.6 、过滤器 (Filters)3、基本用法3.1 、最简单的日志记录3.2 、带格式化的基本配置3.3 、文件日志记录4、 高级配置4.1、 自定义日志记录器4.2 、异步日志记录4.3、 条件日志记录二、使用教程1、下载库2、Visual Studio新建工程3、将源码解压到工程目录下4、添加路径5、测试代码一、C boost::log 详解1、引言在 C 开发中日志记录是调试、监控和问题排查的重要工具。boost::log是 Boost 库中一个功能强大、高度可配置的日志系统提供了企业级的日志解决方案。与简单的std::cout或第三方日志库相比boost::log具有以下优势高性能异步日志、过滤机制减少性能开销高度可配置支持多种输出格式、目标和过滤规则线程安全内置线程安全机制适合多线程环境丰富的特性支持严重性级别、属性、格式化等高级功能跨平台支持 Windows、Linux、macOS 等主流平台2、核心概念2.1 、日志记录器 (Logger)日志记录器是日志系统的入口点每个记录器可以有自己的配置和属性。2.2 、严重性级别 (Severity Levels)boost::log定义了标准的严重性级别trace- 最详细的调试信息debug- 调试信息info- 一般信息默认warning- 警告信息error- 错误信息fatal- 致命错误2.3 、属性 (Attributes)属性是与日志记录关联的键值对可以包含时间戳线程ID进程ID源代码位置自定义属性2.4 、接收器 (Sinks)接收器决定日志的输出目标控制台输出文件输出网络输出系统日志 (syslog)2.5 、格式化器 (Formatters)格式化器控制日志消息的显示格式。2.6 、过滤器 (Filters)过滤器决定哪些日志记录应该被处理。3、基本用法3.1 、最简单的日志记录#includeboost/log/trivial.hppintmain(){// 使用 BOOST_LOG_TRIVIAL 宏记录日志BOOST_LOG_TRIVIAL(trace)这是一条 trace 级别的日志;BOOST_LOG_TRIVIAL(debug)这是一条 debug 级别的日志;BOOST_LOG_TRIVIAL(info)这是一条 info 级别的日志;BOOST_LOG_TRIVIAL(warning)这是一条 warning 级别的日志;BOOST_LOG_TRIVIAL(error)这是一条 error 级别的日志;BOOST_LOG_TRIVIAL(fatal)这是一条 fatal 级别的日志;return0;}3.2 、带格式化的基本配置#includeboost/log/trivial.hpp#includeboost/log/utility/setup/console.hpp#includeboost/log/utility/setup/common_attributes.hppintmain(){// 初始化控制台接收器boost::log::add_console_log(std::clog,boost::log::keywords::format[%TimeStamp%] [%Severity%]: %Message%);// 添加常用属性时间戳、进程ID、线程IDboost::log::add_common_attributes();// 记录日志BOOST_LOG_TRIVIAL(info)应用程序启动;BOOST_LOG_TRIVIAL(warning)内存使用率较高;BOOST_LOG_TRIVIAL(error)文件打开失败;return0;}3.3 、文件日志记录#includeboost/log/trivial.hpp#includeboost/log/utility/setup/file.hpp#includeboost/log/utility/setup/common_attributes.hppintmain(){// 设置文件接收器boost::log::add_file_log(boost::log::keywords::file_nameapp_%Y%m%d_%H%M%S.log,boost::log::keywords::rotation_size10*1024*1024,// 10MBboost::log::keywords::max_size100*1024*1024,// 100MBboost::log::keywords::time_based_rotationboost::log::sinks::file::rotation_at_time_point(0,0,0),boost::log::keywords::format[%TimeStamp%] [%Severity%] [%ProcessID%:%ThreadID%]: %Message%,boost::log::keywords::auto_flushtrue);// 添加常用属性boost::log::add_common_attributes();// 记录日志for(inti0;i100;i){BOOST_LOG_TRIVIAL(info)处理第 i 个任务;}return0;}4、 高级配置4.1、 自定义日志记录器#includeboost/log/core.hpp#includeboost/log/trivial.hpp#includeboost/log/expressions.hpp#includeboost/log/sources/severity_logger.hpp#includeboost/log/utility/setup/file.hpp#includeboost/log/utility/setup/console.hpp#includeboost/log/utility/setup/common_attributes.hppnamespaceloggingboost::log;namespacesrcboost::log::sources;namespacekeywordsboost::log::keywords;namespaceexprboost::log::expressions;// 定义自定义严重性级别enumseverity_level{normal,notification,warning,error,critical};// 重载 操作符以便输出自定义级别std::ostreamoperator(std::ostreamstrm,severity_level level){staticconstchar*strings[]{normal,notification,warning,error,critical};if(static_caststd::size_t(level)sizeof(strings)/sizeof(*strings))strmstrings[level];elsestrmstatic_castint(level);returnstrm;}intmain(){// 创建自定义日志记录器src::severity_loggerseverity_levellg;// 设置控制台输出logging::add_console_log(std::clog,keywords::filterexpr::attrseverity_level(Severity)warning,keywords::formatexpr::streamexpr::format_date_timeboost::posix_time::ptime(TimeStamp,%Y-%m-%d %H:%M:%S) [expr::attrseverity_level(Severity)] expr::message);// 设置文件输出logging::add_file_log(keywords::file_namecustom_%Y%m%d.log,keywords::filterexpr::attrseverity_level(Severity)normal,keywords::formatexpr::streamexpr::format_date_timeboost::posix_time::ptime(TimeStamp,%Y-%m-%d %H:%M:%S.%f) [expr::attrseverity_level(Severity)] [expr::attrattrs::current_thread_id::value_type(ThreadID)] expr::message);// 添加常用属性logging::add_common_attributes();// 记录不同级别的日志BOOST_LOG_SEV(lg,normal)正常操作;BOOST_LOG_SEV(lg,notification)系统通知;BOOST_LOG_SEV(lg,warning)警告信息;BOOST_LOG_SEV(lg,error)错误发生;BOOST_LOG_SEV(lg,critical)严重错误;return0;}4.2 、异步日志记录#includeboost/log/core.hpp#includeboost/log/trivial.hpp#includeboost/log/expressions.hpp#includeboost/log/sinks/async_frontend.hpp#includeboost/log/sinks/text_file_backend.hpp#includeboost/log/utility/setup/common_attributes.hppnamespaceloggingboost::log;namespacesinksboost::log::sinks;namespacekeywordsboost::log::keywords;typedefsinks::asynchronous_sinksinks::text_file_backendsink_t;intmain(){// 创建异步接收器后端boost::shared_ptrsinks::text_file_backendbackendboost::make_sharedsinks::text_file_backend(keywords::file_nameasync_%Y%m%d_%H%M%S_%N.log,keywords::rotation_size10*1024*1024,keywords::time_based_rotationsinks::file::rotation_at_time_point(0,0,0));// 创建异步接收器前端boost::shared_ptrsink_tsink(newsink_t(backend));// 设置格式化sink-set_formatter(logging::expressions::streamlogging::expressions::format_date_timeboost::posix_time::ptime(TimeStamp,%Y-%m-%d %H:%M:%S) [logging::trivial::severity] logging::expressions::message);// 将接收器添加到核心logging::core::get()-add_sink(sink);// 添加常用属性logging::add_common_attributes();// 高性能日志记录不会阻塞主线程for(inti0;i100000;i){BOOST_LOG_TRIVIAL(info)异步日志记录测试 i;}// 刷新并移除接收器sink-flush();logging::core::get()-remove_sink(sink);return0;}4.3、 条件日志记录#includeboost/log/trivial.hpp#includeboost/log/utility/setup/console.hpp#includeboost/log/utility/setup/common_attributes.hpp// 条件日志宏#defineLOG_IF(condition,level)\if(condition)BOOST_LOG_TRIVIAL(level)#defineLOG_LEVEL(level)BOOST_LOG_TRIVIAL(level)intmain(){// 初始化日志boost::log::add_console_log(std::clog);boost::log::add_common_attributes();booldebug_modetrue;interror_count5;// 条件日志记录LOG_IF(debug_mode,debug)调试信息当前在调试模式;LOG_IF(error_count0,error)发现 error_count 个错误;// 根据条件设置日志级别if(debug_mode){// 设置只记录 debug 及以上级别的日志boost::log::core::get()-set_filter(boost::log::trivial::severityboost::log::trivial::debug);}else{// 设置只记录 info 及以上级别的日志boost::log::core::get()-set_filter(boost::log::trivial::severityboost::log::trivial::info);}LOG_LEVEL(trace)这条 trace 日志在非调试模式下不会显示;LOG_LEVEL(debug)调试信息;LOG_LEVEL(info)一般信息;return0;}二、使用教程1、下载库访问链接https://www.boost.org/2、Visual Studio新建工程3、将源码解压到工程目录下新建一个main.cpp文件将下载的压缩包解压到main.cpp同级目录并改名为boost4、添加路径5、测试代码#includeiostream#includestring#includeboost/lexical_cast.hpp// 只需这一个头文件intmain(){// // 1. 字符串 → 整数// std::string str_num12345;intnumboost::lexical_castint(str_num);std::cout字符串转 int: num\n;// // 2. 字符串 → 浮点数// std::string str_float3.1415926;doublepiboost::lexical_castdouble(str_float);std::cout字符串转 double: pi\n;// // 3. 数字 → 字符串// intage28;std::string str_ageboost::lexical_caststd::string(age);std::coutint 转字符串: str_age\n;// // 4. 浮点数 → 字符串// doubleprice99.8;std::string str_priceboost::lexical_caststd::string(price);std::coutdouble 转字符串: str_price\n;// // 5. 布尔值 ↔ 字符串// boolbtrue;std::string str_boolboost::lexical_caststd::string(b);std::coutbool 转字符串: str_bool\n;boolb2boost::lexical_castbool(1);std::cout字符串 \1\ 转 bool: std::boolalphab2\n;// // 6. 错误处理转换失败会抛异常// try{// 这个字符串无法转数字会抛异常std::string bad_strabc;intbad_numboost::lexical_castint(bad_str);std::coutbad_num\n;}catch(constboost::bad_lexical_caste){std::cout转换失败: e.what()\n;}return0;}运行结果字符串转int:12345字符串转double:3.14159int转字符串:28double转字符串:99.799999999999997bool转字符串:1字符串1转bool:true转换失败:bad lexical cast:source type value couldnotbe interpreted as target C:\Users\徐鹏\Desktop\新建文件夹\Project2\x64\Debug\Project2.exe(进程30564)已退出代码为0(0x0)。 要在调试停止时自动关闭控制台请启用“工具”-“选项”-“调试”-“调试停止时自动关闭控制台”。 按任意键关闭此窗口...