发布于2026-07-19 阅读(0)
扫一扫,手机访问
在Ubuntu环境下做C++开发,日志记录几乎是绕不开的环节——无论是调试阶段的临时输出,还是生产环境下的问题追踪,都需要一套靠谱的日志方案。常见的做法有三种,从最轻量的标准库,到功能丰富的第三方库,再到系统级别的syslog,各有各的用武之地。下面逐一拆解。
最简单直接的方式,就是借助C++标准库里的iostream和fstream。打开一个文件,往里写字符串,完了再关掉——听起来跟写个txt文件没什么两样。确实,对于小工具或者快速原型,这种办法够用,而且无需额外依赖。
#include
#include
int main() {
std::ofstream log_file("log.txt");
if (log_file.is_open()) {
log_file << "This is a log message." << std::endl;
log_file.close();
} else {
std::cerr << "Unable to open log file." << std::endl;
}
return 0;
}
不过话说回来,这种方案在真实项目中几乎撑不住场面。没有日志级别区分,没有轮转策略,多线程并发写入时还会遇到数据错乱——生产环境要是这么干,出了问题排查起来会相当痛苦。
当你需要日志级别、格式化输出、文件轮转这些“正经”功能时,就该请第三方库出场了。spdlog是C++社区里非常流行的一个选择,轻量、头文件为主、性能也不错。在Ubuntu上安装很简单:
sudo apt-get install libspdlog-dev
装好之后,几行代码就能跑起来:
#include
#include
#include
int main() {
auto logger = spdlog::basic_logger_mt("logger", "logs/basic-log.txt");
spdlog::set_level(spdlog::level::info); // 设置全局日志级别为info
logger->info("Welcome to spdlog!");
logger->error("Some error message with arg: {}", 1);
return 0;
}
注意,这里用了basic_logger_mt,后缀mt表示多线程安全。如果你只有单线程场景,也可以用basic_logger_st来省一点开销。spdlog支持同步/异步日志、控制台输出、syslog后端等多种sink,扩展性很强。多数中小型项目用spdlog就足够了,唯一需要权衡的是额外引入的依赖——如果项目对依赖管理很敏感,或者目标环境没有预装spdlog,可能要考虑其他方案。
如果你的程序需要与系统日志系统集成——比如守护进程、服务端程序,或者干脆希望日志被系统日志管理工具统一收集——那么syslog是更合适的选择。Linux系统原生支持,无需额外库,而且日志会自动写入/var/log/syslog或类似位置,配合logrotate还能自动轮转。
#include
#include
int main() {
openlog("my_app", LOG_PID, LOG_USER);
syslog(LOG_INFO, "This is a log message.");
syslog(LOG_ERR, "Some error message with arg: %d", 1);
closelog();
return 0;
}
使用syslog时,需要注意openlog的第一个参数是程序标识,通常用进程名;第二个参数LOG_PID会在每条日志里附带进程ID,方便多进程场景下定位。另外,日志级别与系统syslog级别对应,比如LOG_ERR、LOG_WARNING、LOG_INFO等。优点是零依赖、标准化,缺点是灵活性较差——无法自定义日志文件路径,格式化能力也有限。
三种方案没有绝对的优劣,关键看场景。简单测试或临时工具,iostream够用;需要可控、可扩展的日志体系,spdlog是首选;想融入系统级管理,syslog自然就是那个答案。实际项目中,不少人也会混合使用:开发阶段用spdlog输出到控制台,正式部署时再切到syslog。总之,先想清楚你要什么,再选工具,才是正解。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8