【发布时间】:2011-05-19 03:09:56
【问题描述】:
我想在将消息记录到除 qDebug 之外的日志文件时使用默认的 Qt 消息处理程序。 这是我的解决方案,您有什么建议或此实现可能存在哪些问题?
标题:
#ifndef QLOGGER_H
#define QLOGGER_H
#include <QtCore/QObject>
#include <QtCore/QFile>
#include <QtCore/QDateTime>
class QLogger : public QObject
{
Q_OBJECT
public:
QLogger();
~QLogger();
static void start();
static void finish();
static QString filename;
private:
static void myloggerfunction(QtMsgType type, const char *msg);
};
#endif // QLOGGER_H
来源:
#include <QTextStream>
#include <QDateTime>
#include <QDir>
#include <iostream>
#include "qlogger.h"
using namespace std;
QString QLogger::filename=QString("log.txt");
QLogger::QLogger()
{
}
QLogger::~QLogger()
{
}
void QLogger::start()
{
qInstallMsgHandler(myloggerfunction);
}
void QLogger::finish()
{
qInstallMsgHandler(0);
}
void QLogger::myloggerfunction(QtMsgType type, const char *msg)
{
QDir dir;
dir.cd("LOG");
QFile logFile(filename);
if (logFile.open(QIODevice::Append | QIODevice::Text))
{
QTextStream streamer(&logFile);
switch (type){
case QtDebugMsg:
finish();
qDebug(msg);
break;
case QtWarningMsg:
streamer << QDateTime::currentDateTime().toString() <<" Warning: " << msg << "\n";
finish();
qWarning(msg);
break;
case QtCriticalMsg:
streamer << QDateTime::currentDateTime().toString() <<" Critical: " << msg << "\n";
finish();
qCritical(msg);
break;
case QtFatalMsg:
streamer << QDateTime::currentDateTime().toString() <<" Fatal: " << msg << "\n";
finish();
qFatal(msg);
break;
}
logFile.close();
}
start();
}
【问题讨论】:
-
我认为这是一个很好的实现。但是,我会将其设为 Singleton,因为在正常用例中只有一个实例。从技术上讲,我会将构造函数设为私有,并提供一个返回类的静态对象的静态方法。