mirror of
https://github.com/overte-org/overte.git
synced 2025-08-08 04:17:34 +02:00
This can happen when LogHandler::flushRepetedMessages is called on the main thread, while the application is printing messages on a separate thread. The access to the _lastRepeatedMessage QHash was not guarded. I've added two mutexes to guard access to both the repeatedMessage hashes/regexes and the onlyOnceMessages/regexes. This will unfortunately incur a performance hit for frequent debug logging, but that's better then crashing. Also, I've added the ability to print threadIDs as well as Process ids. This is helpful when debugging multi-threaded access to shared variables.
71 lines
2.3 KiB
C++
71 lines
2.3 KiB
C++
//
|
|
// LogHandler.cpp
|
|
// libraries/shared/src
|
|
//
|
|
// Created by Stephen Birarda on 2014-10-28.
|
|
// Migrated from Logging.cpp created on 6/11/13
|
|
// Copyright 2014 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
|
|
#ifndef hifi_LogHandler_h
|
|
#define hifi_LogHandler_h
|
|
|
|
#include <qhash.h>
|
|
#include <qobject.h>
|
|
#include <qregexp.h>
|
|
#include <qset.h>
|
|
#include <qstring.h>
|
|
|
|
const int VERBOSE_LOG_INTERVAL_SECONDS = 5;
|
|
|
|
enum LogMsgType {
|
|
LogDebug = QtDebugMsg,
|
|
LogWarning = QtWarningMsg,
|
|
LogCritical = QtCriticalMsg,
|
|
LogFatal = QtFatalMsg,
|
|
LogSuppressed
|
|
};
|
|
|
|
/// Handles custom message handling and sending of stats/logs to Logstash instance
|
|
class LogHandler : public QObject {
|
|
Q_OBJECT
|
|
public:
|
|
static LogHandler& getInstance();
|
|
|
|
/// sets the target name to output via the verboseMessageHandler, called once before logging begins
|
|
/// \param targetName the desired target name to output in logs
|
|
void setTargetName(const QString& targetName) { _targetName = targetName; }
|
|
|
|
void setShouldOutputProcessID(bool shouldOutputProcessID) { _shouldOutputProcessID = shouldOutputProcessID; }
|
|
void setShouldOutputThreadID(bool shouldOutputThreadID) { _shouldOutputThreadID = shouldOutputThreadID; }
|
|
|
|
QString printMessage(LogMsgType type, const QMessageLogContext& context, const QString &message);
|
|
|
|
/// a qtMessageHandler that can be hooked up to a target that links to Qt
|
|
/// prints various process, message type, and time information
|
|
static void verboseMessageHandler(QtMsgType type, const QMessageLogContext& context, const QString &message);
|
|
|
|
const QString& addRepeatedMessageRegex(const QString& regexString);
|
|
const QString& addOnlyOnceMessageRegex(const QString& regexString);
|
|
private:
|
|
LogHandler();
|
|
|
|
void flushRepeatedMessages();
|
|
|
|
QString _targetName;
|
|
bool _shouldOutputProcessID;
|
|
bool _shouldOutputThreadID;
|
|
QSet<QString> _repeatedMessageRegexes;
|
|
QHash<QString, int> _repeatMessageCountHash;
|
|
QHash<QString, QString> _lastRepeatedMessage;
|
|
QMutex _repeatedMessageLock;
|
|
|
|
QSet<QString> _onlyOnceMessageRegexes;
|
|
QHash<QString, int> _onlyOnceMessageCountHash;
|
|
QMutex _onlyOnceMessageLock;
|
|
};
|
|
|
|
#endif // hifi_LogHandler_h
|