日韩性视频-久久久蜜桃-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)站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲欧洲精品一区二区 | 日本一区二区在线视频 | 国产真实乱 | 99精彩视频| 精品人妻无码中文字幕18禁 | 美女穴穴 | 免费中文字幕视频 | www.一起操| 总裁边开会边做小娇妻h | 亚洲两性视频 | 久久免费观看视频 | 一级片视频免费 | 这里只有精品6 | 乱老熟女一区二区三区 | 少女与动物高清版在线观看 | 草久久久久| 999精品一区| 成人免费毛片免费 | 欧美视频a | 99亚洲天堂 | 五十路息子| 色综合久久88色综合天天 | 日韩一区二区免费视频 | 91九色视频在线 | 亚洲精品一区二区三区四区五区 | 琪琪色网 | 日韩精品免费观看 | 黑人vs日本人ⅹxxxhd | 翔田千里88av中文字幕 | 五月天婷婷激情网 | 国产乡下妇女做爰视频 | 免费色片 | 欧美一区二区福利视频 | 午夜8888| 国产一级免费看 | 91视频国产免费 | 综合色导航 | 成人国产精品一区二区 | a男人天堂 | 人人狠狠综合久久亚洲 | 午夜视频在线观看一区二区 | 男男成人高潮片免费网站 | 上床视频在线观看 | 国产日本欧美在线 | 久草视频在线免费 | 一女三黑人理论片在线 | 波多野结衣视频一区 | 欧美黑人一级 | 午夜高潮| 久久a级片| 久久精品国产亚洲av无码娇色 | 国产污污在线观看 | 一区二区免费看 | 亚洲综合免费观看高清完整版在线 | 伊人成人22 | 97caop| 日韩一区二区三区精品 | 欧美播放器| 在线免费视频一区二区 | a网址| 亚洲综合第一页 | 337p粉嫩大胆色噜噜狠狠图片 | 男人天堂2014 | 国产精品色| 一本大道视频 | 人妻互换一区二区三区四区五区 | 94av | free性护士vidos猛交 | 欧美在线v | www夜色| 欧美第九页| 91官网视频| 98超碰在线 | 双腿张开被9个男人调教 | 91精品人妻互换一区二区 | 欧美国产日韩在线 | 羞羞的软件 | 中文字幕91| 欧美日韩色综合 | 天天爽夜夜 | 亚洲久久在线 | 狠狠av | 四虎永久在线精品免费一区二区 | 国产无遮挡免费 | 综合色99| 两口子交换真实刺激高潮 | 久久毛片网 | 日色视频| 日美女逼逼| 精品少妇一区二区三区在线观看 | 超碰免费观看 | 欧美性猛交一区二区三区精品 | 丰满少妇被猛烈进入无码 | 欧美成年网站 | 国产精品91久久久 | 久久久精品免费视频 | 成人av自拍 | 国产精品女教师 | 日本三级一区二区三区 |