QMessageLogger:记录器的单例?
QMessageLogger : Singleton for a Logger?
我想为我的应用程序实现一个记录器,因此我创建了一个 class MyAppLogger 派生自 QMessageLogger。
假设我在我的 Qt MyApp 项目中实现了其他几个 classes:
- MainWidget : QWidget
- 帮助对话框:QDialog
- 计算数值
如何在不创建三个 Logger 的情况下为所有这些 classes 提供 Logger?我想使用 Singleton 机制。
但是我读到单例是一种糟糕的编程技术!?
Here 我刚刚创建了一个带有两个空对话框的简单项目。然后我有一个 MyAppLogger,它将创建格式化的字符串,如:
[MyApp] info 12:12:00:123[ms]_12.12.2012) Object 'MyCalculator'created at 0xdeadbeef
[MyApp] fatal 12:12:00:123[ms]_12.12.2012) Crash at function 'divisionDouble'
当然需要正确的参数(currentSystemTimeInMillis()、函数名称等...)
Example Logger,假设还有很多其他 classes,它们应该能够使用那些 void info(...)、debug(...)、critical(...),致命的(...);等等
HEADER:
#ifndef MYAPPLOGGER_H
#define MYAPPLOGGER_H
#include <QString>
#include <QFile>
class MyAppLogger
{
public:
MyAppLogger(QString outputFile);
void info(char* expression);
void debug(char* expression);
void critical(char* expression);
void fatal(char* expression);
private:
QFile * _debugFile;
};
#endif // MYAPPLOGGER_H
和相应的SRC:
#include "myapplogger.h"
MyAppLogger::MyAppLogger(QString outputFile)
{
_debugFile = new QFile(outputFile);
}
void MyAppLogger::critical(char *expression)
{
QString line("[MyAPP] \t critical \t SYS_TIME (12:45:00_12.12.2012) :: ");
line.append(expression);
// write line to a file
// write line to STD output
}
据我所知,您想要实现两件事:
更改所有日志输出的输出格式。
您应该考虑为此使用 qSetMessagePattern。
将所有日志输出写入文件:
不需要子类化 QMessageLogger。只需使用 qInstallMessageHandler 安装自定义处理程序并将日志消息写入文件。
使用这两种方法的好处是您可以使用 qt 自己的调试宏(qDebug()、qFatal() ...)并且您不需要编写自己的 MessageLogger 或考虑 Singletons。
我想为我的应用程序实现一个记录器,因此我创建了一个 class MyAppLogger 派生自 QMessageLogger。
假设我在我的 Qt MyApp 项目中实现了其他几个 classes:
- MainWidget : QWidget
- 帮助对话框:QDialog
- 计算数值
如何在不创建三个 Logger 的情况下为所有这些 classes 提供 Logger?我想使用 Singleton 机制。 但是我读到单例是一种糟糕的编程技术!?
Here 我刚刚创建了一个带有两个空对话框的简单项目。然后我有一个 MyAppLogger,它将创建格式化的字符串,如:
[MyApp] info 12:12:00:123[ms]_12.12.2012) Object 'MyCalculator'created at 0xdeadbeef
[MyApp] fatal 12:12:00:123[ms]_12.12.2012) Crash at function 'divisionDouble'
当然需要正确的参数(currentSystemTimeInMillis()、函数名称等...)
Example Logger,假设还有很多其他 classes,它们应该能够使用那些 void info(...)、debug(...)、critical(...),致命的(...);等等 HEADER:
#ifndef MYAPPLOGGER_H
#define MYAPPLOGGER_H
#include <QString>
#include <QFile>
class MyAppLogger
{
public:
MyAppLogger(QString outputFile);
void info(char* expression);
void debug(char* expression);
void critical(char* expression);
void fatal(char* expression);
private:
QFile * _debugFile;
};
#endif // MYAPPLOGGER_H
和相应的SRC:
#include "myapplogger.h"
MyAppLogger::MyAppLogger(QString outputFile)
{
_debugFile = new QFile(outputFile);
}
void MyAppLogger::critical(char *expression)
{
QString line("[MyAPP] \t critical \t SYS_TIME (12:45:00_12.12.2012) :: ");
line.append(expression);
// write line to a file
// write line to STD output
}
据我所知,您想要实现两件事:
更改所有日志输出的输出格式。
您应该考虑为此使用 qSetMessagePattern。将所有日志输出写入文件:
不需要子类化 QMessageLogger。只需使用 qInstallMessageHandler 安装自定义处理程序并将日志消息写入文件。
使用这两种方法的好处是您可以使用 qt 自己的调试宏(qDebug()、qFatal() ...)并且您不需要编写自己的 MessageLogger 或考虑 Singletons。