Qt+QtWebApp開發筆記(二):http伺服器日誌系統介紹、新增日誌系統至Demo測試
前言
Demo
下載地址
日誌系統
生產環境需要檢視舊的日誌訊息,例如兩天前的日誌訊息。
include(../QtWebApp/QtWebApp/logging/logging.pri)
[logging]minLevel=WARNING bufferSize=100fileName=../logs/webapp1.log maxSize=1000000maxBackups=2timestampFormat=dd.MM.yyyy hh:mm:ss.zzz msgFormat={timestamp} {typeNr} {type} {thread} {msg}
{file}:Filename of source code where the message was generated{function}:Function where the message was generated{line}:Line number where the message was generated
qCritical("An error occured in {file}: out of disk space");
#include "httpsessionstore.h"#include "staticfilecontroller.h"#include "templatecache.h"#include "filelogger.h"using namespace stefanfrings;/** Storage for session cookies */extern HttpSessionStore* sessionStore;/** Controller for static files */extern StaticFileController* staticFileController;/** Cache for template files */extern TemplateCache* templateCache;/** Redirects log messages to a file */extern FileLogger* logger;#endif // GLOBAL_H
#include "global.h"HttpSessionStore* sessionStore;StaticFileController* staticFileController;TemplateCache* templateCache;FileLogger* logger;
int main(int argc, char *argv[]){ QCoreApplication app(argc, argv); QString configFileName=searchConfigFile(); // Configure logging QSettings* logSettings=new QSettings(configFileName,QSettings::IniFormat,&app); logSettings->beginGroup("logging"); logger=new FileLogger(logSettings,10000,&app); logger->installMsgHandler(); // Log the library version qDebug("QtWebApp has version %s",getQtWebAppLibVersion()); // Session store QSettings* sessionSettings=new QSettings(configFileName,QSettings::IniFormat,&app); sessionSettings->beginGroup("sessions"); sessionStore=new HttpSessionStore(sessionSettings,&app); // Static file controller QSettings* fileSettings=new QSettings(configFileName,QSettings::IniFormat,&app); fileSettings->beginGroup("files"); staticFileController=new StaticFileController(fileSettings,&app); // Configure template cache QSettings* templateSettings=new QSettings(configFileName,QSettings::IniFormat,&app); templateSettings->beginGroup("templates"); templateCache=new TemplateCache(templateSettings,&app); // HTTP server QSettings* listenerSettings=new QSettings(configFileName,QSettings::IniFormat,&app); listenerSettings->beginGroup("listener"); new HttpListener(listenerSettings,new RequestMapper(&app),&app); return app.exec();}
記錄器變數
void RequestMapper::service(HttpRequest& request, HttpResponse& response) { QByteArray path=request.getPath(); qDebug("RequestMapper: path=%s",path.data()); HttpSession session=sessionStore->getSession(request,response,false); QString username=session.get("username").toString(); logger->set("currentUser",username); ...}
msgFormat={timestamp} {typeNr} {type} {thread} User:{currentUser} {msg}
日誌緩衝區和執行緒池
void RequestMapper::service(HttpRequest& request, HttpResponse& response) { ... else { response.setStatus(404,"Not found"); response.write("The URL is wrong, no such document."); } qDebug("RequestMapper: finished request"); logger->clear(true,true);}
雙檔案記錄器
minLevel=INFObufferSize=0
minLevel=ERROR (or WARNING)bufferSize=100
總結
Demo增量:新增logging日誌模組
步驟一:準備程式碼模板
步驟二:複製logging模組
# logging模組,QtWebApp自帶的三方模組include ($$PWD/modules/logging/logging.pri)
步驟三:新增配置logging的配置檔案
步驟四:新增logging日誌程式碼
步驟五:執行結果
步驟六:日誌配置調整
Demo原始碼
HttpServerManager.h
#ifndef HTTPSERVERMANAGER_H#define HTTPSERVERMANAGER_H#include <QObject>#include <QMutex>#include "httplistener.h"#include "filelogger.h"#include "HelloWorldRequestHandler.h"class HttpServerManager : public QObject{ Q_OBJECTprivate: explicit HttpServerManager(QObject *parent = 0);public: static HttpServerManager *getInstance();public slots: void slot_start(); // 開啟執行緒 void slot_stop(); // 停止執行緒private: static HttpServerManager *_pInstance; static QMutex _mutex;private: bool _running; // 執行狀態private: HttpListener *_pHttpListener; // http服務監聽器 QSettings *_pHttpListenerSettings; // http伺服器配置檔案 FileLogger *_pFileLogger; // 日誌記錄 QSettings *_pFileLoggerSettings; // 日誌配置檔案private: QString _ip; // 伺服器監聽ip(若為空,則表示監聽所有ip) quint16 _port; // 伺服器監聽埠 int _minThreads; // 空閒最小執行緒數 int _maxThreads; // 負載最大執行緒數 int _cleanupInterval; // 空執行緒清空間隔(單位:毫秒) int _readTimeout; // 保持連線空載超時時間(單位:毫秒) int _maxRequestSize; // 最大請求數 int _maxMultiPartSize; // 上載檔案最大數(單位:位元組)};#endif // HTTPSERVERMANAGER_H
HttpServerManager.cpp
#include "HttpServerManager.h"#include <QApplication>#include <QDir>#include <QDebug>#include <QDateTime>//#define LOG qDebug()<<__FILE__<<__LINE__//#define LOG qDebug()<<__FILE__<<__LINE__<<__FUNCTION__//#define LOG qDebug()<<__FILE__<<__LINE__<<QThread()::currentThread()//#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd")#define LOG qDebug()<<__FILE__<<__LINE__<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz")HttpServerManager *HttpServerManager::_pInstance = 0;QMutex HttpServerManager::_mutex;HttpServerManager::HttpServerManager(QObject *parent) : QObject(parent), _pHttpListener(0), _pHttpListenerSettings(0), _pFileLogger(0), _pFileLoggerSettings(0), _running(false), _port(8088), _minThreads(2), _maxThreads(10), _cleanupInterval(60000), _readTimeout(60000), _maxRequestSize(100), _maxMultiPartSize(1024*1024*1024){}HttpServerManager *HttpServerManager::getInstance(){ if(!_pInstance) { QMutexLocker lock(&_mutex); if(!_pInstance) { _pInstance = new HttpServerManager(); } } return _pInstance;}void HttpServerManager::slot_start(){ if(_running) { LOG << "It's running!!!"; return; } _running = true; LOG << "Succeed to run"; QString httpServerPath = QString("%1/etc/httpServer.ini").arg(qApp->applicationDirPath()); LOG << httpServerPath << "exit:" << QFile::exists(httpServerPath); // 啟動日誌幾里路 { if(!_pFileLoggerSettings) { _pFileLoggerSettings = new QSettings(httpServerPath, QSettings::IniFormat); } _pFileLoggerSettings->beginGroup("logging"); // 日誌不會主動建立資料夾,這裡需要補全 { QFileInfo fileInfo(httpServerPath); QString dirPath = fileInfo.dir().absolutePath(); dirPath = QString("%1/%2") .arg(dirPath) .arg(_pFileLoggerSettings->value("fileName").toString()); dirPath = dirPath.mid(0, dirPath.lastIndexOf("/")); QDir dir; dir.mkpath(dirPath); } _pFileLogger = new FileLogger(_pFileLoggerSettings); _pFileLogger->installMsgHandler(); } // 啟動http的監聽 { if(!_pHttpListenerSettings) { _pHttpListenerSettings = new QSettings(httpServerPath, QSettings::IniFormat); } _pHttpListenerSettings->beginGroup("listener"); _pHttpListener = new HttpListener(_pHttpListenerSettings, new HelloWorldRequestHandler); } LOG;}void HttpServerManager::slot_stop(){ if(!_running) { LOG <<"It's not running!!!"; return; } _running = false; LOG << "Succeed to stop";}
工程模板v1.1.0
入坑
入坑一:日誌一直不出來
問題
原因
解決
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70010283/viewspace-2953389/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 一個.Net開發的功能強大、易於使用的流媒體伺服器和管理系統
- 區塊鏈積分聯盟模式系統如何開發?(區塊鏈積分聯盟模式系統開發原始碼demo)
- 正版D&D角色聯動策略RPG,《代號:Dragon》即將開啟S0賽季測試
- 【伺服器資料恢復】DroboPro FS網路儲存raid5資料恢復案例
- nameko+rabbitmq效能測試
- 如何進行測試分析與設計-HTSM啟發式測試策略模型 | 京東雲技術團隊
- 華納雲分享測試國外伺服器速度的方法
- 《山海經異變》合成放置搬磚類小程式模型開發(原始碼demo)
- 為什麼有了 HTTP 還要 RPC
- TrendForce:預計2023年全球伺服器整機出貨量將下修至1383.5萬臺 同比減少2.85%
- Django筆記四十二之model使用validator驗證器
- Java 網路程式設計 —— 實現非阻塞式的伺服器
- WPF 入門筆記 - 01 - 入門基礎以及常用佈局
- es筆記三之term,match,match_phrase 等查詢方法介紹