printf 打日志在小项目里还行,但线程一多、需要写入文件时就捉襟见肘了。不如自己动手写一个轻量的 C++ 日志库,支持日志级别、线程安全、屏幕/文件双输出,用起来也顺手。
预期输出格式像这样:
[2024-08-04 12:27:03][DEBUG][202938][main.cc][16]- hello world
后面的 "hello world" 是我们自己写的内容,前面的时间、级别、PID、文件名、行号都由日志库自动补全。
日志级别
先定义几个常用的级别枚举:
| 级别 | 描述 |
|---|---|
| DEBUG | 详细信息,仅在调试时使用 |
| INFO | 关键信息,如程序启动、结束等 |
| WARNING | 警告信息,不影响运行,但需要注意 |
| ERROR | 发生错误,可能影响功能 |
| FATAL | 严重错误,程序可能崩溃 |
策略模式输出
因屏幕和文件是两种输出方式,自然想到用策略模式:基类定义接口,子类各自实现。加个命名空间避免冲突。
namespace lyrics {}
先看基类:
class Strategy_Pattern {
public:
virtual ~Strategy_Pattern() = default;
virtual void Log_refresh_mode(const std::string &message) = 0;
};
屏幕输出
屏幕是共享资源,得加锁。这里用 pthread mutex:
class Refresh_to_screen : public Strategy_Pattern {
public:
Refresh_to_screen() {
int n = pthread_mutex_init(&_mutex, nullptr);
}
~Refresh_to_screen() {
pthread_mutex_destroy(&_mutex);
}
void Log_refresh_mode(const std::string &message) {
(&_mutex);
std::cout << message << std::endl;
(&_mutex);
}
:
_mutex;
};


