1. 为什么需要极简日志系统
在QT应用开发中,日志记录是调试和问题排查的重要工具。很多开发者习惯使用复杂的日志库,但对于小型项目或快速原型开发,这些方案往往显得过于臃肿。一个简单的文本日志系统就能满足80%的日常需求。
我曾在多个QT项目中尝试过各种日志方案,最终发现这个不足20行的极简实现是最实用的。它不依赖第三方库,直接写入文本文件,性能开销几乎可以忽略不计。特别是在嵌入式设备或资源受限环境中,这种方案的优势更加明显。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心实现代码解析
2.1 基础函数结构
cpp复制void Widget::writelog(QString str)
{
filePath = QCoreApplication::applicationDirPath();
QFile file(filePath+"/log.txt");
file.open(QIODevice::ReadWrite | QIODevice::Text | QIODevice::Append);
QTextStream out(&file);
QDateTime currentTime = QDateTime::currentDateTime();
QString timeString = currentTime.toString("yyyy-MM-dd HH:mm:ss.zzz");
out << timeString << " : " << str << endl;
file.close();
}
这段代码的核心逻辑非常直接:
- 获取应用运行目录
- 创建/打开日志文件
- 写入带时间戳的日志信息
- 关闭文件
2.2 关键参数说明
QIODevice::Append:确保每次写入都追加到文件末尾,不会覆盖原有内容QIODevice::Text:以文本模式打开文件,自动处理换行符转换- 时间格式中的
zzz表示毫秒,对于需要精确时序的场景很有帮助
提示:在Windows平台,
QIODevice::Text会自动将\n转换为\r\n,这是很多开发者容易忽略的细节。
3. 进阶优化方案
3.1 线程安全改进
原始实现不是线程安全的,在多线程环境下可能出问题。改进方案:
cpp复制void Widget::writelog(QString str)
{
static QMutex mutex;
QMutexLocker locker(&mutex);
// 原有代码...
}
添加QMutex确保同一时间只有一个线程能写入日志文件。QMutexLocker会在作用域结束时自动释放锁,避免忘记解锁。
3.2 日志分级控制
增加日志级别判断:
cpp复制enum LogLevel { DEBUG, INFO, WARNING, ERROR };
void Widget::writelog(LogLevel level, QString str)
{
QString levelStr;
switch(leve
