日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

QT文件日志系统(可选择出到文件,数据库,或者网络传输)

發(fā)布時間:2025/4/5 windows 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QT文件日志系统(可选择出到文件,数据库,或者网络传输) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 前言
  • 一、源碼如下
  • 二、使用步驟
    • 1.導入文件
    • 2.其中有三種模型
  • 總結
  • 參考


前言

在軟件打包好運行時候,如果遇到系統(tǒng)問題,如果沒有日志系統(tǒng)很難很快的定位到問題的位置。這個時候就需要日志系統(tǒng),本文介紹的日志系統(tǒng)可以根據(jù)每日的日期,自動創(chuàng)建文件,或者可以存入數(shù)據(jù)庫或者通過網(wǎng)絡發(fā)送到指定IP三種模式可以選擇。


提示:以下是本篇文章正文內容,下面案例可供參考

一、源碼如下

以下為logger.h

#ifndef LOGGER_H #define LOGGER_H#include <QObject> #include <QFile> #include <QDir> #include <QUdpSocket> #include <QSqlDatabase> #include <QSqlError> #include <QSqlQuery> #include <QMutex>enum LogMode {LM_FILE,LM_NET,LM_DATABASE };class DatabaseInfo{ public:QString server;QString user;QString passwd;QString dbName;int port;DatabaseInfo(const QString &ser = Q_NULLPTR,const QString &uid = Q_NULLPTR,const QString &pwd = Q_NULLPTR,const QString &name = Q_NULLPTR,int p = 3306): server(ser), user(uid), passwd(pwd), dbName(name), port(p) {} };void setLogMode(LogMode mode); void setLogFilePath(const QString &path); void setLogNetPort(int port); void setLogDatabaseInfo(const DatabaseInfo &info); void log(QtMsgType type, const QMessageLogContext &info, const QString &msg);class Logger : public QObject {Q_OBJECT public:explicit Logger(QObject *parent = Q_NULLPTR);~Logger();void setOutputMode(LogMode mode);void outputLog(const QString &type, const char* file, const char* func, int line, const QString &msg);private:QUdpSocket m_socket;QSqlDatabase m_db;QMutex m_mutex; };#endif // LOGGER_H

以下為logger.cpp:

#include "logger.h" #include <QDebug> #include <QDateTime>// 禁止其他文件訪問,只能通過接口設置 static LogMode g_logMode = LM_FILE; static QString g_filePath; static int g_port = 8989; static DatabaseInfo g_dbInfo;void setLogMode(LogMode mode) {g_logMode = mode; }void setLogFilePath(const QString &path) {g_filePath = path; }void setLogNetPort(int port) {g_port = port; }void setLogDatabaseInfo(const DatabaseInfo &info) {g_dbInfo = info; }void log(QtMsgType type, const QMessageLogContext &info, const QString &msg) {QString lType;switch (type) {case QtDebugMsg:lType = "Debug";break;case QtInfoMsg:lType = "Info";break;case QtWarningMsg:lType = "Warning";break;case QtCriticalMsg:lType = "Critical";break;case QtFatalMsg:lType = "Faltal";break;default:break;}static Logger g_logger;g_logger.outputLog(lType, info.file, info.function, info.line, msg); }Logger::Logger(QObject *parent): QObject(parent) {setOutputMode(g_logMode); }Logger::~Logger() {qInstallMessageHandler(Q_NULLPTR);if(m_db.isOpen())m_db.close(); }void Logger::setOutputMode(LogMode mode) {if(LM_DATABASE == mode) {if(m_db.isOpen())m_db.close();m_db = QSqlDatabase::addDatabase("QMYSQL");m_db.setHostName(g_dbInfo.server);m_db.setUserName(g_dbInfo.user);m_db.setPassword(g_dbInfo.passwd);m_db.setPort(g_dbInfo.port);m_db.setDatabaseName(g_dbInfo.dbName);m_db.open();} }void Logger::outputLog(const QString &type, const char* file, const char* func, int line, const QString &msg) {QMutexLocker locker(&m_mutex);QString time = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss.zzz");QString str = QString("[%1] [%2] [%3] [%4] [line:%5] ===> %6\n").arg(type).arg(file).arg(func).arg(time).arg(line).arg(msg);if(LM_FILE == g_logMode) {QString name = QString("%1/%2.txt").arg(g_filePath).arg(QDateTime::currentDateTime().toString("yyyy-MM-dd"));QDir dir(g_filePath);if(!dir.exists())dir.mkpath(g_filePath);QFile m_file(name);if(!m_file.open(QIODevice::WriteOnly | QIODevice::Append))return;m_file.write(str.toUtf8());m_file.close();}else if(LM_NET == g_logMode) {m_socket.writeDatagram(str.toUtf8(), QHostAddress::Broadcast, g_port);}else if(LM_DATABASE == g_logMode) {try {QString sql = QString("insert into log values('%1', '%2', '%3', '%4', '%5', '%6');").arg(time).arg(type).arg(file).arg(func).arg(line).arg(msg);QSqlQuery query(m_db);query.exec(sql);}catch (const QSqlError &e) {e.text();}} }

二、使用步驟

1.導入文件

將上面的.h與.cpp文件導入到項目中,在按照如下的模式調用

setLogMode(LM_FILE); //設置日志系統(tǒng)為文件模型 // DatabaseInfo info("127.0.0.1", "root", "", "log"); // setLogDatabaseInfo(info); // setLogNetPort(8989);setLogFilePath(QApplication::applicationDirPath());qInstallMessageHandler(log);

2.其中有三種模型

如下(示例):

enum LogMode {LM_FILE,LM_NET,LM_DATABASE };

總結

本文選取的是文本模式,這個時候系統(tǒng)運行時候的"Debug"、“Info”、“Warning”、“Critical”、"Faltal"輸出全部會保存到文件。
可以看到會按照日期每天生成的運行日志

如下是我寫的Debug輸入的日志樣子,可以看到會打印出在代碼哪個文件的什么函數(shù),什么時間,那一行輸出的。

參考

這個大佬的代碼倉庫有使用示例
ALONE_WORK / QtModuleTest
這是作者的博客說明
Qt 日志系統(tǒng)(文件、網(wǎng)絡、數(shù)據(jù)庫)

總結

以上是生活随笔為你收集整理的QT文件日志系统(可选择出到文件,数据库,或者网络传输)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 成人国产片女人爽到高潮 | 二区在线观看 | 欧美又大又硬又粗bbbbb | 精品国产乱码久久久久久1区二区 | 中文字幕日韩专区 | 伊人影院99| 免费一级网站 | 色网视频| 精品一区二区三区视频日产 | 熟女性饥渴一区二区三区 | 中文字幕91视频 | ass大乳尤物肉体pics | 日韩欧美在线一区二区 | 久99久视频| 嫩草影院在线观看视频 | 亚洲欧美色图片 | 欧美三级午夜理伦三级中视频 | 名人明星三级videos | 在线不欧美| 深爱激情久久 | 黄色免费网站在线 | 欧美 日韩 国产 中文 | 欧美一区二区三区免费看 | 青草超碰| av成人免费在线观看 | 男女啪动最猛动态图 | 蜜桃91丨九色丨蝌蚪91桃色 | 四虎永久免费影院 | 国产精品日韩av | 在线亚洲+欧美+日本专区 | 麻豆传媒在线观看 | 国产精品久久久一区二区三区 | 男男毛片| 五月99久久婷婷国产综合亚洲 | 久久精品视频2 | 97视频成人| 国产精品免费视频观看 | 99视频国产精品 | 国产欧美视频一区 | 影音先锋成人在线 | 新国产视频 | 瑟瑟视频免费观看 | 三级视频在线 | 日韩视频一区二区三区 | 性生活视频播放 | 翔田千里一区二区三区av | 欧美黄色录像带 | 三级黄色免费网站 | 国产激情一区二区三区四区 | 伊人影院av | 欧美视频亚洲视频 | 性欧美18 | 91国偷自产一区二区三区女王 | 久久久久久久久久久网 | 色悠悠网| 欧美日韩一级二级三级 | 天天操天天操天天操天天操 | 午夜精品久久久久久久99老熟妇 | 亚洲成人激情av | 午夜免费福利在线观看 | 亚洲AV无码精品自拍 | 嫩草国产精品 | 在线中文字幕视频 | 国产精品一区二区三区四区视频 | 红桃视频国产精品 | 国产成人综合一区二区三区 | 亚洲av激情无码专区在线播放 | 成人福利院 | 用力抵着尿进去了h | 久久草国产 | 亚洲aⅴ | 黄页网站在线播放 | 亚州男人的天堂 | 亚洲综合一区二区 | 亚洲啊啊啊啊啊 | 日本一区二区欧美 | 伊人av在线 | 国产成人一区在线观看 | 欧美 亚洲 另类 激情 另类 | 欧美成人播放 | 欧美a级片视频 | 国产一区h | 婷婷综合视频 | 吸咬奶头狂揉60分钟视频 | 体内射精一区二区 | 一级黄色片免费播放 | 亚洲色p | 国产美女免费无遮挡 | 亚洲青涩在线 | 成人黄色大片在线观看 | 亚洲综合专区 | 亚洲a视频在线观看 | 中国浓毛少妇毛茸茸 | 人妻洗澡被强公日日澡 | 超色视频 | 在线免费观看一区 | 少妇15p| 黄色网址最新 | 美乳人妻一区二区三区 |