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 
22 #define spawnMessageLogger(category)\
23  QMessageLogger(QT_MESSAGELOG_FILE, QT_MESSAGELOG_LINE, QT_MESSAGELOG_FUNC, category().categoryName())
24 
25 class test_LogHandler;
26 class test_LogModel;
27 
28 namespace governikus
29 {
30 
32  : public QObject
33 {
34  Q_OBJECT
35 
36  friend class LogHandler;
37 
38  private:
39  LogEventHandler() = default;
40  ~LogEventHandler() override = default;
41 
42  Q_SIGNALS:
47  void fireLog(const QString& pMsg);
48  void fireRawLog(const QString& pMsg, const QString& pCategoryName);
49 };
50 
52 {
53  Q_GADGET
54 
55  friend class Env;
56  friend class ::test_LogHandler;
57  friend class ::test_LogModel;
58 
59  struct LogWindowEntry
60  {
61  qint64 mPosition;
62  qint64 mLength;
63  };
64 
65  private:
66  static QString getLogFileTemplate();
67 
68  QPointer<LogEventHandler> mEventHandler;
69  const bool mEnvPattern;
70  const int mFunctionFilenameSize;
71  qint64 mBacklogPosition;
72  bool mCriticalLog;
73  QContiguousCache<LogWindowEntry> mCriticalLogWindow;
74  QStringList mCriticalLogIgnore;
75  const QString mMessagePattern, mDefaultMessagePattern;
76  QPointer<QTemporaryFile> mLogFile;
77  QtMessageHandler mHandler;
78  bool mUseHandler;
79  bool mAutoRemove;
80  bool mUseLogFile;
81  const QByteArray mFilePrefix;
82  QMutex mMutex;
83 
84  inline void copyMessageLogContext(const QMessageLogContext& pSource,
85  QMessageLogContext& pDestination,
86  const QByteArray& pFilename = QByteArray(),
87  const QByteArray& pFunction = QByteArray(),
88  const QByteArray& pCategory = QByteArray()) const;
89  inline void logToFile(const QString& pOutput);
90  inline QByteArray formatFunction(const char* const pFunction, const QByteArray& pFilename, int pLine) const;
91  inline QByteArray formatFilename(const char* const pFilename) const;
92  [[nodiscard]] inline QByteArray formatCategory(const QByteArray& pCategory) const;
93 
94  [[nodiscard]] QString getPaddedLogMsg(const QMessageLogContext& pContext, const QString& pMsg) const;
95  void handleMessage(QtMsgType pType, const QMessageLogContext& pContext, const QString& pMsg);
96  void handleLogWindow(QtMsgType pType, const char* pCategory, const QString& pMsg);
97  void removeOldLogFiles();
98  QByteArray readLogFile(qint64 pStart, qint64 pLength = -1);
99  void setLogFileInternal(bool pEnable);
100 
101  static void messageHandler(QtMsgType pType, const QMessageLogContext& pContext, const QString& pMsg);
102  friend QDebug operator<<(QDebug, const LogHandler&);
103 
104  protected:
105  LogHandler();
106  virtual ~LogHandler();
107  static LogHandler& getInstance();
108 
109 #ifndef QT_NO_DEBUG
110 
111  public:
112 #endif
113  void reset();
114  [[nodiscard]] bool isInstalled() const;
115 
116  public:
117  void init();
118  [[nodiscard]] const LogEventHandler* getEventHandler() const;
119 
120  void setAutoRemove(bool pRemove);
121  bool copy(const QString& pDest);
122  [[nodiscard]] bool copyOther(const QString& pSource, const QString& pDest) const;
123  void resetBacklog();
124  QByteArray getBacklog(bool pAll = false);
125  QByteArray getCriticalLogWindow();
126  [[nodiscard]] bool hasCriticalLog() const;
127  [[nodiscard]] int getCriticalLogCapacity() const;
128  void setCriticalLogCapacity(int pSize);
129 
130  static QDateTime getFileDate(const QFileInfo& pInfo);
131  [[nodiscard]] QDateTime getCurrentLogFileDate() const;
132  [[nodiscard]] QFileInfoList getOtherLogFiles() const;
133  bool removeOtherLogFiles();
134  void setLogFile(bool pEnable);
135  [[nodiscard]] bool useLogFile() const;
136  void setUseHandler(bool pEnable);
137  [[nodiscard]] bool useHandler() const;
138 };
139 
140 inline QDebug operator<<(QDebug pDbg, const governikus::LogHandler& pHandler)
141 {
142  Q_ASSERT(pHandler.mLogFile);
143 
144  QDebugStateSaver saver(pDbg);
145  pDbg.nospace() << pHandler.mLogFile->fileName();
146  return pDbg.space();
147 }
148 
149 
150 } // namespace governikus
static LogHandler & getInstance()
bool useHandler() const
Definition: LogHandler.cpp:539
bool removeOtherLogFiles()
Definition: LogHandler.cpp:475
QFileInfoList getOtherLogFiles() const
Definition: LogHandler.cpp:442
void setAutoRemove(bool pRemove)
Definition: LogHandler.cpp:132
void resetBacklog()
Definition: LogHandler.cpp:233
QByteArray getCriticalLogWindow()
Definition: LogHandler.cpp:182
void setLogFile(bool pEnable)
Definition: LogHandler.cpp:488
virtual ~LogHandler()
Definition: LogHandler.cpp:51
void reset()
Definition: LogHandler.cpp:64
static QDateTime getFileDate(const QFileInfo &pInfo)
Definition: LogHandler.cpp:216
bool isInstalled() const
Definition: LogHandler.cpp:126
Implementation of ActivationContext for Intent based activation on Android systems.
Definition: ActivationContext.h:14
void fireRawLog(const QString &pMsg, const QString &pCategoryName)
Definition: LogHandler.h:31
QDateTime getCurrentLogFileDate() const
Definition: LogHandler.cpp:227
int getCriticalLogCapacity() const
Definition: LogHandler.cpp:203
void init()
Definition: LogHandler.cpp:75
void setCriticalLogCapacity(int pSize)
Definition: LogHandler.cpp:209
void setUseHandler(bool pEnable)
Definition: LogHandler.cpp:533
const LogEventHandler * getEventHandler() const
Definition: LogHandler.cpp:120
bool hasCriticalLog() const
Definition: LogHandler.cpp:197
Definition: Env.h:43
bool useLogFile() const
Definition: LogHandler.cpp:527
bool copy(const QString &pDest)
Definition: LogHandler.cpp:408
QDebug operator<<(QDebug pDbg, const CardInfo &pCardInfo)
Definition: CardInfo.cpp:287
friend QDebug operator<<(QDebug, const LogHandler &)
Definition: LogHandler.h:140
bool copyOther(const QString &pSource, const QString &pDest) const
Definition: LogHandler.cpp:421
Definition: LogHandler.h:51
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...
QByteArray getBacklog(bool pAll=false)
Definition: LogHandler.cpp:175