QMessageLogger:记录器的单例?

时间:2015-07-17 11:32:39

标签: c++ qt logging singleton qt5

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

假设我在Qt MyApp 项目中实施了其他几个类:

  • MainWidget:QWidget
  • HelpDialog:QDialog
  • CalculateNumers

如何在不创建三个Logger的情况下为所有这些类提供Logger?我想使用 Singleton 机制。 但我已经读到单身人士将是一个糟糕的编程技巧!?

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

  

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

     

[MyApp]致命12:12:00:123 [ms] _12.12.2012)崩溃功能'divisionDouble'

具有所需正确参数的cource的

(currentSystemTimeInMillis(),funtionname等,...)

示例记录器,想象有很多其他类,应该能够使用那些void info(...),debug(...),critical(...),fatal(...);等等 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 
}

1 个答案:

答案 0 :(得分:4)

从我看到你想要实现两件事:

  1. 更改所有日志输出的输出格式 您应该考虑使用qSetMessagePattern

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

  3. 使用这两种方法的优点是你可以使用qt自己的调试宏(qDebug(),qFatal()......),你不需要编写自己的MessageLogger或者考虑一下单身。