XNSim/XNCore/XNLogger/XNLogger.h

249 lines
6.0 KiB
C
Raw Normal View History

/**
* @file XNLogger.h
* @author jinchao
* @brief
* @version 1.0
* @date 2025-01-08
*
* @copyright Copyright (c) 2025 COMAC
*
*/
#pragma once
#include "XNCore_Function.h"
#include "XNTypeDefine.h"
#include "XNTypeTraits.h"
/**
* @brief
*/
class XNLogger {
public:
/**
* @brief
*/
enum LogLevel { Debug, Info, Warning, Error, Time };
/**
* @brief
* @return
*/
static XNLogger &instance() {
static XNLogger instance;
return instance;
}
/**
* @brief
* @param level
* @param message
*/
void log(LogLevel level, const XN_STRING &message);
/**
* @brief
* @param level
* @param enable
*/
void enableConsoleOutput(LogLevel level, XN_BOOL enable);
/**
* @brief
* @param level
* @param enable
*/
void enableFileOutput(LogLevel level, XN_BOOL enable);
private:
/**
* @brief
*/
XNLogger();
/**
* @brief
*/
~XNLogger();
/**
* @brief
*/
XNLogger(const XNLogger &) = delete;
/**
* @brief
*/
XNLogger &operator=(const XNLogger &) = delete;
/**
* @brief
*/
XN_STRING logFilePath;
/**
* @brief
*/
XN_BOOL consoleOutputEnabled[5];
/**
* @brief
*/
XN_BOOL fileOutputEnabled[5];
/**
* @brief
*/
XN_OFSTREAM logFile;
/**
* @brief
*/
XN_MUTEX mutex;
/**
* @brief
* @param level
* @return
*/
XN_STRING logLevelToString(LogLevel level) const;
/**
* @brief
* @return
*/
XN_STRING getCurrentTimeString() const;
/**
* @brief
*/
const XN_STRING COLOR_RESET = "\033[0m";
/**
* @brief
*/
const XN_STRING COLOR_DEBUG = "\033[34m"; // 蓝色
/**
* @brief
*/
const XN_STRING COLOR_INFO = "\033[32m"; // 绿色
/**
* @brief
*/
const XN_STRING COLOR_WARNING = "\033[33m"; // 黄色
/**
* @brief
*/
const XN_STRING 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 XN_STRING &message, Args... args) {
XN_STRING formattedMessage = formatMessage(message, args...);
XNLogger::instance().log(level, formattedMessage);
}
/**
* @brief
* @param level
* @param message
*/
inline static void log(XNLogger::LogLevel level, const XN_STRING &message) {
XNLogger::instance().log(level, message);
}
private:
/**
* @brief
* @tparam T
* @param arg
* @return
*/
template <typename T> static XN_STRING convertToString(const T &arg) {
if constexpr (XNSim::is_arithmetic_v<T>) {
return std::to_string(arg); // 处理数值类型
} else if constexpr (XNSim::is_same_v<T, XN_STRING>) {
return arg;
} else if constexpr (XNSim::is_convertible_v<T, XN_STRING>) {
return XN_STRING(arg);
} else if constexpr (XNSim::is_same_v<T, char *> ||
XNSim::is_same_v<T, const char *>) {
return XN_STRING(arg);
} else {
static_assert(XNSim::is_arithmetic_v<T> ||
XNSim::is_same_v<T, XN_STRING> ||
XNSim::is_convertible_v<T, XN_STRING> ||
XNSim::is_same_v<T, XN_CHAR *> ||
XNSim::is_same_v<T, const XN_CHAR *>,
"A01021001: 不支持的类型转换详见XNLogger.cppline 199");
}
}
/**
* @brief %1%2%3
* @tparam Args
* @param message
* @param args
* @return
*/
template <typename... Args>
static XN_STRING formatMessage(const XN_STRING &message, Args &&...args) {
static_assert(
sizeof...(Args) <= 9,
"A01021002: 单条日志参数数量超过限制详见XNLogger.cppline 216");
XN_STRING result = message;
// 使用初始化列表展开参数包
int index = 1;
// 使用lambda和std::initializer_list展开参数包
(void)std::initializer_list<int>{(
[&result, &index](const auto &value) {
XN_STRING placeholder = "%" + ToXNString(index++);
size_t pos = result.find(placeholder);
if (pos != XN_STRING::npos) {
result.replace(pos, placeholder.length(), convertToString(value));
}
}(args),
0)...};
return result;
}
};
/**
* @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__)