Skip to content

ElaLog 组件文档

概述

ElaLog 是一个单例日志管理组件,提供了文件日志记录、消息格式化、线程安全等功能。它可以捕获 Qt 的消息系统并将其保存到文件。

特性

  • 单例模式
  • 文件日志
  • 消息格式化
  • 线程安全
  • 时间戳
  • 自动清理
  • 路径配置
  • 实时输出

属性

基础属性

cpp
// 日志保存路径
Q_PROPERTY(QString logSavePath READ getLogSavePath 
    WRITE setLogSavePath)

// 日志文件名
Q_PROPERTY(QString logFileName READ getLogFileName 
    WRITE setLogFileName)

// 是否使用时间戳文件名
Q_PROPERTY(bool isLogFileNameWithTime 
    READ getIsLogFileNameWithTime 
    WRITE setIsLogFileNameWithTime)

信号

cpp
// 日志消息信号
void logMessage(QString log);

默认值

  • 日志文件名: "ElaLog"
  • 保存路径: 当前目录
  • 时间戳文件名: false
  • 消息互斥锁: 启用
  • 日期时间格式: "yyyy-MM-dd hh:mm:ss"

使用示例

基础用法

1. 初始化日志系统

cpp
// 获取日志实例
ElaLog* logger = ElaLog::getInstance();

// 配置日志
logger->setLogFileName("MyApp");
logger->setLogSavePath("D:/logs");
logger->setIsLogFileNameWithTime(true);

// 启用日志记录
logger->initMessageLog(true);

2. 记录日志

cpp
// 使用 Qt 的消息系统
qDebug() << "Debug message";
qWarning() << "Warning message";
qCritical() << "Critical message";

// 监听日志消息
connect(logger, &ElaLog::logMessage, 
    this, [](const QString& log) {
        // 处理日志消息
        processLog(log);
});

高级用法

1. 自定义日志格式

cpp
// 日志格式示例
QString logFormat = QString(
    "[%1-%2](函数: %3, 行数: %4) -> %5")
    .arg(logLevel)
    .arg(timestamp)
    .arg(function)
    .arg(line)
    .arg(message);

2. 线程安全写入

cpp
void writeLogSafely(const QString& logInfo) {
    QMutexLocker locker(messageLogMutex);
    QFile logfile(getLogFilePath());
    if (logfile.open(QIODevice::Append)) {
        QTextStream stream(&logfile);
        stream << logInfo << Qt::endl;
        logfile.close();
    }
}

日志格式

消息格式

cpp
// 调试信息
[信息-2024-01-01 12:00:00](函数: main, 行数: 42) 
    -> Debug message

// 警告信息
[警告-2024-01-01 12:00:00](函数: main, 行数: 43) 
    -> Warning message

// 错误信息
[错误-2024-01-01 12:00:00](函数: main, 行数: 44) 
    -> Critical message

文件名格式

cpp
// 普通文件名
MyApp.txt

// 带时间戳文件名
MyApp_2024-01-01_12-00-00.txt

实现细节

消息处理器

cpp
void messageLogHandler(
    QtMsgType type, 
    const QMessageLogContext& ctx, 
    const QString& msg) 
{
    // 获取时间戳
    QString timestamp = QDateTime::currentDateTime()
        .toString("yyyy-MM-dd hh:mm:ss");
    
    // 格式化消息
    QString logInfo = formatLogMessage(
        type, timestamp, ctx, msg);
    
    // 发送信号
    emit logMessage(logInfo);
    
    // 写入文件
    writeLogToFile(logInfo);
}

注意事项

  1. 单例模式实现
  2. 线程安全考虑
  3. 文件操作异常
  4. 路径分隔符
  5. 文件命名冲突
  6. 磁盘空间管理
  7. 性能影响
  8. Qt 版本兼容

最佳实践

  1. 合理配置路径
  2. 控制日志级别
  3. 定期清理日志
  4. 处理写入失败
  5. 监控文件大小
  6. 使用异步写入
  7. 避免频繁写入
  8. 做好错误处理

相关组件

  • QFile: 文件操作
  • QMutex: 互斥锁
  • QDateTime: 时间处理
  • QTextStream: 文本流