工控机之日志系统

📅 2026/8/14 13:02:20
工控机之日志系统
使用EasyLogging1. pro文件# # 1. Easylogging 预定义宏 # DEFINES ELPP_QT_LOGGING \ ELPP_FEATURE_ALL \ ELPP_STL_LOGGING \ ELPP_STRICT_SIZE_CHECK \ ELPP_UNICODE \ ELPP_MULTI_LOGGER_SUPPORT \ ELPP_THREAD_SAFE \ ELPP_LOGGING_FLAGS_FROM_ARG # # 2. 源文件必须包含这两个 # SOURCES \ ... eLog/Log.cpp \ Extern/Logs/EasyLogging.cc \ # ← 必须定义全局变量 ... # # 3. 头文件EasyLogging.h 可加可不加但建议加上 # HEADERS \ ... Extern/Logs/EasyLogging.h \ # ← 可选建议加上 ... # # 4. 包含路径必须 # INCLUDEPATH \ ... eLog \ Extern/Logs \ # ← 让 #include EasyLogging.h 能找到 ...2. 封装类Log#ifndef LOG_H #define LOG_H #include QObject #include QMutex enum LogType { Sys, Usr }; enum LogLevel { Debug, Info, Warning, Error }; class Log : public QObject { Q_OBJECT public: static Log* getInstance(); void insert(LogType type, LogLevel level, const QString content); // 静态便捷函数 static void info(const QString content); static void warn(const QString content); static void error(const QString content); static void debug(const QString content); signals: void sigUserLog(LogLevel level, const QString content); private: explicit Log(QObject* parent nullptr); ~Log(); static Log* instance; static QMutex m_mutex; }; #endif // LOG_H#define ELPP_THREAD_SAFE // 防御性定义.pro 已定义可省略 #include EasyLogging.h #include Log.h #include QMutex #include QMutexLocker INITIALIZE_EASYLOGGINGPP // 全局变量实例化只需一次在 .cc 里已做 Log* Log::instance nullptr; QMutex Log::m_mutex; Log* Log::getInstance() { if (instance nullptr) { QMutexLocker locker(m_mutex); if (instance nullptr) instance new Log(); } return instance; } Log::Log(QObject* parent) : QObject(parent) {} Log::~Log() {} void Log::insert(LogType type, LogLevel level, const QString content) { QMutexLocker locker(m_mutex); QString prefix; if (type Sys) prefix [SYS] ; else if (type Usr) prefix [USR] ; QString fullMsg prefix content; switch (level) { case Debug: LOG(DEBUG) fullMsg.toStdWString(); break; case Info: LOG(INFO) fullMsg.toStdWString(); break; case Warning: LOG(WARNING) fullMsg.toStdWString(); break; case Error: LOG(ERROR) fullMsg.toStdWString(); break; } if (type Usr) emit sigUserLog(level, content); } // 静态便捷函数 void Log::info(const QString content) { getInstance()-insert(Usr, Info, content); } void Log::warn(const QString content) { getInstance()-insert(Usr, Warning, content); } void Log::error(const QString content) { getInstance()-insert(Usr, Error, content); } void Log::debug(const QString content) { getInstance()-insert(Usr, Debug, content); }#include QApplication #include LogWidget.h // 初始化 Easylogging必须在 main 函数最开始 #define ELPP_THREAD_SAFE #include EasyLogging.h INITIALIZE_EASYLOGGINGPP // 配置日志系统 void initLogSystem() { el::Configurations conf; conf.setToDefault(); // 1. 全局日志文件 conf.setGlobally(el::ConfigurationType::Filename, logs/app.log); conf.setGlobally(el::ConfigurationType::ToFile, true); conf.setGlobally(el::ConfigurationType::ToStandardOutput, true); conf.setGlobally(el::ConfigurationType::MaxLogFileSize, 10485760); // 10MB conf.setGlobally(el::ConfigurationType::Format, [%datetime{%Y-%M-%d %H:%m:%s.%g}] [%level] [%fbase:%line] %msg); // 2. 错误日志单独文件 conf.set(el::Level::Error, el::ConfigurationType::Filename, logs/error.log); // 3. Debug 日志只输出到控制台不写文件 conf.set(el::Level::Debug, el::ConfigurationType::ToFile, false); // 4. 应用配置 el::Loggers::reconfigureAllLoggers(conf); el::Loggers::addFlag(el::LoggingFlag::ColoredTerminalOutput); el::Loggers::addFlag(el::LoggingFlag::HierarchicalLogging); } int main(int argc, char *argv[]) { QApplication app(argc, argv); // 初始化日志系统 initLogSystem(); LOG(INFO) ; LOG(INFO) 应用程序启动; LOG(INFO) Qt 版本: QT_VERSION_STR; LOG(INFO) ; LogWidget w; w.show(); int ret app.exec(); LOG(INFO) 应用程序退出返回码: ret; return ret; }