ubuntu

Ubuntu下C++日志记录方法

小樊
48
2025-07-20 09:54:38
栏目: 编程语言

在Ubuntu下使用C++进行日志记录,有多种方法和库可供选择。以下介绍几种常用的日志记录方法及其实现步骤:

1. 使用标准库 <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;
}

优点:

缺点:

2. 使用第三方日志库 spdlog

spdlog 是一个高性能、功能丰富的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;
}

优点:

缺点:

3. 使用 log4cpp

log4cpp 是另一个流行的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;
}

优点:

缺点:

4. 使用 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。而对于简单的需求,使用标准库结合文件流也是一种可行的方案。

参考资料

0
看了该问题的人还看了