在 Linux 下用 C++ 配置日志,常见做法有 使用第三方库 和 自己实现简单日志 两种。下面从 推荐方案 → 常见库 → 自实现示例 → 最佳实践 给你一个完整说明。
| 场景 | 推荐 |
|---|---|
| 生产环境 / 大型项目 | spdlog(首选) |
| 系统级 / 不想引入依赖 | syslog |
| 简单调试 / 小项目 | 自己写日志类 |
| 需要日志回滚、分级 | spdlog / log4cpp |
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
#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
trace
debug
info
warn
error
critical
设置级别:
spdlog::set_level(spdlog::level::debug);
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S] [%t] [%l] %v");
#include <spdlog/sinks/rotating_file_sink.h>
auto logger = spdlog::rotating_logger_mt(
"rotate_logger",
"logs/app.log",
1024 * 1024 * 5, // 5MB
3 // 保留 3 个文件
);
适合 守护进程 / 后台服务
#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;
};
✅ 生产环境
/var/log/yourapp/✅ 调试阶段
✅ 线程安全
mutex✅ 不要
printfstd::cout 做正式日志Linux C++ 日志首选 spdlog,简单项目可自写,系统服务可用 syslog。
如果你愿意,我可以:
你现在是什么类型的项目?