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
26class test_LogHandler;
27class test_LogModel;
28
29namespace 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
158inline 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
static LogHandler & getInstance()
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
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:89