QMessageLogger:日志记录器的单例

QMessageLogger : Singleton for a Logger?

本文关键字:单例 记录器 日志 QMessageLogger      更新时间:2023-10-16

我想为我的应用程序实现一个日志记录器,因此我创建了一个类MyAppLogger派生自QMessageLogger

假设我有几个其他类实现在我的Qt MyApp项目:

  • MainWidget: QWidget
  • HelpDialog: QDialog
  • CalculateNumers

如何在不创建三个Logger的情况下向所有这些类提供Logger ?我想使用单例机制。但是我读到过单例是一种糟糕的编程技术!?

这里我创建了一个简单的项目,有两个空对话框。然后我有一个MyAppLogger,它将创建格式化字符串,如:

[MyApp] info 12:12:00:123[ms]_12.12.2012)对象'MyCalculator'创建于0xdeadbeef

[MyApp] fatal 12:12:00:123[ms]_12.12.2012] function 'divisionDouble'崩溃

当然需要正确的参数(currentSystemTimeInMillis(), functionname等,…)

示例Logger,想象有很多其他类,它们应该能够使用那些void info(…),debug(…),critical(…),fatal(…);等。标题:

#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 
}

在我看来,你想达到两件事:

  1. 更改所有日志输出的输出格式。
    你应该考虑使用qsetmessagpattern

  2. 将所有日志输出写入文件:
    不需要子类化QMessageLogger。只需使用qInstallMessageHandler来安装一个自定义处理程序,并将日志消息写入文件。

使用这两个方法的优点是,您可以使用qt自己的调试宏(qDebug(), qFatal()…),您不需要编写自己的MessageLogger或考虑singleton