温馨提示×

Linux C++怎样配置日志

小樊
45
2026-08-16 00:57:44
栏目: 编程语言

在 Linux 下用 C++ 配置日志,常见做法有 使用第三方库自己实现简单日志 两种。下面从 推荐方案 → 常见库 → 自实现示例 → 最佳实践 给你一个完整说明。


一、推荐方案(按使用场景)

场景 推荐
生产环境 / 大型项目 spdlog(首选)
系统级 / 不想引入依赖 syslog
简单调试 / 小项目 自己写日志类
需要日志回滚、分级 spdlog / log4cpp

二、使用 spdlog(最推荐 ✅)

1️⃣ 安装 spdlog

Ubuntu / Debian

sudo apt install libspdlog-dev

编译安装(通用)

git clone https://github.com/gabime/spdlog.git
cd spdlog
mkdir build && cd build
cmake ..
make -j
sudo make install

2️⃣ 基本使用示例

#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>

int main() {
    // 控制台日志
    spdlog::info("Hello spdlog!");

    // 文件日志
    auto logger = spdlog::basic_logger_mt("file_logger", "logs/app.log");
    spdlog::set_default_logger(logger);

    spdlog::set_level(spdlog::level::info);

    spdlog::info("This is an info message");
    spdlog::warn("This is a warning");
    spdlog::error("This is an error");

    return 0;
}

编译:

g++ main.cpp -std=c++17 -lspdlog

3️⃣ 日志分级

trace
debug
info
warn
error
critical

设置级别:

spdlog::set_level(spdlog::level::debug);

4️⃣ 日志格式(时间 + 线程 + 文件)

spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%t] [%l] %v");

5️⃣ 日志回滚(非常重要)

#include <spdlog/sinks/rotating_file_sink.h>

auto logger = spdlog::rotating_logger_mt(
    "rotate_logger",
    "logs/app.log",
    1024 * 1024 * 5, // 5MB
    3                // 保留 3 个文件
);

三、使用 syslog(系统日志)

适合 守护进程 / 后台服务

#include <syslog.h>

int main() {
    openlog("myapp", LOG_PID, LOG_USER);

    syslog(LOG_INFO, "Program started");
    syslog(LOG_ERR, "An error occurred");

    closelog();
    return 0;
}

查看日志:

journalctl -t myapp
# 或
tail -f /var/log/syslog

四、自己实现一个简单日志类(示例)

#include <iostream>
#include <fstream>
#include <mutex>
#include <chrono>

class Logger {
public:
    enum Level { INFO, WARN, ERROR };

    Logger(const std::string& file) {
        ofs.open(file, std::ios::app);
    }

    void log(Level level, const std::string& msg) {
        std::lock_guard<std::mutex> lock(mtx);
        ofs << now() << " [" << levelStr(level) << "] " << msg << std::endl;
    }

private:
    std::string now() {
        auto t = std::chrono::system_clock::now();
        time_t tt = std::chrono::system_clock::to_time_t(t);
        return std::ctime(&tt);
    }

    std::string levelStr(Level l) {
        return l == INFO ? "INFO" : l == WARN ? "WARN" : "ERROR";
    }

    std::ofstream ofs;
    std::mutex mtx;
};

五、日志配置最佳实践 ✅

生产环境

  • 使用 spdlog
  • 日志分级
  • 日志回滚
  • 日志路径:/var/log/yourapp/

调试阶段

  • 打开 debug 日志
  • 控制台 + 文件同时输出

线程安全

  • spdlog 默认线程安全
  • 自实现必须加 mutex

不要

  • printf
  • std::cout 做正式日志

六、总结一句话

Linux C++ 日志首选 spdlog,简单项目可自写,系统服务可用 syslog。

如果你愿意,我可以:

  • ✅ 帮你写一个 完整日志模块
  • ✅ 给你 CMake 配置
  • ✅ 按 服务端 / 客户端 / 嵌入式 场景定制

你现在是什么类型的项目?

0