Logging: Formatting

This commit is contained in:
Jonas Kvinge 2021-10-31 13:14:17 +01:00
parent 642a455a9c
commit 7697bbfa4e
2 changed files with 28 additions and 25 deletions

View File

@ -52,17 +52,17 @@
namespace logging { namespace logging {
static Level sDefaultLevel = Level_Debug; static Level sDefaultLevel = Level_Debug;
static QMap<QString, Level>* sClassLevels = nullptr; static QMap<QString, Level> *sClassLevels = nullptr;
static QIODevice *sNullDevice = nullptr; static QIODevice *sNullDevice = nullptr;
const char* kDefaultLogLevels = "*:3"; const char *kDefaultLogLevels = "*:3";
static const char *kMessageHandlerMagic = "__logging_message__"; static const char *kMessageHandlerMagic = "__logging_message__";
static const size_t kMessageHandlerMagicLength = strlen(kMessageHandlerMagic); static const size_t kMessageHandlerMagicLength = strlen(kMessageHandlerMagic);
static QtMessageHandler sOriginalMessageHandler = nullptr; static QtMessageHandler sOriginalMessageHandler = nullptr;
template <class T> template <class T>
static T CreateLogger(Level level, const QString& class_name, int line, const char* category); static T CreateLogger(Level level, const QString &class_name, int line, const char *category);
void GLog(const char *domain, int level, const char *message, void*) { void GLog(const char *domain, int level, const char *message, void*) {
@ -93,8 +93,8 @@ class DebugBase : public QDebug {
public: public:
DebugBase() : QDebug(sNullDevice) {} DebugBase() : QDebug(sNullDevice) {}
explicit DebugBase(QtMsgType t) : QDebug(t) {} explicit DebugBase(QtMsgType t) : QDebug(t) {}
T& space() { return static_cast<T&>(QDebug::space()); } T &space() { return static_cast<T&>(QDebug::space()); }
T& noSpace() { return static_cast<T&>(QDebug::nospace()); } T &nospace() { return static_cast<T&>(QDebug::nospace()); }
}; };
// Debug message will be stored in a buffer. // Debug message will be stored in a buffer.
@ -111,7 +111,7 @@ class BufferedDebug : public DebugBase<BufferedDebug> {
// Delete function for the buffer. Since a base class is holding a reference to the raw pointer, // Delete function for the buffer. Since a base class is holding a reference to the raw pointer,
// it shouldn't be deleted until after the deletion of this object is complete. // it shouldn't be deleted until after the deletion of this object is complete.
static void later_deleter(QBuffer* b) { b->deleteLater(); } static void later_deleter(QBuffer *b) { b->deleteLater(); }
std::shared_ptr<QBuffer> buf_; std::shared_ptr<QBuffer> buf_;
}; };
@ -145,7 +145,7 @@ static void MessageHandler(QtMsgType type, const QMessageLogContext&, const QStr
break; break;
} }
for (const QString& line : message.split('\n')) { for (const QString &line : message.split('\n')) {
BufferedDebug d = CreateLogger<BufferedDebug>(level, "unknown", -1, nullptr); BufferedDebug d = CreateLogger<BufferedDebug>(level, "unknown", -1, nullptr);
d << line.toLocal8Bit().constData(); d << line.toLocal8Bit().constData();
if (d.buf_) { if (d.buf_) {
@ -173,6 +173,7 @@ void Init() {
if (!sOriginalMessageHandler) { if (!sOriginalMessageHandler) {
sOriginalMessageHandler = qInstallMessageHandler(MessageHandler); sOriginalMessageHandler = qInstallMessageHandler(MessageHandler);
} }
} }
void SetLevels(const QString &levels) { void SetLevels(const QString &levels) {
@ -229,10 +230,11 @@ static QString ParsePrettyFunction(const char *pretty_function) {
} }
return class_name; return class_name;
} }
template <class T> template <class T>
static T CreateLogger(Level level, const QString &class_name, int line, const char* category) { static T CreateLogger(Level level, const QString &class_name, int line, const char *category) {
// Map the level to a string // Map the level to a string
const char *level_name = nullptr; const char *level_name = nullptr;
@ -269,11 +271,10 @@ static T CreateLogger(Level level, const QString &class_name, int line, const ch
} }
T ret(type); T ret(type);
ret.nospace() << QDateTime::currentDateTime().toString("hh:mm:ss.zzz").toLatin1().constData() ret.nospace() << QDateTime::currentDateTime().toString("hh:mm:ss.zzz").toLatin1().constData() << level_name << function_line.leftJustified(32).toLatin1().constData();
<< level_name
<< function_line.leftJustified(32).toLatin1().constData();
return ret.space(); return ret.space();
} }
#ifdef Q_OS_UNIX #ifdef Q_OS_UNIX
@ -303,6 +304,7 @@ QString LinuxDemangle(const QString &symbol) {
} }
QString mangled_function = match.captured(1); QString mangled_function = match.captured(1);
return CXXDemangle(mangled_function); return CXXDemangle(mangled_function);
} }
#endif // Q_OS_LINUX #endif // Q_OS_LINUX
@ -323,6 +325,7 @@ QString DarwinDemangle(const QString &symbol) {
QString DemangleSymbol(const QString &symbol); QString DemangleSymbol(const QString &symbol);
QString DemangleSymbol(const QString &symbol) { QString DemangleSymbol(const QString &symbol) {
#ifdef Q_OS_MACOS #ifdef Q_OS_MACOS
return DarwinDemangle(symbol); return DarwinDemangle(symbol);
#elif defined(Q_OS_LINUX) #elif defined(Q_OS_LINUX)
@ -330,9 +333,11 @@ QString DemangleSymbol(const QString &symbol) {
#else #else
return symbol; return symbol;
#endif #endif
} }
void DumpStackTrace() { void DumpStackTrace() {
#ifdef HAVE_BACKTRACE #ifdef HAVE_BACKTRACE
void *callstack[128]; void *callstack[128];
int callstack_size = backtrace(reinterpret_cast<void**>(&callstack), sizeof(callstack)); int callstack_size = backtrace(reinterpret_cast<void**>(&callstack), sizeof(callstack));
@ -345,11 +350,11 @@ void DumpStackTrace() {
#else #else
qLog(Debug) << "FIXME: Implement printing stack traces on this platform"; qLog(Debug) << "FIXME: Implement printing stack traces on this platform";
#endif #endif
} }
// These are the functions that create loggers for the rest of Clementine. // These are the functions that create loggers for the rest of Strawberry.
// It's okay that the LoggedDebug instance is copied to a QDebug in these. It // It's okay that the LoggedDebug instance is copied to a QDebug in these. It doesn't override any behavior that should be needed after return.
// doesn't override any behavior that should be needed after return.
#define qCreateLogger(line, pretty_function, category, level) logging::CreateLogger<LoggedDebug>(logging::Level_##level, logging::ParsePrettyFunction(pretty_function), line, category) #define qCreateLogger(line, pretty_function, category, level) logging::CreateLogger<LoggedDebug>(logging::Level_##level, logging::ParsePrettyFunction(pretty_function), line, category)
QDebug CreateLoggerInfo(int line, const char *pretty_function, const char *category) { return qCreateLogger(line, pretty_function, category, Info); } QDebug CreateLoggerInfo(int line, const char *pretty_function, const char *category) { return qCreateLogger(line, pretty_function, category, Info); }
@ -359,13 +364,13 @@ QDebug CreateLoggerError(int line, const char *pretty_function, const char *cate
#ifdef QT_NO_WARNING_OUTPUT #ifdef QT_NO_WARNING_OUTPUT
QNoDebug CreateLoggerWarning(int, const char*, const char*) { return QNoDebug(); } QNoDebug CreateLoggerWarning(int, const char*, const char*) { return QNoDebug(); }
#else #else
QDebug CreateLoggerWarning(int line, const char *pretty_function, const char* category) { return qCreateLogger(line, pretty_function, category, Warning); } QDebug CreateLoggerWarning(int line, const char *pretty_function, const char *category) { return qCreateLogger(line, pretty_function, category, Warning); }
#endif // QT_NO_WARNING_OUTPUT #endif // QT_NO_WARNING_OUTPUT
#ifdef QT_NO_DEBUG_OUTPUT #ifdef QT_NO_DEBUG_OUTPUT
QNoDebug CreateLoggerDebug(int, const char*, const char*) { return QNoDebug(); } QNoDebug CreateLoggerDebug(int, const char*, const char*) { return QNoDebug(); }
#else #else
QDebug CreateLoggerDebug(int line, const char *pretty_function, const char* category) { return qCreateLogger(line, pretty_function, category, Debug); } QDebug CreateLoggerDebug(int line, const char *pretty_function, const char *category) { return qCreateLogger(line, pretty_function, category, Debug); }
#endif // QT_NO_DEBUG_OUTPUT #endif // QT_NO_DEBUG_OUTPUT
} // namespace logging } // namespace logging
@ -383,4 +388,3 @@ QDebug operator<<(QDebug dbg, std::chrono::seconds secs) {
dbg.nospace() << print_duration(secs, "s"); dbg.nospace() << print_duration(secs, "s");
return dbg.space(); return dbg.space();
} }

View File

@ -68,28 +68,27 @@ enum Level {
}; };
void Init(); void Init();
void SetLevels(const QString& levels); void SetLevels(const QString &levels);
void DumpStackTrace(); void DumpStackTrace();
QDebug CreateLoggerInfo(int line, const char *pretty_function, const char* category); QDebug CreateLoggerInfo(int line, const char *pretty_function, const char *category);
QDebug CreateLoggerFatal(int line, const char *pretty_function, const char* category); QDebug CreateLoggerFatal(int line, const char *pretty_function, const char *category);
QDebug CreateLoggerError(int line, const char *pretty_function, const char* category); QDebug CreateLoggerError(int line, const char *pretty_function, const char *category);
#ifdef QT_NO_WARNING_OUTPUT #ifdef QT_NO_WARNING_OUTPUT
QNoDebug CreateLoggerWarning(int, const char*, const char*); QNoDebug CreateLoggerWarning(int, const char*, const char*);
#else #else
QDebug CreateLoggerWarning(int line, const char *pretty_function, const char* category); QDebug CreateLoggerWarning(int line, const char *pretty_function, const char *category);
#endif // QT_NO_WARNING_OUTPUT #endif // QT_NO_WARNING_OUTPUT
#ifdef QT_NO_DEBUG_OUTPUT #ifdef QT_NO_DEBUG_OUTPUT
QNoDebug CreateLoggerDebug(int, const char*, const char*); QNoDebug CreateLoggerDebug(int, const char*, const char*);
#else #else
QDebug CreateLoggerDebug(int line, const char *pretty_function, const char* category); QDebug CreateLoggerDebug(int line, const char *pretty_function, const char *category);
#endif // QT_NO_DEBUG_OUTPUT #endif // QT_NO_DEBUG_OUTPUT
void GLog(const char *domain, int level, const char *message, void *user_data);
void GLog(const char* domain, int level, const char* message, void* user_data);
extern const char *kDefaultLogLevels; extern const char *kDefaultLogLevels;