boostlog
boost.log要点笔记
boost.log要点笔记常⽤简写:namespace logging = boost::log;namespace src = boost::log::sources;namespace expr = boost::log::expressions;namespace sinks = boost::log::sinks;namespace attrs = boost::log::attributes;namespace keywords = boost::log::keywords;要点:1. 结构图要牢记在⼼;2. trivial头⽂件可⽤于⼀般的控制台输出,⽇志等级被定义在改头⽂件;3. 全局⽇志等级过滤使⽤logging::core::get()->set_filter();4. 如果不仅仅需要简单的控制台输出,这时候就要添加sink,使⽤logging::add_file_log可添加⽂件sink后端,格式如下:1 2 3 4 5 6 7logging::add_file_log(keywords::file_name="sample_%N.log", //⽂件名格式keywords::rotation_size=10*1024*1024, //超过此⼤⼩⾃动建⽴新⽂件keywords::time_based_rotation=sinks::file::rotation_at_time_point(0,0,0), //每隔指定时间重建新⽂件 keywords::format="[%TimeStamp%]:%Message%" //⽇志消息格式);除了这种语法外,也可以建⽴sinks::text_file_backend后端,⽤之初始化⼀个sink。
file rotation的选项有很多,可以指定⽇期、时间间隔、⽂件⼤⼩,甚⾄可以指定⾃⼰的谓词。
boost的编译使用
boost的编译使用Boost是一个流行的C++库,它提供了许多功能强大的工具和组件,包括容器、算法、并发编程、图形学、网络编程等。
要使用Boost库,首先需要下载并安装Boost库,然后在编译和链接你的C++程序时包含相应的Boost头文件和链接Boost库文件。
下面我将从编译和使用Boost库的角度来详细介绍。
1. 下载和安装Boost库。
首先,你需要从Boost官方网站下载最新的Boost库源代码。
然后,解压缩文件并按照官方文档中的指导进行安装。
通常情况下,Boost提供了一个名为bootstrap.bat(Windows)或者bootstrap.sh(Linux)的脚本,你可以运行这个脚本来配置Boost 库。
接着,运行b2命令来编译Boost库。
2. 编译和链接Boost库。
一旦Boost库安装完成,你就可以在你的C++程序中使用它了。
在编译你的程序时,确保你的编译器能够找到Boost库的头文件。
你可以使用编译器的命令行选项或者在你的IDE中配置头文件搜索路径。
在链接你的程序时,确保你的编译器能够找到Boost库文件。
你需要指定Boost库文件的路径和库名字,具体的方法取决于你使用的编译器和操作系统。
3. 使用Boost库。
一旦你的程序成功编译和链接了Boost库,你就可以在你的代码中包含相应的Boost头文件,并使用Boost提供的功能和组件了。
比如,如果你想使用Boost的智能指针,你可以包含<boost/shared_ptr.hpp>头文件,并使用boost::shared_ptr类来管理动态分配的对象。
总之,要使用Boost库,你需要下载、安装Boost库,配置你的编译器,包含Boost头文件,链接Boost库文件,并在你的代码中使用Boost提供的功能和组件。
希望这些信息能够帮助你成功地编译和使用Boost库。
boost的用法和搭配
boost的用法和搭配
在C++中,Boost是一个非常流行的开源库,它提供了许多强大的、高效的工具和组件,可以帮助程序员更轻松地编写高质量的代码。
下面是Boost常用的用法和搭配:
1. 智能指针
Boost提供了多种类型的智能指针,如shared_ptr、scoped_ptr 和weak_ptr等。
这些指针可以帮助程序员更好地管理内存,避免内
存泄漏和野指针等问题。
2. 字符串处理
Boost还提供了许多用于字符串处理的组件,如regex、
token_iterator和lexical_cast等。
这些组件可以帮助程序员更方便地进行字符串匹配、分割、转换等操作。
3. 容器和算法
Boost提供了许多高效的容器和算法,如multi_index、
circular_buffer和graph等。
这些容器和算法可以帮助程序员更快地完成数据结构和算法相关的任务。
4. 时间和日期处理
Boost还提供了一些用于时间和日期处理的组件,如posix_time、gregorian和date_time等。
这些组件可以帮助程序员更方便地进行日期格式化、时间计算等操作。
5. 多线程和并发编程
Boost还提供了一些用于多线程和并发编程的组件,如thread、
mutex和condition_variable等。
这些组件可以帮助程序员更好地控制并发访问和线程同步等问题。
总之,Boost是一个非常强大的开源库,它提供了许多有用的工具和组件,可以帮助程序员更轻松地编写高质量的代码。
程序员可以根据自己的需要选择适合自己的组件和使用方法。
BoostLog基本使用方法
BoostLog基本使⽤⽅法Boost Log 基本使⽤⽅法flyfish 2014-11-5依据boost提供的代码演⽰样例,学习Boost Log 的基本使⽤⽅法前提boost版本号boost_1_56_0演⽰样例代码⽬录 boost_1_56_0\libs\log\example\basic_usage使⽤的单词⾮常形象。
整个过程就像流⽔⼀样如果要输出的⽇志⽐作⽔⽔(Hello, World!)⽔槽(sink)流向哪⾥(console,file)从哪⾥取(source)⽔的等级(severity level)过滤输出(filter)格式输出(format)各部分连接者(core)演⽰样例#include <iostream>#include <boost/log/common.hpp>#include <boost/log/expressions.hpp>#include <boost/log/utility/setup/file.hpp>#include <boost/log/utility/setup/console.hpp>#include <boost/log/utility/setup/common_attributes.hpp>#include <boost/log/attributes/timer.hpp>#include <boost/log/attributes/named_scope.hpp>#include <boost/log/sources/logger.hpp>#include <boost/log/support/date_time.hpp>namespace logging = boost::log;namespace sinks = boost::log::sinks;namespace attrs = boost::log::attributes;namespace src = boost::log::sources;namespace expr = boost::log::expressions;namespace keywords = boost::log::keywords;using boost::shared_ptr;// Here we define our application severity levels.enum severity_level{normal,notification,warning,error,critical};// The formatting logic for the severity leveltemplate< typename CharT, typename TraitsT >inline std::basic_ostream< CharT, TraitsT >& operator<< (std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl){static const char* const str[] ={"normal","notification","warning","error","critical"};if (static_cast< std::size_t >(lvl) < (sizeof(str) / sizeof(*str)))strm << str[lvl];strm << static_cast< int >(lvl);return strm;}int _tmain(int argc, char* argv[]){// This is a simple tutorial/example of Boost.Log usage// The first thing we have to do to get using the library is// to set up the logging sinks - i.e. where the logs will be written to.logging::add_console_log(std::clog, keywords::format = "%TimeStamp%: %Message%");// One can also use lambda expressions to setup filters and formatterslogging::add_file_log("sample.log",keywords::filter = expr::attr< severity_level >("Severity") >= warning,keywords::format = expr::stream<< expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f") << " [" << expr::format_date_time< attrs::timer::value_type >("Uptime", "%O:%M:%S")<< "] [" << expr::format_named_scope("Scope", keywords::format = "%n (%f:%l)")<< "] <" << expr::attr< severity_level >("Severity")<< "> " << expr::message/*keywords::format = expr::format("%1% [%2%] [%3%] <%4%> %5%")% expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d, %H:%M:%S.%f") % expr::format_date_time< attrs::timer::value_type >("Uptime", "%O:%M:%S")% expr::format_named_scope("Scope", keywords::format = "%n (%f:%l)")% expr::attr< severity_level >("Severity")% expr::message*/);// Also let's add some commonly used attributes, like timestamp and record counter.logging::add_common_attributes();logging::core::get()->add_thread_attribute("Scope", attrs::named_scope());BOOST_LOG_FUNCTION();// Now our logs will be written both to the console and to the file.// Let's do a quick test and output something. We have to create a logger for this.src::logger lg;// And output...BOOST_LOG(lg) << "Hello, World!";// Now, let's try logging with severitysrc::severity_logger< severity_level > slg;// Let's pretend we also want to profile our code, so add a special timer attribute.slg.add_attribute("Uptime", attrs::timer());BOOST_LOG_SEV(slg, normal) << "A normal severity message, will not pass to the file";BOOST_LOG_SEV(slg, warning) << "A warning severity message, will pass to the file";BOOST_LOG_SEV(slg, error) << "An error severity message, will pass to the file";return 0;}从上到下依次分析⼀⽇志严重性等级enum severity_level{normal,notification,warning,error,critical};⼆⽇志等级输出template< typename CharT, typename TraitsT >inline std::basic_ostream< CharT, TraitsT >& operator<< (std::basic_ostream< CharT, TraitsT >& strm, severity_level lvl){}输出已经定义的等级描写叙述,⽇志等级的数值与字符串⼀⼀相应,假设在enum severity_level假设未定义则输出数值。
boost的编译使用
boost的编译使用Boost是一个C++库,提供了许多功能,用于增强C++编程体验。
它包含了许多模块,每个模块都提供了不同的功能,可以根据需要进行选择和使用。
Boost库在C++社区中非常受欢迎,被广泛地应用于各种项目中。
Boost提供了许多用于处理字符串的工具。
它的字符串算法模块包含了各种常用的字符串操作函数,如字符串查找、替换、拆分等。
使用Boost的字符串算法,我们可以更加方便地处理字符串,提高代码的效率和可读性。
Boost还提供了丰富的数据结构和算法库。
比如,Boost.Graph模块提供了图论算法的实现,可以用于解决各种图相关的问题。
Boost.Container模块提供了各种容器类的实现,例如vector、list、set等,可以方便地管理数据。
Boost.Algorithm模块提供了各种常用算法的实现,如排序、查找、计数等,可以大大简化代码的编写。
Boost还提供了许多用于多线程编程的工具。
Boost.Thread模块提供了线程的封装,可以方便地创建和管理线程。
Boost.Asio模块提供了异步网络编程的支持,可以处理网络通信中的各种问题。
使用Boost的多线程工具,我们可以更加方便地实现并发编程,充分发挥多核处理器的性能。
除了上述功能外,Boost还提供了许多其他模块,如日期时间处理、正则表达式、序列化等。
这些模块都是经过精心设计和实现的,可以大大提高C++编程的效率和质量。
Boost是一个非常强大的C++库,提供了丰富的功能和工具,可以帮助我们更加方便地进行C++编程。
无论是处理字符串、实现算法,还是进行多线程编程,Boost都可以提供强大的支持。
通过学习和使用Boost,我们可以提高代码的效率和可读性,让C++编程变得更加轻松和愉快。
Boost参数计算
Boost参数计算
要计算一个1000字以上的文本的Boost参数,我们需要考虑以下几个因素:
1. 文本的关键词密度:关键词密度是指文本中关键词的出现次数与总字数的比例。
如果关键词密度较高,说明文本与关键词的相关性较强,可以适当提高Boost参数。
2. 文本的重要性:如果文本对于整个文档的重要性较高,可以适当提高Boost参数,以增加其在结果中的排名。
3. 文本的独特性:如果文本与其他文档的内容相比较独特,可以适当提高Boost参数,以突出其在结果中的位置。
4. 文本的相关性:如果文本与用户的关键词相关性较高,可以适当提高Boost参数,以增加其在结果中的权重。
在实际计算中,我们可以根据以上因素对文本进行评估,并根据评估结果确定适当的Boost参数。
具体的计算方法可以根据具体的引擎或算法进行调整和优化。
basic_file_sink 使用 -回复
basic_file_sink 使用-回复什么是`basic_file_sink`?`basic_file_sink` 是一个用于将日志消息写入文件的日志记录器组件。
它是Boost.Log 库中的一部分,提供了一种简单而直接的方式来将日志流转发到文件。
在应用程序中编写日志文件是一项常见的任务,而`basic_file_sink` 可以帮助我们以一种可靠且高效的方式实现这一目标。
为何使用`basic_file_sink`?使用`basic_file_sink` 有几个优点。
首先,它可以将日志消息写入磁盘上的文件,这是一种长期记录与跟踪日志的方式,用于故障排除和分析。
其次,相比其他日志记录器,`basic_file_sink` 具有较低的开销,对于高吞吐量应用程序尤为重要。
最后,`basic_file_sink` 还支持异步写入,这意味着它可以在后台线程中实现日志记录,而不会对主线程造成阻塞。
使用`basic_file_sink` 的步骤:1. 引入头文件:首先,我们需要在代码中引入`basic_file_sink` 的头文件。
这可以通过添加`#include<boost/log/sinks/basic_file_sink.hpp>` 来完成。
2. 创建日志文件槽:我们需要创建一个日志文件槽,以便将日志消息写入文件中。
我们可以通过以下方式创建一个日志文件槽:cpp创建一个基本文件槽typedef sinks::basic_file_sink<char> file_sink;在这里,我们使用`typedef` 定义了一个名为`file_sink` 的日志文件槽。
注意,在这段代码中,我们将数据类型指定为`char`,这意味着我们将使用ASCII 字符集来编码文件。
3. 配置日志文件槽:在创建日志文件槽后,我们需要对其进行一些配置,以确定日志文件的名称、格式和写入行为等。
下面是一个配置文件槽的示例:cpp创建一个文件槽,指定文件名、写入方式和格式化器boost::shared_ptr<file_sink> sink =boost::make_shared<file_sink>(keywords::file_name = "logs/mylog_N.log", 文件名格式keywords::rotation_size = 10 * 1024 * 1024, 文件大小的限制keywords::auto_flush = true 自动刷新文件);在这里,我们使用了Boost.Log 提供的关键字来配置文件槽。
boost 编译参数
boost 编译参数boost是一个开源的C++库,提供了丰富的功能和工具,用于增强C++的性能和功能。
在编译boost库时,可以使用不同的编译参数来优化编译过程和生成的代码。
本文将介绍几个常用的boost编译参数,并对其功能和用法进行详细说明。
一、--with-<library>参数--with-<library>参数用于指定需要编译的boost库。
boost库提供了很多模块,如system、filesystem、thread等,可以根据具体需求选择需要编译的模块。
例如,使用--with-system参数可以编译boost.system库,用于处理系统相关的功能。
二、--without-<library>参数--without-<library>参数用于指定不需要编译的boost库。
如果不需要某个库的功能,可以使用该参数禁用对应的库的编译。
例如,使用--without-regex参数可以禁用正则表达式库的编译。
三、--build-type参数--build-type参数用于指定编译类型,常用的取值有debug和release。
debug类型用于调试和测试,生成的代码包含调试信息;release类型用于发布,生成的代码进行了优化,更加高效。
可以根据具体需求选择编译类型。
四、--toolset参数--toolset参数用于指定编译工具集,如gcc、clang、msvc等。
不同的编译工具集有不同的编译器和选项,可以根据具体需求选择合适的编译工具集。
例如,使用--toolset=gcc可以指定使用gcc编译器进行编译。
五、--cxxflags参数--cxxflags参数用于指定额外的编译选项。
可以使用该参数添加自定义的编译选项,如优化级别、警告级别等。
例如,使用--cxxflags="-O2 -Wall"可以指定编译器使用级别为2的优化,并开启所有警告。
boost 编译参数
boost 编译参数摘要:1.编译参数简介2.Boost 编译参数的作用3.Boost 编译参数的设置方法4.Boost 编译参数的常见问题及解决方法5.总结正文:Boost 是一个广泛应用于C++编程语言的开源库,它提供了许多有用的功能,例如智能指针、正则表达式、文件系统操作等。
在使用Boost 库进行编程时,我们需要对其进行编译,而编译过程中所使用的参数可以影响编译的结果。
因此,了解Boost 编译参数的作用及设置方法是非常有必要的。
首先,让我们了解一下Boost 编译参数。
编译参数,也称为编译选项或编译开关,是在编译源代码时告诉编译器如何处理源代码的一种方式。
Boost 编译参数主要用于控制编译器的行为,例如选择编译器支持的特性、优化编译等。
接下来,我们来探讨一下Boost 编译参数的作用。
Boost 编译参数可以帮助我们实现以下目标:1.选择编译器支持的特性。
Boost 库提供了许多高级特性,但并非所有编译器都支持这些特性。
通过设置编译参数,我们可以选择编译器支持的特性,从而确保编译的顺利进行。
2.优化编译结果。
通过设置编译参数,我们可以控制编译器生成的代码的性能和体积。
例如,我们可以使用编译参数启用编译器的优化功能,从而生成更高效的可执行文件。
3.控制编译过程的行为。
通过设置编译参数,我们可以控制编译器在编译过程中的行为。
例如,我们可以设置编译参数以启用或禁用编译器警告,或者控制编译器如何处理未定义的行为。
那么,如何设置Boost 编译参数呢?我们可以通过修改Boost 库的配置文件(例如,`project-config.jam`)或直接在编译命令行中指定编译参数。
具体方法取决于我们使用的编译器和构建工具。
在设置Boost 编译参数时,我们需要注意以下几点:1.确保所使用的编译器支持Boost 库。
不同的编译器对Boost 库的支持程度不同,因此在设置编译参数之前,我们需要确保所使用的编译器支持Boost 库。
boost的编译使用
boost的编译使用Boost是一个开源的C++库集合,提供了各种功能和工具,用于加速C++应用程序的开发过程。
它旨在提高C++程序的性能、可移植性和功能扩展性。
Boost库被广泛应用于各种领域,如网络编程、多线程编程、图形图像处理等。
Boost的编译使用非常简单,只需按照以下步骤进行即可:1. 下载Boost库:从官方网站下载最新版本的Boost库,解压缩到任意目录。
2. 设置环境变量:将Boost库所在目录添加到系统的环境变量中,以便编译器可以找到Boost库的头文件和库文件。
3. 编写代码:使用Boost库提供的功能和工具编写C++代码。
比如,如果需要使用Boost的字符串处理功能,只需包含相应的头文件,并使用Boost命名空间即可。
4. 编译代码:使用C++编译器编译代码。
在编译时,需要指定Boost 库的路径和库文件名。
5. 运行程序:编译成功后,就可以运行生成的可执行文件了。
根据具体的应用场景,可能需要提供一些参数或输入文件。
Boost库提供了丰富多样的功能和工具,可以大大简化C++程序的开发过程。
比如,Boost的智能指针可以帮助管理动态内存,避免内存泄漏;Boost的多线程库可以方便地实现并发编程;Boost的正则表达式库可以进行强大的文本匹配和处理等等。
Boost是一个功能强大的C++库集合,可以提高C++程序的开发效率和性能。
使用Boost库,开发者可以更加专注于业务逻辑的实现,而不必过多关注底层的细节。
同时,Boost库的开源性和广泛应用性也使得开发者可以从社区中获得丰富的资源和支持。
无论是初学者还是有经验的开发者,都可以从Boost库中受益,并加速自己的C++开发过程。
boost库中log模块的使用
boost库中log模块的使用utillog.h/// This file is modified from c++ boost log library/** Copyright Andrey Semashev 2007 - 2013.* Distributed under the Boost Software License, Version 1.0. * (See accompanying file LICENSE_1_0.txt or copy at* /LICENSE_1_0.txt)*/#ifndef RGM_UTILLOG_HPP_#define RGM_UTILLOG_HPP_#include <cstddef>#include <string>#include <string.h>#include <ostream>#include <fstream>#include <iomanip>#include <boost/format.hpp>#include <boost/smart_ptr/shared_ptr.hpp>#include <boost/smart_ptr/make_shared_object.hpp>#include <boost/phoenix/bind.hpp>#include <boost/date_time/posix_time/posix_time.hpp> #include <boost/log/core.hpp>#include <boost/log/expressions.hpp>#include <boost/log/attributes.hpp>#include <boost/log/sources/basic_logger.hpp>#include <boost/log/sources/severity_logger.hpp>#include <boost/log/sources/severity_channel_logger.hpp> #include <boost/log/sources/record_ostream.hpp>#include <boost/log/sinks/sync_frontend.hpp>#include <boost/log/sinks/text_ostream_backend.hpp>#include <boost/log/attributes/scoped_attribute.hpp>#include <boost/log/utility/value_ref.hpp>#include <boost/log/utility/setup/common_attributes.hpp> #include <boost/log/utility/setup/console.hpp>#include "UtilFile.hpp"namespace RGM{namespace logging = boost::log;namespace src = boost::log::sources;namespace expr = boost::log::expressions; namespace sinks = boost::log::sinks;namespace attrs = boost::log::attributes;namespace keywords = boost::log::keywords;/// We define our own severity levelsenum severity_level {normal,notification,warning,error,critical};/// The operator puts a human-friendly representation of the severity level to the streamstd::ostream& operator<< (std::ostream& strm, severity_level level);/// init the loggerBOOST_LOG_ATTRIBUTE_KEYWORD(line_id, "LineID", unsigned int)BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", severity_level)BOOST_LOG_ATTRIBUTE_KEYWORD(tag_attr, "Tag", std::string)#ifndef RGM_NO_LOGvoid log_init();#endif/// Get file name#define FILENAME \(strrchr(__FILE__, FileUtil::FILESEP) ? \strrchr(__FILE__, FileUtil::FILESEP) + 1 : __FILE__)/// Define a logger (multithread)#ifdef RGM_NO_LOG#define DEFINE_RGM_LOGGER#else#define DEFINE_RGM_LOGGER \src::severity_logger_mt< severity_level > slg#endif/// Record a log#ifdef RGM_NO_LOG#define RGM_LOG(level, msg)#else#define RGM_LOG(level, msg) \do { \BOOST_LOG_SCOPED_THREAD_TAG("Tag", FILENAME); \BOOST_LOG_SEV(slg, level) << msg; \} while (0)#endif/// Define CHECK macro#ifdef RGM_NO_LOG#define RGM_CHECK(conditions, level)#else#define RGM_CHECK(conditions, level) \do { \if (!(conditions)) { \BOOST_LOG_SCOPED_THREAD_TAG("Tag", FILENAME); \BOOST_LOG_SEV(slg, level) << "Check Failed: " << #conditions << "(" << FILENAME << ")"; \if ( level >= error ) {\exit(0);\}\} \} while (0)#endif/// Check equality#define RGM_CHECK_EQ(lhs, rhs) \RGM_CHECK((lhs == rhs), error)/// Check not equal#define RGM_CHECK_NOTEQ(lhs, rhs) \ RGM_CHECK((lhs != rhs), error)/// Check greater than#define RGM_CHECK_GT(lhs, rhs) \ RGM_CHECK((lhs > rhs), error)/// Check greater than or equal to#define RGM_CHECK_GE(lhs, rhs) \ RGM_CHECK((lhs >= rhs), error)/// Check less than#define RGM_CHECK_LT(lhs, rhs) \ RGM_CHECK((lhs < rhs), error)/// Check less than or equal to#define RGM_CHECK_LE(lhs, rhs) \ RGM_CHECK((lhs <= rhs), error)/// Check not null#define RGM_CHECK_NOTNULL(arg) \ RGM_CHECK((arg != NULL), error)} // namespace RGM#endif // RGM_UTILLOG_HPP_utillog.cpp#include "UtilLog.hpp"namespace RGM{std::ostream& operator<< (std::ostream& strm, severity_level level){static const char* strings[] = {"normal","notification","warning","error","critical"};if (static_cast< std::size_t >(level) < sizeof(strings) / sizeof(*strings)) {strm << strings[level];} else {strm << static_cast< int >(level);}return strm;}#ifndef RGM_NO_LOGvoid log_init(){// Setup the common formatter for all sinkslogging::formatter fmt = expr::stream<< expr::if_(expr::has_attr(tag_attr))[expr::stream << "[" << tag_attr << "] "]<< std::setw(6) << std::setfill('0')<< line_id << std::setfill(' ')<< ": <" << severity << ">\t"<< expr::smessage;// Initialize sinkstypedef sinks::synchronous_sink< sinks::text_ostream_backend > text_sink;boost::shared_ptr< text_sink > sink = boost::make_shared< text_sink >();sink->locked_backend()->add_stream(boost::make_shared< std::ofstream >("full.log"));sink->set_formatter(fmt);logging::core::get()->add_sink(sink);sink = boost::make_shared< text_sink >();sink->locked_backend()->add_stream(boost::make_shared< std::ofstream >("important.log"));sink->set_formatter(fmt);sink->set_filter(severity >= warning ||(expr::has_attr(tag_attr) && tag_attr == "IMPORTANT_MESSAGE"));logging::core::get()->add_sink(sink);// add consolelogging::add_console_log(std::cout,keywords::auto_flush = true);// Add attributeslogging::add_common_attributes();}#endif} // namespace RGM只要在代码的起始调用log_init后,在程序代码中代用下面格式的代码即可进行boost库中log模块。
boost深入剖析之使用技巧 第五讲boost 正则表达式库
7
第七节:match_results 和 sub_match
《boost深入剖析之使用技巧》
第五讲:boost 正则表达式库
第一节: 什么是xpressive库
1、是一个正则表达式模板库 2、可以以字符串方式编写并在运行期进行动态的分析(动态regexes) 3、或者作为表达式模板方式编写并在编译期进行分析(静态regexes) 4、动态regexes的优点在于,它们可以在运行期从用户的输入中获得,或者是从一个初始化文件中读取 5、静态regexes的优点在于以C++表达式而不是字符串进行表示,因此在编译期进行语法检查,可以在正则表达
式匹配时回调。由于是静态绑定,
第二节: xpressive头文件
xpressive提供动态和静态两种使用方式 如果想混用两种方式或不关心这两种方式 则 #include <boost/xpressive/xpressive.hpp> 如果仅想使用静态方式 则 #include <boost/xpressive/xpressive_static.hpp> 如果仅想使用动态方式 则 #include <boost/xpressive/xpressive_dynamic.hpp> 引入名字空间 using namespace boost::xpressive;
13
结束语
• 本讲回顾
boost 原理 fb
boost原理fbBoost是一种流行的编程库,它提供了许多有用的功能和工具,用于加速开发过程。
在许多情况下,使用Boost库可以提高代码的性能和效率,同时减少开发时间。
一、Boost库概述Boost库是一个广泛使用的开源库,它提供了许多高级功能和工具,用于加速开发过程。
它是由一系列独立的库组成的,这些库涵盖了各种不同的领域,如数学、算法、容器、并发编程等。
Boost库的目标是提供高质量、可移植和易于使用的工具,以帮助开发人员更快地构建高质量的应用程序。
二、Boost库的主要功能1.高效的数据结构:Boost库提供了许多高效的数据结构,如向量、列表、队列、堆栈等。
这些数据结构可以显著提高程序的性能和效率。
2.高效的算法:Boost库提供了许多高效的算法,用于处理各种数据结构和集合,如排序、搜索、过滤等。
这些算法通常比标准的C++库更高效。
3.多线程编程:Boost库还提供了用于多线程编程的工具和库,以支持并发和并行计算。
这可以帮助开发人员更快地构建高并发应用程序。
4.模板元编程:Boost库还提供了模板元编程工具,用于优化编译器生成的代码,并实现更高级别的抽象。
这有助于开发人员更快地构建复杂的应用程序。
三、使用Boost库的优点使用Boost库可以带来许多优点,包括:1.提高代码性能:Boost库提供的高效数据结构和算法可以显著提高代码的性能和效率。
2.减少开发时间:Boost库提供的高级工具和库可以简化开发过程,减少开发时间。
3.提高代码质量:Boost库提供的高质量工具和库可以提高代码的可读性和可维护性,从而降低维护成本。
4.跨平台兼容性:Boost库是开源的,这意味着它可以在各种平台上使用,包括Windows、Linux和MacOS等。
四、总结Boost库是一个广泛使用的开源库,提供了许多高级功能和工具,用于加速开发过程。
使用Boost库可以提高代码性能、减少开发时间和提高代码质量。
通过了解Boost库的主要功能和使用它的优点,开发人员可以更好地利用这个强大的工具包来构建高质量的应用程序。
boost库 tag用法
boost库 tag用法
Boost库是一个流行的C++库,它提供了许多功能强大的工具和组件,用于简化和加速C++程序的开发。
其中,Boost库中的tag用法是非常重要的一个部分,它可以帮助程序员更好地管理和组织代码。
在Boost库中,tag通常用于标记和识别特定的代码段或功能模块。
通过使用tag,程序员可以更容易地定位和理解代码,减少错误和提高代码的可维护性。
例如,当一个函数或类被标记为特定的tag时,其他开发人员就可以快速地找到并理解这段代码的作用和用法。
另外,tag还可以用于在代码中引入特定的功能或行为。
通过使用tag,程序员可以根据需要对代码进行组织和管理,实现更加灵活和高效的开发。
例如,可以使用tag来标记不同版本的代码,以便在不同的环境中进行编译和部署。
总的来说,Boost库中的tag用法为程序员提供了一种简单而强大的工具,用于管理和组织代码。
通过合理地使用tag,程序员可以更好地理解和利用Boost库中的功能,提高代码的质量和可维
护性,加快程序的开发和部署速度。
因此,熟练掌握Boost库中tag的用法对于C++程序员来说是非常重要的。
boost 编译 参数
boost 编译参数使用Boost编译参数优化C++程序的方法引言:在C++编程中,程序的性能优化是一个重要的问题。
而Boost是一个C++库的集合,提供了许多实用的工具和组件,可以帮助我们更高效地编写C++程序。
本文将介绍如何使用Boost编译参数来优化C++程序的性能。
一、了解Boost编译参数的作用Boost提供了一些编译参数,可以在编译C++程序时对程序进行优化。
这些编译参数可以帮助我们提高程序的性能,减少内存的占用,提高代码质量等。
二、使用Boost编译参数进行性能优化1. 使用`-O`参数进行编译优化。
`-O`参数是GCC编译器的一个优化选项,它可以对代码进行优化,提高程序的执行速度。
在使用Boost时,我们可以将该参数与其他Boost编译参数一起使用,以获得更好的性能优化效果。
2. 使用`-DNDEBUG`参数进行代码优化。
`-DNDEBUG`参数可以关闭断言,从而减少程序的运行时间。
在使用Boost时,我们可以通过在编译命令中添加`-DNDEBUG`参数来关闭断言,以提高程序的性能。
3. 使用`-march=native`参数进行硬件优化。
`-march=native`参数告诉编译器使用本地处理器的最佳指令集。
这样可以充分利用处理器的特性,提高代码的执行效率。
在使用Boost时,我们可以通过在编译命令中添加`-march=native`参数来进行硬件优化。
4. 使用`-finline-functions`参数进行函数内联。
函数内联可以减少函数调用的开销,提高程序的执行速度。
在使用Boost时,我们可以通过在编译命令中添加`-finline-functions`参数来进行函数内联优化。
5. 使用`-fno-exceptions`参数进行异常处理优化。
异常处理是一种消耗资源的操作,对程序的性能有一定的影响。
在使用Boost时,如果我们确定程序中不会出现异常,可以通过在编译命令中添加`-fno-exceptions`参数来关闭异常处理,以提高程序的性能。
C++日志模块
C++日志模块功能介绍:可实时监控程序的运行状态,实时产生txt日志,用户可以根据需求,是否关闭日志。
演示:1.建立MFC对话框工程,并设置x64模式,多字节模式,如下图2.添加日志模块3.包含日志模块头文件#include "BoostLog.h"4.测试客户建立savelog文件,则产生日志文件,删除则不产生。
5.产生日志文件如下:代码如下:1. 头文件BoostLog.h#ifndef LOG_H_#define LOG_H_#include<time.h>#include<windows.h>#include<string>class Log{public:Log(const char* fileName, int line, int saveLog = 1, int printLog = 1, bool doCash = true);void Init(const char* fileName, int line, int saveLog, int printLog, bool doCash);void operator ()(char *charFmt, ... );char m_buff[LogBuff_Len]; /**<日志内容缓存>*/int m_saveLog; /**<是否要把日志写入文件>*/int m_printLog; /**<是否要把日子打印在屏幕上>*/bool m_doCash;#ifdef WIN32#define FILENAME(strrchr(__FILE__, '\\') ? strrchr(__FILE__, '\\') + 1 : __FILE__)#else#define FILENAME (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)#endif#define Print_Save_Nocash Log(__FILE__, __LINE__, 1, 1, false)#define Print_Save_Docash Log(__FILE__, __LINE__, 1, 1, true)#define NoPrint_Save_Nocash Log(__FILE__, __LINE__, 1, 0, false)#define NoPrint_Save_Docash Log(__FILE__, __LINE__, 1, 0, true)//--发布版本,把下面一行注释掉#define LiuDebug#ifdef LiuDebug#undef Print#define Print NoPrint_Save_Nocash#else#undef Print#define Print NoPrint_Save_Nocash#endifclass LogManager{public:LogManager();~LogManager();/**@brief 把缓存里的日志内容写入文件*/void SaveLog();/**@brief 把日志类里的日志信息放入缓存,消息过长,或时间到了就写文件@param Log [in] 日志类*/void PutLog(const char *pBuff, int buffLen, bool doCash);/**@brief 把缓存1和缓存2里的内容连接起来写入文件@param pBuff [in] 缓存@param buffLen [in] 缓存里的内容长度@param pBuff2 [in] 缓存2,值为0时不考虑缓存2的数据@param buffLen2 [in] 缓存2里的内容长度*/void SaveFile(const char *pBuff, int buffLen, const char *pBuff2, int buffLen2);bool m_bDebug;bool m_bShowCmd;private:/**@brief 缓存长度*/#define LogBuffMaxLen 20480/**@brief 缓存里的数据超出该长度的写入文件*/#define LogBuffSaveLen 10240int m_inputLen; /**<缓存里的数据实际长度>*/char m_buff[LogBuffMaxLen]; /**<缓存>*/time_t m_lastSaveTime;CRITICAL_SECTION m_buffSection;//boost::mutex m_buffMutex; /**<缓存锁>*/};extern LogManager g_logManager; /**<日志内容写硬盘缓存类实例>*/#if defined Name_Logon#define LOG_FOLDER_NAME "LogonS"#elif defined Name_GameServer#define LOG_FOLDER_NAME "GameS"#else#define LOG_FOLDER_NAME"Log"#ifndef LiuDebug#define Print Log(__FILE__, __LINE__, 0, 0, false)#endif#endifextern char* WcharToChar(const wchar_t* wp);extern wchar_t* CharToWchar(const char* c);extern std::string Get16Form(const char *pBuff, int len);extern std::string Get16Form2(const char *pBuff, int len);//把16进制的字符串转成字符串,返还0表示成功extern int GetBuffFrom16(char *pOutBuff, int outLen, const char *pInBuff, int inLen); extern std::string GetNoNullForm(const char *pBuff, int len);2. BoostLog.CPP#include"stdafx.h"#include"BoostLog.h"#include<stdio.h>#include<stdarg.h>#include<string.h>#ifdef WIN32#include<direct.h>#include<io.h>#include<windows.h>#else#include<sys/stat.h>#include<time.h>#include<unistd.h>#endifstatic char* GetCurrPath(){static char path[MAX_PATH] = {0};static int nCount = 1;if(nCount > 0){nCount--;GetModuleFileName(NULL, path, MAX_PATH);(strrchr(path, '\\'))[0] = 0;}return path;}Log::Log(const char* fileName, int line, int saveLog, int printLog, bool doCash){#ifdef NO_SAVE_LOG#endifm_saveLog = saveLog;m_printLog = printLog;m_doCash = doCash;if((m_saveLog == 0 && m_printLog == 0) || (!g_logManager.m_bDebug&& !g_logManager.m_bShowCmd)){return;}//提取文件名int fileLen = (int)strlen(fileName);int headIndex = fileLen - 1;for( ; headIndex >= 0 && (fileName[headIndex] != '\\' && fileName[headIndex] != '/'); headIndex--);char onlyName[256];memset( onlyName, 0, sizeof(onlyName));if( fileLen - 1 - headIndex < 256 ){memcpy( onlyName, fileName + headIndex + 1, fileLen - headIndex - 1 );}memset( m_buff, 0, sizeof( m_buff));strncpy( m_buff, onlyName, strlen( onlyName));char lineBuff[32];sprintf( lineBuff, "[%d]", line);strncat( m_buff, lineBuff, strlen( lineBuff ));char timeBuff[64];time_t curTime = time(0);struct tm* formatTime = localtime(&curTime);sprintf( timeBuff, "[%02d:%02d:%02d] ", formatTime->tm_hour, formatTime->tm_min, formatTime->tm_sec );strncat( m_buff, timeBuff, strlen(timeBuff));//boost::posix_time::ptime nowTime = boost::posix_time::second_clock::local_time();//boost::posix_time::time_duration td = nowTime.time_of_day();//sprintf( timeBuff, "[%s] ", (boost::posix_time::to_simple_string(td)).data() );//strncat( m_buff, timeBuff, strlen( timeBuff ) );}void Log::operator()(char *charFmt, ... ){#ifdef NO_SAVE_LOG#endifif((m_saveLog == 0 && m_printLog == 0) || (!g_logManager.m_bDebug&& !g_logManager.m_bShowCmd)){return;}//char tmpBuff[LogBuff_Len];//memset( tmpBuff, 0, sizeof( tmpBuff ) );int curBuffLen = strlen(m_buff);va_list ptr;va_start( ptr, charFmt);_vsnprintf( m_buff + curBuffLen, LogBuff_Len - (curBuffLen+10), charFmt, ptr );va_end( ptr );if( m_printLog ){printf("%s\n", m_buff);}if( m_saveLog == 0 ){return;}strncat( m_buff, "\r\n\0", strlen("\r\n\0"));g_logManager.PutLog( m_buff, strlen(m_buff), m_doCash );}LogManager g_logManager;LogManager::LogManager(){m_inputLen = 0;m_lastSaveTime = 0;m_bDebug = false;m_bShowCmd = false;GetCurrPath();char DebugName[512];sprintf( DebugName, "SaveLog");#ifdef WIN32if(_access( DebugName, 0 ) >= 0 ){m_bDebug = true;}sprintf( DebugName, "SaveLog.txt");if(_access( DebugName, 0 ) >= 0 ){m_bDebug = true;}sprintf( DebugName, "ShowCmd");if(_access( DebugName, 0 ) >= 0 ){m_bShowCmd = true;AllocConsole();freopen("CONIN$", "r+t", stdin);freopen("CONOUT$", "w+t", stdout);}#elseif(access( folderName, 0 ) >= 0 ){m_bDebug = true;}#endif::InitializeCriticalSection(&m_buffSection);}LogManager::~LogManager(){SaveLog();DeleteCriticalSection(&m_buffSection);if(m_bShowCmd)FreeConsole();}void LogManager::SaveLog(){//boost::mutex::scoped_lock lock(m_buffMutex);if( m_inputLen > 0 ){::EnterCriticalSection( &m_buffSection );SaveFile(m_buff, m_inputLen, 0, 0);m_inputLen = 0;::LeaveCriticalSection( &m_buffSection );}}#define LogSaveInterval 60void LogManager::PutLog(const char *pBuff, int inputLen, bool doCash){if(!m_bDebug)return;time_t curTime = time(0);if(doCash == false){//不做缓存,直接写文件// ::EnterCriticalSection( &m_buffSection );SaveFile(pBuff, inputLen, 0, 0);// ::LeaveCriticalSection( &m_buffSection );}else{//做缓存//锁一下::EnterCriticalSection( &m_buffSection );if( m_inputLen + inputLen > LogBuffSaveLen || m_lastSaveTime + LogSaveInterval <curTime ){//缓存满了或者时间到了,写文件m_lastSaveTime = curTime;SaveFile(m_buff, m_inputLen, pBuff, inputLen);m_inputLen = 0;}else{//否则,暂时存到缓存char *p = m_buff + m_inputLen;memcpy( p, pBuff, inputLen);m_inputLen += inputLen;}::LeaveCriticalSection( &m_buffSection );}}//注意,这个是要包含在线程锁 m_buffSection 里的void LogManager::SaveFile(const char*pBuff, int buffLen, const char*pBuff2, int buffLen2) {if(pBuff == 0 ){return;}char folderName[512];time_t curTime = time(0);struct tm* formatTime = localtime(&curTime);sprintf( folderName, "%s\\%s_%d-%02d-%02d",GetCurrPath(), LOG_FOLDER_NAME, formatTime->tm_year+1900, formatTime->tm_mon+1, formatTime->tm_mday );#ifdef WIN32if(_access( folderName, 0 ) == -1 ){_mkdir( folderName );}#elseif(access( folderName, 0 ) == -1 ){mkdir( folderName, S_IWRITE );}#endifchar fileName[512];sprintf( fileName, "%s\\%02d.txt" , folderName, formatTime->tm_hour );{FILE *fp;fp=fopen( fileName,"a");if( fp == 0 ){printf("open file failed[%s]\n", fileName );return;}fwrite(pBuff, 1, buffLen , fp );if(pBuff2){fwrite(pBuff2, 1, buffLen2 , fp );}fclose( fp );}}char* WcharToChar(const wchar_t* wp){char *m_char;int len= WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),NULL,0,NULL,NULL);m_char=new char[len+1];WideCharToMultiByte(CP_ACP,0,wp,wcslen(wp),m_char,len,NULL,NULL);m_char[len]='\0';return m_char;}wchar_t* CharToWchar(const char* c){wchar_t *m_wchar;int len = MultiByteToWideChar(CP_ACP,0,c,strlen(c),NULL,0);m_wchar=new wchar_t[len+1];memset(m_wchar, 0, sizeof(wchar_t)*(len+1));MultiByteToWideChar(CP_ACP,0,c,strlen(c),m_wchar,len);return m_wchar;}std::string Get16Form(const char *pBuff, int len){std::string str16;for(int n = 0; n < len; n ++ ){int i1,i2;char c1[2], c2[2];i1 = (unsigned char)pBuff[n]/16;i2 = (unsigned char)pBuff[n]%16;sprintf( c1, "%x", i1 );sprintf( c2, "%x", i2 );str16 += c1;str16 += c2;}return str16;}std::string Get16Form2(const char *pBuff, int len){std::string str16;for(int n = 0; n < len; n ++ ){if(n%16==0){str16 +="\r\n";}int i1,i2;char c1[2], c2[2];i1 = (unsigned char)pBuff[n]/16;i2 = (unsigned char)pBuff[n]%16;sprintf( c1, "%x", i1 );sprintf( c2, "%x", i2 );str16 += c1;str16 += c2;str16 +=' ';}return str16;}//把16进制的字符串转成字符串int GetBuffFrom16(char *pOutBuff, int outLen, const char *pInBuff, int inLen) {memset(pOutBuff, 0, outLen);if(outLen < inLen/2){return -1;}if(inLen % 2 != 0 ){return -2;}for(int n = 0; n < inLen; n += 2 ){//高位if(pInBuff[n] >= '0' && pInBuff[n] <= '9'){pOutBuff[n/2] = (pInBuff[n]-'0')*16;}else if(pInBuff[n] >= 'a' && pInBuff[n] <= 'f'){pOutBuff[n/2] = (pInBuff[n]-'a'+10)*16;}else if(pInBuff[n] >= 'A' && pInBuff[n] <= 'F'){pOutBuff[n/2] = (pInBuff[n]-'A'+10)*16;}else{return n;}//低位if(pInBuff[n+1] >= '0' && pInBuff[n+1] <= '9'){pOutBuff[n/2] += (pInBuff[n+1]-'0');}else if(pInBuff[n+1] >= 'a' && pInBuff[n+1] <= 'f'){pOutBuff[n/2] += (pInBuff[n+1]-'a'+10);}else if(pInBuff[n+1] >= 'A' && pInBuff[n+1] <= 'F'){pOutBuff[n/2] += (pInBuff[n+1]-'A'+10);}else{return n;}}return 0;}std::string GetNoNullForm(const char *pBuff, int len) {std::string strnonull;for(int n = 0; n < len; n ++ ){if(pBuff[n] == 0){strnonull +="_";}else{strnonull +=pBuff[n];}}return strnonull;}。
enablelog注解
enablelog注解摘要:1.简介2.enablelog 注解的作用3.如何使用enablelog 注解4.enablelog 注解的配置选项5.总结正文:在Android 开发中,log 日志是开发者调试程序、分析问题的重要工具。
然而,在实际应用中,过多的日志输出可能会影响程序的性能,甚至被Google Play 等应用市场拒绝。
为了解决这个问题,Android 开发者可以使用enablelog 注解,来有选择地开启或关闭日志输出。
enablelog 注解的作用是控制log 开关,可以根据不同级别的日志输出,来灵活地调整日志的显示。
通过使用这个注解,开发者可以在开发过程中开启日志输出,以便于调试程序;在发布版本中关闭日志输出,以提高程序性能。
要使用enablelog 注解,首先需要在项目的根目录下创建一个名为“annotation”的文件夹,然后在该文件夹下创建一个名为“EnableLog”的Java 文件。
在这个文件中,定义一个名为“EnableLog”的注解,并设置它的可见性为“public”。
创建好注解后,可以在需要控制日志输出的类或方法上添加这个注解。
例如,可以在Activity 类或Service 类上添加enablelog 注解,来控制整个类或该类中的某个方法的日志输出。
enablelog 注解还提供了配置选项,可以设置日志输出的级别。
共有四个级别可供选择,分别是:- VERBOSE:输出所有级别的日志- DEBUG:输出debug 级别的日志- INFO:输出info 级别的日志- WARN:输出warn 级别的日志以下是一个使用enablelog 注解的示例:```java@EnableLog(level = EnableLog.VERBOSE)public class MainActivity extends AppCompatActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.activity_main);// 输出日志Log.v("MainActivity", "Hello World!");}}```在上述代码中,我们为MainActivity 类添加了enablelog 注解,并设置了日志输出级别为VERBOSE。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Boost Log简介Boost LogOverviewVIM Research Group先进感知与控制实验室中国科学技术大学信息科学技术学院2015年2月修改记录Index Author Revision Date Remark1 江坤V1.0 2014-02-09 初始版本1. 安装 (4)1.1. 软硬件需求 (4)1.1.1.软件需求 (4)1.1.2.硬件需求 (4)1.2. 安装流程 (4)2. Boost log 简介 (5)3. Boost Log 基本使用流程 (6)3.1. 案例一:Boost Log简单输出到控制台 (6)3.2. 案例二:Boost Log简单输出到控制台 (7)3.3. 案例三:Boost Log简单输出到控制台 (7)4. 结论 (9)本文档用于描述boost log 的安装,日常使用以及功能扩展。
1.安装本部分描述boost 1.57.0的安装方法。
1.1.软硬件需求1.1.1.软件需求安装boost库的主机需支持GCC和GCC-C++之外,还需要两个开发库:bzip2-devel 和python-devel。
1.1.2.硬件需求运行Ubuntu12.04操作系统的主机一台。
1.2.安装流程首先于Boost Libraries的官网下载Boost 1.57.0的安装包,下载地址如下http://www.boost .org/users/history/version_1_57_0.html。
然后解压缩,进入到boost_1_57_0的目录下。
若在本机之前已安装过老版本的boost库,需要将之前include文件夹下和动态库中boost 库的相关文件删除,然后再编译安装,由于boost源码包中自带配置脚本,可直接使用,即运行booststrap.sh这个脚本配置。
然后按照提示信息,输入sudo ./b2指令编译,然后就是漫长的等待,等待其是否编译成功。
当输出如下信息表明编译成功:若为安装成功需按照提示信息做相应处理,若未安装bzip2-devel 或python-devel会提示报错此时需安装相应的库,再重新安装。
最后运行./b2 install --prefix=/usr/local指令完成boost库的安装,安装后的头文件在/usr/local/include/boost里面,而相应的库在/usr/local/lib/libboost_*。
2.Boost log 简介本节将简单介绍Boost Log 架构,及其工作流程。
Boost Log的工作流程如下图所示:如上图所示,Boost Log工作过程主要包括三部分,即收集源端日志信息,根据设置处理源端日志信息,最后将处理后的日志信息输出到指定的位置。
上图最左端描述的是收集日志信息:日志信息的输出源可以根据需求进行多种设置,包括全局的,局部的等等,在代码中一般表现为声明输出日志的对象,再指定日志的等级从而将其输出。
同时Boost Log也提供类似于cout类相似的更能,即不需要声明输出源,直接输出日志信息。
上图中间部分为日志信息处理过程,比较典型的是对于过滤器的设置,即设置日志信息的输出权限,屏蔽低等级日志信息的输出,同时也可以对其增加时间发生的时间等信息,从而更详尽的描述已发生的事件,这部分大多数为系统自带的函数,需要做的仅仅是为满足需求所做的一些配置,并不需要编写太多代码。
上图最右边的两部分则展现了日志输出的过程,首先需将经处理的数据取出,然后再将处理后的日志信息输出到指定的位置,需要说明的是,Boost Log不仅支持输出日志信息,还支持输出统计数据,如在windows下输出到EXCEL以及发出警报声。
这一过程,与处理信息部分交互的代码多为系统自带,并不需要编写,而输出部分,虽然Boost Log提供了很多选择,但也开放了接口,从而更好的满足用户的需求。
上图所示的工作流程为Boost Log一般工作过程,而若仅仅是简单的使用Boost Log,并不需要编写整个流程的代码,只需要根据需求进行简单的设置即可,Boost Log本身提供了多种设置选项,可满足大多数需求。
但能够了解Boost Log的工作流程对于较复杂的日志设置还是很有帮助的。
3.Boost Log 基本使用流程若仅仅是对于Boost Log的简单使用,代码的编写并不复杂。
若仅仅是实现类似于cout 类似的功能,包含头文件后直接调用即可。
而稍复杂的应用案例,首先应当写好初始化函数指定配置信息,再在使用前初始化,然后再根据设置调用相应的日志信息输出函数即可,使用起来并不复杂。
但是,编译的时候注意要依次加载libboost_log_setup.a,libboost_log.a,libboost thread, libboostsystem这几个库,需注意的是,一定要将libboost_log_setup.a 置于libboost_log.a 之前,否则编译很难通过。
另外还需加载宏BOOST_LOG_DYN_LINK或者BOOST_ALL_DYN_LINK。
下面将结合三个具体案例介绍Boost Log的使用,更多的功能还需查阅相关资料实现。
3.1.案例一:Boost Log简单输出到控制台该案例所实现的功能类似于cout的输出功能,但相较于cout的简单输出,其对于系统的软硬件开销更小,提供的信息更为丰富,包括时间,等级,输出信息的线程标号。
其代码如下:#include <boost/log/trivial.hpp>int main(int, char*[]){BOOST_LOG_TRIVIAL(trace) << "A trace severity message";BOOST_LOG_TRIVIAL(debug) << "A debug severity message";BOOST_LOG_TRIVIAL(info) << "An informational severity message";BOOST_LOG_TRIVIAL(warning) << "A warning severity message";BOOST_LOG_TRIVIAL(error) << "An error severity message";BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";return 0;}如上输入代码,经前文所述的编译方式,可得到如下图的输出结果:上图输出的信息依次为日志发生的时间,输出线程标号,等级以及具体的输出信息。
3.2.案例二:Boost Log简单输出到控制台该案例与案例一类似,不过需经过设置屏蔽info等级以下的日志信息输出。
其代码如下:#include <boost/log/trivial.hpp>#include <boost/log/core.hpp>#include <boost/log/trivial.hpp>#include <boost/log/expressions.hpp>namespace logging = boost::log;void init(){logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::info);}int main(int, char*[]){init();BOOST_LOG_TRIVIAL(trace) << "A trace severity message";BOOST_LOG_TRIVIAL(debug) << "A debug severity message";BOOST_LOG_TRIVIAL(info) << "An informational severity message";BOOST_LOG_TRIVIAL(warning) << "A warning severity message";BOOST_LOG_TRIVIAL(error) << "An error severity message";BOOST_LOG_TRIVIAL(fatal) << "A fatal severity message";return 0;}如上输入代码,经前文所述的编译方式,得到的输出结果与案例一相似,不过是少了info 等级以下的输出信息。
3.3.案例三:Boost Log简单输出到控制台该案例针对于将日志信息输出到本机的文件中,该场景小,不仅可以将案例一,二中的信息输出到文件中,还可以实现对日志的打包,即日志文件大小达到一定的数量或者在特定时间点后输出到新文件,代码后的注释将具体介绍各个设置函数的功能。
其代码如下:#include <boost/log/core.hpp>#include <boost/log/trivial.hpp>#include <boost/log/expressions.hpp>#include <boost/log/sinks/text_file_backend.hpp>#include <boost/log/utility/setup/file.hpp>#include <boost/log/utility/setup/common_attributes.hpp>#include <boost/log/sources/severity_logger.hpp>#include <boost/log/sources/record_ostream.hpp>namespace logging = boost::log;namespace src = boost::log::sources;namespace sinks = boost::log::sinks;namespace keywords = boost::log::keywords;void init(){logging::add_file_log(keywords::file_name = "sample_%N.log",//指定输出文件的名称其中%N指定按照整数的顺序输出新文件(假如日志有大小或时间限制需输出到新文件),另外%t为新文件产生数据,%y%m%d为年月日形式keywords::rotation_size = 10 * 1024 * 1024,//当日志的大小达到10M输出到新的日志文件keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),//每天零点以后输出到新的日志文件keywords::format = "[%TimeStamp%]: %Message%"//输出日志信息格式即时间戳加信息的形式);logging::core::get()->set_filter(logging::trivial::severity >= logging::trivial::info);}//]int main(int, char*[]){init();logging::add_common_attributes();using namespace logging::trivial;src::severity_logger< severity_level > lg;BOOST_LOG_SEV(lg, trace) << "A trace severity message";BOOST_LOG_SEV(lg, debug) << "A debug severity message";BOOST_LOG_SEV(lg, info) << "An informational severity message";BOOST_LOG_SEV(lg, warning) << "A warning severity message";BOOST_LOG_SEV(lg, error) << "An error severity message";BOOST_LOG_SEV(lg, fatal) << "A fatal severity message";return 0;}如上输入代码,经前文所述的编译,运行,可在当前文件夹下产生输出日志文件文件名为sample01,打开该文件,输出信息如下:4.结论Boost Log作为一款强大的日志工具,可较好的满足用户对于日志的需求,当前,可以实现本机日志功能,而网络日志功能还需继续查阅相关资料,学习设置方法才可实现。