MythTV master
logging.h
Go to the documentation of this file.
1#ifndef LOGGING_H_
2#define LOGGING_H_
3
4#include <QMutexLocker>
5#include <QMutex>
6#include <QQueue>
7#include <QPointer>
8#include <QCoreApplication>
9
10#include <cstdint>
11#include <cstdlib>
12#include <string>
13
14#include <sys/types.h>
15
16#include "mythconfig.h"
17#include "mythbaseexp.h" // MBASE_PUBLIC , etc.
18#include "verbosedefs.h"
19#include "mthread.h"
20#include "referencecounter.h"
21#include "compat.h"
22#include "mythchrono.h"
23
24#if CONFIG_SYSTEMD_JOURNAL
25static constexpr int SYSTEMD_JOURNAL_FACILITY { -99 };
26#endif
27
28class QString;
29class MSqlQuery;
30class LoggingItem;
31
32void loggingRegisterThread(const QString &name);
34
35class QWaitCondition;
36
37enum LoggingType : std::uint8_t {
38 kMessage = 0x01,
41 kFlush = 0x08,
44};
45
46class LoggerThread;
47
48using tmType = struct tm;
49
52class LoggingItem: public QObject, public ReferenceCounter
53{
54 Q_OBJECT
55
56 Q_PROPERTY(int pid READ pid WRITE setPid)
57 Q_PROPERTY(qlonglong tid READ tid WRITE setTid)
58 Q_PROPERTY(qulonglong threadId READ threadId WRITE setThreadId)
59 Q_PROPERTY(int line READ line WRITE setLine)
60 Q_PROPERTY(int type READ type WRITE setType)
61 Q_PROPERTY(int level READ level WRITE setLevel)
62 Q_PROPERTY(int facility READ facility WRITE setFacility)
63 Q_PROPERTY(qlonglong epoch READ epochInt WRITE setEpochInt)
64 Q_PROPERTY(QString file READ file WRITE setFile)
65 Q_PROPERTY(QString function READ function WRITE setFunction)
66 Q_PROPERTY(QString threadName READ threadName WRITE setThreadName)
67 Q_PROPERTY(QString appName READ appName WRITE setAppName)
68 Q_PROPERTY(QString logFile READ logFile WRITE setLogFile)
69 Q_PROPERTY(QString message READ message WRITE setMessage)
70
71 friend class LoggerThread;
72 friend MBASE_PUBLIC void LogPrintLine(uint64_t mask, LogLevel_t level, const char *file, int line,
73 const char *function, QString message);
74
75 public:
76 QString getThreadName(void);
77 int64_t getThreadTid(void);
78 void setThreadTid(void);
79 static LoggingItem *create(const char *_file, const char *_function, int _line, LogLevel_t _level,
80 LoggingType _type);
81 QString getTimestamp(const char *format = "yyyy-MM-dd HH:mm:ss") const;
82 QString getTimestampUs(const char *format = "yyyy-MM-dd HH:mm:ss") const;
83 char getLevelChar(void);
84
85 int pid() const { return m_pid; };
86 qlonglong tid() const { return m_tid; };
87 qulonglong threadId() const { return m_threadId; };
88 int line() const { return m_line; };
89 int type() const { return (int)m_type; };
90 int level() const { return (int)m_level; };
91 int facility() const { return m_facility; };
92 std::chrono::microseconds epoch() const { return m_epoch; };
93 qlonglong epochInt() const { return m_epoch.count(); };
94 QString file() const { return m_file; };
95 QString function() const { return m_function; };
96 QString threadName() const { return m_threadName; };
97 QString appName() const { return m_appName; };
98 QString logFile() const { return m_logFile; };
99 QString message() const { return m_message; };
100
101 void setPid(const int val) { m_pid = val; };
102 void setTid(const qlonglong val) { m_tid = val; };
103 void setThreadId(const qulonglong val) { m_threadId = val; };
104 void setLine(const int val) { m_line = val; };
105 void setType(const int val) { m_type = (LoggingType)val; };
106 void setLevel(const int val) { m_level = (LogLevel_t)val; };
107 void setFacility(const int val) { m_facility = val; };
108 void setEpoch(std::chrono::microseconds val) { m_epoch = val; };
109 void setEpochInt(const qlonglong val) { setEpoch(std::chrono::microseconds(val)); };
110 void setFile(const QString &val) { m_file = val; };
111 void setFunction(const QString &val) { m_function = val; };
112 void setThreadName(const QString &val) { m_threadName = val; };
113 void setAppName(const QString &val) { m_appName = val; };
114 void setLogFile(const QString &val) { m_logFile = val; };
115 void setMessage(const QString &val) { m_message = val; };
116
117 std::string toString();
118 std::string toStringShort();
119
120 protected:
121 int m_pid {-1};
122 qlonglong m_tid {-1};
123 qulonglong m_threadId {UINT64_MAX};
124 int m_line {0};
126 LogLevel_t m_level {LOG_INFO};
127 int m_facility {0};
128 std::chrono::microseconds m_epoch {0us};
129 QString m_file;
130 QString m_function;
132 QString m_appName;
133 QString m_logFile;
134 QString m_message;
135
136 private:
138 : ReferenceCounter("LoggingItem", false) {};
139 LoggingItem(const char *_file, const char *_function,
140 int _line, LogLevel_t _level, LoggingType _type);
142};
143
146class LoggerThread : public QObject, public MThread
147{
148 Q_OBJECT
149
150 friend MBASE_PUBLIC void LogPrintLine(uint64_t mask, LogLevel_t level, const char *file, int line,
151 const char *function, QString message);
152 public:
153 LoggerThread(QString filename, bool progress, bool quiet, int facility, bool loglong);
154 ~LoggerThread() override;
155 void run(void) override; // MThread
156 void stop(void);
157 bool flush(int timeoutMS = 200000);
158 static void handleItem(LoggingItem *item);
159 void fillItem(LoggingItem *item);
160 private:
162 QWaitCondition *m_waitNotEmpty {nullptr};
166 QWaitCondition *m_waitEmpty {nullptr};
170 bool m_aborted {false};
172 QString m_filename;
174 bool m_quiet;
176 QString m_appname {QCoreApplication::applicationName()};
179 pid_t m_pid;
180
181 protected:
182 bool logConsole(LoggingItem *item) const;
183};
184
185#endif
186
187/*
188 * vim:ts=4:sw=4:ai:et:si:sts=4
189 */
The logging thread that consumes the logging queue and dispatches each LoggingItem.
Definition: logging.h:147
void stop(void)
Stop the thread by setting the abort flag after waiting a second for the queue to be flushed.
Definition: logging.cpp:477
LoggerThread(QString filename, bool progress, bool quiet, int facility, bool loglong)
LoggerThread constructor.
Definition: logging.cpp:250
bool m_quiet
silence the console (console only)
Definition: logging.h:174
friend MBASE_PUBLIC void LogPrintLine(uint64_t mask, LogLevel_t level, const char *file, int line, const char *function, QString message)
Format and send a log message into the queue.
Definition: logging.cpp:541
bool m_progress
show only LOG_ERR and more important (console only)
Definition: logging.h:173
QString m_appname
Cached application name.
Definition: logging.h:176
int m_facility
Cached syslog facility (or -1 to disable)
Definition: logging.h:178
Q_DISABLE_COPY(LoggerThread)
void run(void) override
Run the logging thread.
Definition: logging.cpp:289
~LoggerThread() override
LoggerThread destructor. Triggers the deletion of all loggers.
Definition: logging.cpp:275
QWaitCondition * m_waitEmpty
Condition variable for waiting for the queue to be empty Protected by logQueueMutex.
Definition: logging.h:166
void fillItem(LoggingItem *item)
Definition: logging.cpp:503
bool flush(int timeoutMS=200000)
Wait for the queue to be flushed (up to a timeout)
Definition: logging.cpp:489
pid_t m_pid
Cached pid value.
Definition: logging.h:179
bool logConsole(LoggingItem *item) const
Process a log message, writing to the console.
Definition: logging.cpp:397
bool m_aborted
Flag to abort the thread.
Definition: logging.h:170
QWaitCondition * m_waitNotEmpty
Condition variable for waiting for the queue to not be empty Protected by logQueueMutex.
Definition: logging.h:162
bool m_loglong
use long log format (console only)
Definition: logging.h:175
QString m_filename
Filename of debug logfile.
Definition: logging.h:172
static void handleItem(LoggingItem *item)
Handles each LoggingItem.
Definition: logging.cpp:345
The logging items that are generated by LOG() and are sent to the console.
Definition: logging.h:53
void setEpochInt(const qlonglong val)
Definition: logging.h:109
int level
Definition: logging.h:61
Q_DISABLE_COPY(LoggingItem)
friend MBASE_PUBLIC void LogPrintLine(uint64_t mask, LogLevel_t level, const char *file, int line, const char *function, QString message)
Format and send a log message into the queue.
Definition: logging.cpp:541
QString appName
Definition: logging.h:67
int pid
Definition: logging.h:56
char getLevelChar(void)
Get the message log level as a single character.
Definition: logging.cpp:210
int m_facility
Definition: logging.h:127
static LoggingItem * create(const char *_file, const char *_function, int _line, LogLevel_t _level, LoggingType _type)
Create a new LoggingItem.
Definition: logging.cpp:523
QString appName() const
Definition: logging.h:97
QString logFile
Definition: logging.h:68
int type() const
Definition: logging.h:89
QString m_appName
Definition: logging.h:132
void setEpoch(std::chrono::microseconds val)
Definition: logging.h:108
void setTid(const qlonglong val)
Definition: logging.h:102
qlonglong tid() const
Definition: logging.h:86
std::chrono::microseconds epoch() const
Definition: logging.h:92
void setFunction(const QString &val)
Definition: logging.h:111
void setThreadName(const QString &val)
Definition: logging.h:112
QString message() const
Definition: logging.h:99
QString getTimestampUs(const char *format="yyyy-MM-dd HH:mm:ss") const
Definition: logging.cpp:202
void setLine(const int val)
Definition: logging.h:104
void setMessage(const QString &val)
Definition: logging.h:115
qlonglong m_tid
Definition: logging.h:122
void setAppName(const QString &val)
Definition: logging.h:113
LoggingItem()
Definition: logging.h:137
int line() const
Definition: logging.h:88
std::string toString()
Long format to string.
Definition: logging.cpp:219
void setPid(const int val)
Definition: logging.h:101
qlonglong epochInt() const
Definition: logging.h:93
QString m_logFile
Definition: logging.h:133
qlonglong epoch
Definition: logging.h:63
LoggingType m_type
Definition: logging.h:125
int m_line
Definition: logging.h:124
QString logFile() const
Definition: logging.h:98
QString threadName() const
Definition: logging.h:96
QString file() const
Definition: logging.h:94
void setFacility(const int val)
Definition: logging.h:107
QString m_threadName
Definition: logging.h:131
qulonglong m_threadId
Definition: logging.h:123
QString file
Definition: logging.h:64
QString m_function
Definition: logging.h:130
void setLevel(const int val)
Definition: logging.h:106
void setType(const int val)
Definition: logging.h:105
LogLevel_t m_level
Definition: logging.h:126
qulonglong threadId
Definition: logging.h:58
QString getTimestamp(const char *format="yyyy-MM-dd HH:mm:ss") const
Convert numerical timestamp to a readable date and time.
Definition: logging.cpp:195
qlonglong tid
Definition: logging.h:57
int level() const
Definition: logging.h:90
QString message
Definition: logging.h:69
QString function() const
Definition: logging.h:95
void setFile(const QString &val)
Definition: logging.h:110
int64_t getThreadTid(void)
Get the thread ID of the thread that produced the LoggingItem.
Definition: logging.cpp:157
void setThreadTid(void)
Set the thread ID of the thread that produced the LoggingItem.
Definition: logging.cpp:170
QString m_message
Definition: logging.h:134
int line
Definition: logging.h:59
QString function
Definition: logging.h:65
void setLogFile(const QString &val)
Definition: logging.h:114
int type
Definition: logging.h:60
std::string toStringShort()
short console format
Definition: logging.cpp:238
qulonglong threadId() const
Definition: logging.h:87
std::chrono::microseconds m_epoch
Definition: logging.h:128
void setThreadId(const qulonglong val)
Definition: logging.h:103
QString threadName
Definition: logging.h:66
QString m_file
Definition: logging.h:129
int facility
Definition: logging.h:62
int facility() const
Definition: logging.h:91
QString getThreadName(void)
Get the name of the thread that produced the LoggingItem.
Definition: logging.cpp:141
int m_pid
Definition: logging.h:121
QSqlQuery wrapper that fetches a DB connection from the connection pool.
Definition: mythdbcon.h:128
This is a wrapper around QThread that does several additional things.
Definition: mthread.h:49
General purpose reference counter.
tm tmType
Definition: logging.h:48
void loggingDeregisterThread(void)
Deregister the current thread's name.
Definition: logging.cpp:721
void loggingRegisterThread(const QString &name)
Register the current thread with the given name.
Definition: logging.cpp:702
LoggingType
Definition: logging.h:37
@ kRegistering
Definition: logging.h:39
@ kInitializing
Definition: logging.h:43
@ kStandardIO
Definition: logging.h:42
@ kMessage
Definition: logging.h:38
@ kFlush
Definition: logging.h:41
@ kDeregistering
Definition: logging.h:40
#define MBASE_PUBLIC
Definition: mythbaseexp.h:8
VERBOSE_PREAMBLE false
Definition: verbosedefs.h:80