AusweisApp2
LogHandler.h
gehe zur Dokumentation dieser Datei
1 /*
2  * \brief Logging handler of QtMessageHandler
3  *
4  * \copyright Copyright (c) 2014-2022 Governikus GmbH & Co. KG, Germany
5  */
6 
7 #pragma once
8 
9 #include "Env.h"
10 
11 #include <QContiguousCache>
12 #include <QDateTime>
13 #include <QDebug>
14 #include <QFileInfoList>
15 #include <QLoggingCategory>
16 #include <QMessageLogContext>
17 #include <QMutex>
18 #include <QPointer>
19 #include <QStringList>
20 #include <QTemporaryFile>
21 #include <functional>
22 
23 #define spawnMessageLogger(category)\
24  MessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, category)
25 
26 class test_LogHandler;
27 class test_LogModel;
28 
29 namespace governikus
30 {
31 
33 {
34  private:
35  QMessageLogger mMessageLogger;
36  std::function<const QLoggingCategory& ()> mCategory;
37 
38  public:
39  MessageLogger(const char* pFile, int pLine, const char* pFunction, const std::function<const QLoggingCategory& ()>& pCategory);
40  QDebug critical() const;
41  QDebug debug() const;
42  QDebug info() const;
43  QDebug warning() const;
44 };
45 
47  : public QObject
48 {
49  Q_OBJECT
50 
51  friend class LogHandler;
52 
53  private:
54  LogEventHandler() = default;
55  ~LogEventHandler() override = default;
56 
57  Q_SIGNALS:
62  void fireLog(const QString& pMsg);
63  void fireRawLog(const QString& pMsg, const QString& pCategoryName);
64 };
65 
67 {
68  Q_GADGET
69 
70  friend class Env;
71  friend class ::test_LogHandler;
72  friend class ::test_LogModel;
73  friend QDebug operator<<(QDebug, const LogHandler&);
74 
75  private:
76  struct LogWindowEntry
77  {
78  qint64 mPosition;
79  qint64 mLength;
80  };
81 
82  static QString getLogFileTemplate();
83 
84  QPointer<LogEventHandler> mEventHandler;
85  const bool mEnvPattern;
86  const int mFunctionFilenameSize;
87  qint64 mBacklogPosition;
88  bool mCriticalLog;
89  QContiguousCache<LogWindowEntry> mCriticalLogWindow;
90  QStringList mCriticalLogIgnore;
91  const QString mMessagePattern;
92  const QString mDefaultMessagePattern;
93  QPointer<QTemporaryFile> mLogFile;
94  QtMessageHandler mHandler;
95  bool mUseHandler;
96  bool mAutoRemove;
97  bool mUseLogFile;
98  const QByteArray mFilePrefix;
99  QMutex mMutex;
100 
101  inline void copyMessageLogContext(const QMessageLogContext& pSource,
102  QMessageLogContext& pDestination,
103  const QByteArray& pFilename = QByteArray(),
104  const QByteArray& pFunction = QByteArray(),
105  const QByteArray& pCategory = QByteArray()) const;
106  inline void logToFile(const QString& pOutput);
107  [[nodiscard]] QByteArray formatFunction(const char* const pFunction, const QByteArray& pFilename, int pLine) const;
108  [[nodiscard]] QByteArray formatFilename(const char* const pFilename) const;
109  [[nodiscard]] QByteArray formatCategory(const QByteArray& pCategory) const;
110 
111  [[nodiscard]] QString getPaddedLogMsg(const QMessageLogContext& pContext, const QString& pMsg) const;
112  void handleMessage(QtMsgType pType, const QMessageLogContext& pContext, const QString& pMsg);
113  void handleLogWindow(QtMsgType pType, const char* pCategory, const QString& pMsg);
114  void removeOldLogFiles();
115  QByteArray readLogFile(qint64 pStart, qint64 pLength = -1);
116  void setLogFileInternal(bool pEnable);
117 
118  static void messageHandler(QtMsgType pType, const QMessageLogContext& pContext, const QString& pMsg);
119 
120  protected:
122  virtual ~LogHandler();
124 
125 #ifndef QT_NO_DEBUG
126 
127  public:
128 #endif
129  void reset();
130  [[nodiscard]] bool isInstalled() const;
131 
132  public:
133  static constexpr int MAX_CATEGORY_LENGTH = 13;
134 
135  void init();
136  [[nodiscard]] const LogEventHandler* getEventHandler() const;
137 
138  void setAutoRemove(bool pRemove);
139  bool copy(const QString& pDest);
140  [[nodiscard]] bool copyOther(const QString& pSource, const QString& pDest) const;
141  void resetBacklog();
142  QByteArray getBacklog(bool pAll = false);
143  QByteArray getCriticalLogWindow();
144  [[nodiscard]] bool hasCriticalLog() const;
145  [[nodiscard]] int getCriticalLogCapacity() const;
146  void setCriticalLogCapacity(int pSize);
147 
148  static QDateTime getFileDate(const QFileInfo& pInfo);
149  [[nodiscard]] QDateTime getCurrentLogFileDate() const;
150  [[nodiscard]] QFileInfoList getOtherLogFiles() const;
151  bool removeOtherLogFiles();
152  void setLogFile(bool pEnable);
153  [[nodiscard]] bool useLogFile() const;
154  void setUseHandler(bool pEnable);
155  [[nodiscard]] bool useHandler() const;
156 };
157 
158 inline QDebug operator<<(QDebug pDbg, const governikus::LogHandler& pHandler)
159 {
160  Q_ASSERT(pHandler.mLogFile);
161 
162  QDebugStateSaver saver(pDbg);
163  pDbg.nospace() << pHandler.mLogFile->fileName();
164  return pDbg.space();
165 }
166 
167 
168 } // namespace governikus
Definition: Env.h:44
Definition: LogHandler.h:48
void fireLog(const QString &pMsg)
Every log will be fired by this signal. Be aware that you NEVER use a qDebug() or something like that...
void fireRawLog(const QString &pMsg, const QString &pCategoryName)
Definition: LogHandler.h:67
static constexpr int MAX_CATEGORY_LENGTH
Definition: LogHandler.h:133
void resetBacklog()
Definition: LogHandler.cpp:243
void init()
Definition: LogHandler.cpp:79
int getCriticalLogCapacity() const
Definition: LogHandler.cpp:208
void setUseHandler(bool pEnable)
Definition: LogHandler.cpp:542
bool hasCriticalLog() const
Definition: LogHandler.cpp:202
bool useHandler() const
Definition: LogHandler.cpp:548
bool useLogFile() const
Definition: LogHandler.cpp:536
friend QDebug operator<<(QDebug, const LogHandler &)
Definition: LogHandler.h:158
const LogEventHandler * getEventHandler() const
Definition: LogHandler.cpp:125
void setCriticalLogCapacity(int pSize)
Definition: LogHandler.cpp:214
QByteArray getCriticalLogWindow()
Definition: LogHandler.cpp:187
void setLogFile(bool pEnable)
Definition: LogHandler.cpp:497
void setAutoRemove(bool pRemove)
Definition: LogHandler.cpp:137
bool removeOtherLogFiles()
Definition: LogHandler.cpp:484
static LogHandler & getInstance()
QByteArray getBacklog(bool pAll=false)
Definition: LogHandler.cpp:180
QDateTime getCurrentLogFileDate() const
Definition: LogHandler.cpp:237
bool copy(const QString &pDest)
Definition: LogHandler.cpp:417
static QDateTime getFileDate(const QFileInfo &pInfo)
Definition: LogHandler.cpp:221
QFileInfoList getOtherLogFiles() const
Definition: LogHandler.cpp:451
virtual ~LogHandler()
Definition: LogHandler.cpp:55
bool copyOther(const QString &pSource, const QString &pDest) const
Definition: LogHandler.cpp:430
bool isInstalled() const
Definition: LogHandler.cpp:131
void reset()
Definition: LogHandler.cpp:68
Definition: LogHandler.h:33
QDebug warning() const
Definition: LogHandler.cpp:656
MessageLogger(const char *pFile, int pLine, const char *pFunction, const std::function< const QLoggingCategory &()> &pCategory)
Definition: LogHandler.cpp:631
QDebug debug() const
Definition: LogHandler.cpp:644
QDebug info() const
Definition: LogHandler.cpp:650
QDebug critical() const
Definition: LogHandler.cpp:638
A simple template renderer.
Definition: ActivationContext.h:15
QDebug operator<<(QDebug pDbg, const CommandApdu &pCommandApdu)
Definition: CommandApdu.h:91