218 lines
4.3 KiB
C++
Executable File
218 lines
4.3 KiB
C++
Executable File
/**
|
||
* @file XNLogger.h
|
||
* @author jinchao
|
||
* @brief 日志类
|
||
* @version 1.0
|
||
* @date 2025-01-08
|
||
*
|
||
* @copyright Copyright (c) 2025 COMAC
|
||
*
|
||
*/
|
||
#pragma once
|
||
#include <QString>
|
||
#include <QMutex>
|
||
#include <QFile>
|
||
#include <QTextStream>
|
||
#include <QDateTime>
|
||
#include <QDir>
|
||
#include <type_traits>
|
||
|
||
/**
|
||
* @brief 日志类
|
||
*/
|
||
class XNLogger
|
||
{
|
||
public:
|
||
/**
|
||
* @brief 日志等级
|
||
*/
|
||
enum LogLevel { Debug, Info, Warning, Error, Time };
|
||
|
||
/**
|
||
* @brief 获取日志类实例
|
||
* @return 日志类实例
|
||
*/
|
||
static XNLogger &instance()
|
||
{
|
||
// 懒汉式单例,C++11 及以上版本的标准保证了局部静态变量的初始化是线程安全的
|
||
static XNLogger instance;
|
||
return instance;
|
||
}
|
||
|
||
/**
|
||
* @brief 日志输出
|
||
* @param level 日志等级
|
||
* @param message 日志消息
|
||
*/
|
||
void log(LogLevel level, const QString &message);
|
||
|
||
/**
|
||
* @brief 启用控制台输出
|
||
* @param level 日志等级
|
||
* @param enable 是否启用
|
||
*/
|
||
void enableConsoleOutput(LogLevel level, bool enable);
|
||
|
||
/**
|
||
* @brief 启用文件输出
|
||
* @param level 日志等级
|
||
* @param enable 是否启用
|
||
*/
|
||
void enableFileOutput(LogLevel level, bool enable);
|
||
|
||
private:
|
||
/**
|
||
* @brief 构造函数
|
||
*/
|
||
XNLogger(); // 默认构造函数
|
||
|
||
/**
|
||
* @brief 析构函数
|
||
*/
|
||
~XNLogger();
|
||
|
||
/**
|
||
* @brief 禁止拷贝构造
|
||
*/
|
||
XNLogger(const XNLogger &) = delete; // 禁止拷贝构造
|
||
|
||
/**
|
||
* @brief 禁止赋值
|
||
*/
|
||
XNLogger &operator=(const XNLogger &) = delete; // 禁止赋值
|
||
|
||
/**
|
||
* @brief 日志文件路径
|
||
*/
|
||
QString logFilePath;
|
||
|
||
/**
|
||
* @brief 控制台输出控制
|
||
*/
|
||
bool consoleOutputEnabled[5];
|
||
|
||
/**
|
||
* @brief 文件输出控制
|
||
*/
|
||
bool fileOutputEnabled[5];
|
||
|
||
/**
|
||
* @brief 日志文件
|
||
*/
|
||
QFile logFile;
|
||
|
||
/**
|
||
* @brief 互斥锁
|
||
*/
|
||
QMutex mutex;
|
||
|
||
/**
|
||
* @brief 日志等级转换为字符串
|
||
* @param level 日志等级
|
||
* @return 日志等级字符串
|
||
*/
|
||
QString logLevelToString(LogLevel level) const;
|
||
|
||
/**
|
||
* @brief 控制台输出字体恢复颜色常量
|
||
*/
|
||
const QString COLOR_RESET = "\033[0m";
|
||
|
||
/**
|
||
* @brief 调试颜色常量
|
||
*/
|
||
const QString COLOR_DEBUG = "\033[34m"; // 蓝色
|
||
|
||
/**
|
||
* @brief 信息颜色常量
|
||
*/
|
||
const QString COLOR_INFO = "\033[32m"; // 绿色
|
||
|
||
/**
|
||
* @brief 警告颜色常量
|
||
*/
|
||
const QString COLOR_WARNING = "\033[33m"; // 黄色
|
||
|
||
/**
|
||
* @brief 错误颜色常量
|
||
*/
|
||
const QString COLOR_ERROR = "\033[31m"; // 红色
|
||
};
|
||
|
||
/**
|
||
* @brief 日志辅助类
|
||
*/
|
||
class XNLoggerHelper
|
||
{
|
||
public:
|
||
/**
|
||
* @brief 带参数的日志输出
|
||
* @tparam Args 参数类型
|
||
* @param level 日志等级
|
||
* @param message 日志消息
|
||
* @param args 参数
|
||
*/
|
||
template <typename... Args>
|
||
inline static typename std::enable_if<(sizeof...(Args) > 0), void>::type
|
||
log(XNLogger::LogLevel level, const QString &message, Args... args)
|
||
{
|
||
QString formattedMessage = formatMessage(message, args...);
|
||
XNLogger::instance().log(level, formattedMessage);
|
||
}
|
||
|
||
/**
|
||
* @brief 不带参数的日志输出
|
||
* @param level 日志等级
|
||
* @param message 日志消息
|
||
*/
|
||
inline static void log(XNLogger::LogLevel level, const QString &message)
|
||
{
|
||
XNLogger::instance().log(level, message);
|
||
}
|
||
|
||
private:
|
||
// 辅助函数,用于格式化消息
|
||
template <typename T>
|
||
static QString convertToString(const T &arg)
|
||
{
|
||
if constexpr (std::is_arithmetic<T>::value) {
|
||
return QString::number(arg); // 处理数值类型
|
||
} else {
|
||
return arg;
|
||
}
|
||
}
|
||
|
||
// 递归变参函数,用于处理多个参数
|
||
template <typename T, typename... Args>
|
||
static QString formatMessage(const QString &message, T arg, Args... args)
|
||
{
|
||
return formatMessage(message.arg(convertToString(arg)), args...); // 递归调用
|
||
}
|
||
|
||
// 基础情况
|
||
static QString formatMessage(const QString &message)
|
||
{
|
||
return message; // 处理没有参数的情况
|
||
}
|
||
};
|
||
|
||
/**
|
||
* @brief 宏定义,用于输出调试日志
|
||
*/
|
||
#define LOG_DEBUG(message, ...) XNLoggerHelper::log(XNLogger::Debug, message, ##__VA_ARGS__)
|
||
|
||
/**
|
||
* @brief 宏定义,用于输出信息日志
|
||
*/
|
||
#define LOG_INFO(message, ...) XNLoggerHelper::log(XNLogger::Info, message, ##__VA_ARGS__)
|
||
|
||
/**
|
||
* @brief 宏定义,用于输出警告日志
|
||
*/
|
||
#define LOG_WARNING(message, ...) XNLoggerHelper::log(XNLogger::Warning, message, ##__VA_ARGS__)
|
||
|
||
/**
|
||
* @brief 宏定义,用于输出错误日志
|
||
*/
|
||
#define LOG_ERROR(message, ...) XNLoggerHelper::log(XNLogger::Error, message, ##__VA_ARGS__)
|