简述
这篇文章介绍了,如何用boost.log库简单实现C++日志记录功能。集成日志功能是软件开发中至关重要的一部分,可以提供有关应用程序运行情况的宝贵信息,有助于改进、优化和确保应用程序的可靠性和性能。
安装
墙裂推荐用 Visual Studio 的 NuGet包管理器安装boost,NuGet会自动配置包含目录、库目录等设置。具体步骤如下,
-
打开NuGet包管理器:我使用的是Visual Studio 2022,
在项目(Project)>管理NuGet程序包(Manage NuGet Packages)
打开NuGet。 -
搜索Boost库: 在NuGet包管理器窗口中,点击右上角的搜索框,并输入“Boost”来搜索Boost库的NuGet包。
-
安装Boost NuGet包: 点击选定的Boost包,在右侧面板中,点击“安装”按钮来安装选定的包。注意不同的Visual Studio 20xx 版本对应不同的boost版本。Visual Studio 2022 对应的boost版本后缀是
-vc143
后缀。
-
等待安装完成: NuGet包管理器会自动下载和安装选定的Boost库及其依赖项。安装完成后,你可以在你的C++代码中使用Boost库的功能。不需要手动配置包含目录、库目录等设置,NuGet会自动处理这些。
-
编译和运行: 确保你的项目能够正确编译,并运行示例代码来验证是否成功集成了Boost库。
-
注意:如果编译时,报错
LNK1104 cannot open file 'boost_system-vc140-mt.lib'
请在下载boost_system-vc140-mt.lib
文件并保存到projectName\packages\boost_system-vc143.1.83.0\lib\native
文件夹内。若你在网络中未找到此文件,请留言邮箱,我发给你。(这个问题似乎只发生在VS2022版本)
示例代码
下面我写了2个代码示例。示例1演示如何简单地将日志信息写到本地文件。示例2,则进阶地展示了如何将时间戳(TimeStample)、线程ID(ThreadID)等信息加入到日志文件中。
Example 1
下面代码展示了,如何将简单地将日志信息写到本地文件中。
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/expressions.hpp>
#include <iostream>
namespace logging = boost::log;
int main(int argc, char** argv)
{
// sample.log是日志文件的路径
logging::add_file_log("sample.log");
// 将内容写入日志文件的方法
BOOST_LOG_TRIVIAL(info) << "This is a test message.";
return 0;
}
代码成功运行后,本地工作目录下会生成"sample.log"文件,用记事本打开即可见到所写内容。
Example 2
进阶地,为日志消息加入时间戳(TimeStample)、线程ID(ThreadID)、消息严重级别(Severity)。
#include <boost/log/core.hpp>
#include <boost/log/trivial.hpp>
#include <boost/log/expressions.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/common_attributes.hpp>
namespace logging = boost::log;
namespace keywords = boost::log::keywords;
/// <summary>
/// Initialize the log file. 初始化日志文件函数
/// </summary>
/// <param name="log_path"> path/to/log_file. 日志文件的路径</param>
void init_logging(const std::string& log_path)
{
logging::register_simple_formatter_factory<logging::trivial::severity_level, char>("Severity");
// keywords::format设置日志格式,即可加入时间戳、线程ID等信息
logging::add_file_log
(
keywords::file_name = log_path,
keywords::format = "[%TimeStamp%] [%ThreadID%] [%Severity%] %Message%"
)
logging::add_common_attributes();
}
int main(int argc, char** argv)
{
// 初始化日志文件.
std::string log_path = "./sample.log";
init_logging(log_path);
BOOST_LOG_TRIVIAL(info) << "This is a test message.";
return 0;
}
保存的日志文件效果如下图。
Reference
- https://www.sentinelone.com/blog/getting-started-quickly-cplusplus-logging/