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