发布时间:2026/8/14 13:02:28
工控机之日志系统 使用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; }

相关新闻

2026/8/14 14:02:33

还在为 Linux 打印机驱动发愁?foo2zjs 免费方案一次讲透

还在为 Linux 打印机驱动发愁?foo2zjs 免费方案一次讲透 【免费下载链接】foo2zjs A linux printer driver for QPDL protocol - copy of http://foo2zjs.rkkda.com/ 项目地址: https://gitcode.com/gh_mirrors/fo/foo2zjs 把新打印机抱回家,插上…

2026/8/14 14:02:33

FRP 内网穿透工具:原理、部署与实战指南

1. 什么是 FRP? FRP(Fast Reverse Proxy)是一款高性能、轻量级的反向代理工具,专注于解决内网穿透问题。它采用 Go 语言编写,支持 TCP、UDP、HTTP、HTTPS 等多种协议,能够将内网服务安全、稳定地暴露到公网…

2026/8/14 14:02:33

开源视频帧捕获工具:精准截图、分析视频关键画面

Pilko-Frame-Capture-Studio:一个简单实用的视频帧捕获工具 在日常开发、视频分析、内容创作过程中,经常会遇到这样的需求: 想从视频中截取某个精准画面;需要分析视频中的关键帧;制作教程时需要保存某个时间点的截图&a…

2026/8/14 14:02:33

项目经理做需求管理,牢记“3确认、4拆解、5拒绝”

做项目久了会发现,最难管的往往不是进度,而是需求。 进度慢了,至少还能看到哪里落后;成本超了,也能算出多花了多少钱。 需求一旦没管住,问题却会从项目头上一路传到尾。 客户一句“这里顺便加一下”&…

2026/8/14 4:27:24

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/14 4:27:24

当 LLM 遇见大文档:主流开源项目如何处理上下文超限

从 Agentic Loop 到 Repo Map,七种策略与六类陷阱引言:128K vs 10MB 的硬冲突 2026 年的 LLM 上下文窗口已达到 128K ~ 1M token(≈ 0.5MB ~ 4MB 文本),但 LLM 想要处理的真实数据规模远远超过这个量级:真实…

2026/8/14 0:00:09

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:09

VSCode高效Git管理:从入门到实战技巧

1. 为什么选择VSCode进行Git代码管理作为微软推出的轻量级代码编辑器,Visual Studio Code(简称VSCode)已经成为全球开发者使用率最高的编辑器之一。根据2023年Stack Overflow开发者调查,VSCode的市场占有率高达74.48%。它内置的Gi…

2026/8/14 4:27:24

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/14 4:27:24

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/14 4:27:24

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…