在Ubuntu下使用C++进行日志记录,有多种方法和库可供选择。以下介绍几种常用的日志记录方法及其实现步骤:
<iostream> 和文件流 <fstream>这是最基础的方法,通过C++标准库将日志信息输出到文件中。
示例代码:
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
void logMessage(const std::string& message) {
// 获取当前时间
std::time_t now = std::time(nullptr);
char timestamp[20];
std::strftime(timestamp, sizeof(timestamp), "%Y-%m-%d %H:%M:%S", std::localtime(&now));
// 打开日志文件(以追加模式)
std::ofstream logFile("app.log", std::ios::app);
if (logFile.is_open()) {
logFile << "[" << timestamp << "] " << message << std::endl;
logFile.close();
} else {
std::cerr << "无法打开日志文件。" << std::endl;
}
}
int main() {
logMessage("程序启动");
// 其他代码
logMessage("程序结束");
return 0;
}
优点:
缺点:
spdlogspdlog 是一个高性能、功能丰富的C++日志库,支持多种日志级别、异步日志记录、多种输出目标等。
安装 spdlog:
可以通过包管理器安装:
sudo apt-get update
sudo apt-get install libspdlog-dev
或者从GitHub下载并编译:
git clone https://github.com/gabime/spdlog.git
cd spdlog
mkdir build && cd build
cmake ..
make -j$(nproc)
sudo make install
示例代码:
#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
int main() {
// 创建一个基本文件日志记录器,日志级别为info,日志文件名为logs/basic.txt
auto logger = spdlog::basic_logger_mt("basic_logger", "logs/basic.txt");
logger->set_level(spdlog::level::info); // 设置日志级别
logger->info("程序启动");
// 其他代码
logger->info("程序结束");
return 0;
}
高级用法:
#include "spdlog/spdlog.h"
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
int main() {
// 创建异步日志记录器
auto async_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "logs/async_basic.txt");
async_logger->set_level(spdlog::level::info);
spdlog::set_default_logger(async_logger);
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%l] %v");
spdlog::info("这是异步日志信息");
return 0;
}
#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h"
#include "spdlog/sinks/stdout_color_sinks.h"
int main() {
auto console = spdlog::stdout_color_mt("console");
auto file = std::make_shared<spdlog::basic_file_sink_mt>("logs/multi.log", true);
auto logger = std::make_shared<spdlog::logger>("multi_logger", {console, file});
logger->set_level(spdlog::level::debug);
spdlog::set_default_logger(logger);
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%l] %v");
spdlog::debug("调试信息");
spdlog::info("信息");
spdlog::warn("警告");
spdlog::error("错误");
return 0;
}
优点:
缺点:
log4cpplog4cpp 是另一个流行的C++日志库,功能强大,支持多种日志输出方式和配置文件。
安装 log4cpp:
sudo apt-get update
sudo apt-get install liblog4cpp5-dev
示例代码:
#include <log4cpp/Category.hh>
#include <log4cpp/FileAppender.hh>
#include <log4cpp/OstreamAppender.hh>
#include <log4cpp/BasicLayout.hh>
int main() {
// 创建布局
log4cpp::BasicLayout* layout = new log4cpp::BasicLayout();
// 创建文件追加器
log4cpp::FileAppender* fileAppender = new log4cpp::FileAppender("default", "app.log");
fileAppender->setLayout(layout);
// 创建控制台追加器
log4cpp::OstreamAppender* consoleAppender = new log4cpp::OstreamAppender("console", &std::cout);
consoleAppender->setLayout(layout);
// 创建类别并设置追加器
log4cpp::Category& root = log4cpp::Category::getRoot();
root.addAppender(fileAppender);
root.addAppender(consoleAppender);
// 设置日志级别
root.setPriority(log4cpp::Priority::INFO);
root.info("程序启动");
// 其他代码
root.info("程序结束");
// 清理资源
delete layout;
delete fileAppender;
delete consoleAppender;
return 0;
}
优点:
缺点:
spdlog,性能较低。spdlog,更新频率较低。Boost.Log如果项目中已经使用了 Boost 库,可以利用 Boost.Log 进行日志记录。
安装 Boost(如果尚未安装):
sudo apt-get update
sudo apt-get install libboost-all-dev
示例代码:
#include <boost/log/trivial.hpp>
#include <boost/log/utility/setup/file.hpp>
#include <boost/log/utility/setup/console.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;
void init_logging() {
// 设置日志格式
logging::add_file_log(
keywords::file_name = "logs/boost.log",
keywords::rotation_size = 10 * 1024 * 1024, // 10MB
keywords::time_based_rotation = sinks::file::rotation_at_time_point(0, 0, 0),
keywords::format = "[%TimeStamp%]: %Message%"
);
// 设置控制台输出
logging::add_console_log(
std::cout,
keywords::format = "[%TimeStamp%]: %Message%"
);
}
int main() {
init_logging();
BOOST_LOG_TRIVIAL(info) << "程序启动";
// 其他代码
BOOST_LOG_TRIVIAL(info) << "程序结束";
return 0;
}
优点:
缺点:
对于大多数项目,推荐使用 spdlog,因为它具备高性能、易用性和丰富的功能,适合各种规模的C++项目。如果项目已经依赖于 Boost,可以考虑使用 Boost.Log。而对于简单的需求,使用标准库结合文件流也是一种可行的方案。