Skip to content

Commit

Permalink
medLoggerRedirectWithBoost
Browse files Browse the repository at this point in the history
  • Loading branch information
Florent2305 committed May 19, 2020
1 parent f1b33b8 commit 32af87d
Show file tree
Hide file tree
Showing 2 changed files with 67 additions and 4 deletions.
57 changes: 53 additions & 4 deletions src/app/medInria/medLogger.cpp
Original file line number Diff line number Diff line change
@@ -1,15 +1,27 @@
#include "medLogger.h"

#include <QTextStream>
#include <iostream>

typedef boost::iostreams::tee_device<std::ostream, std::ofstream> TeeDevice;
typedef boost::iostreams::stream<TeeDevice> TeeStream;

class medLoggerPrivate
{
public:
static medLogger* singleton;
static bool logAccessFlag;

std::ofstream logFile;
QList<std::ostream*> redirectedStreams;
QList<std::ostream*> redirectedStreamDummies;
QList<TeeStream*> teeStreams;
QList<std::streambuf*> previousStreamBuffers;

static const qint64 maxLogSize = 5000000;
static const qint64 minLogSize = 1000000;

medLoggerPrivate() : logFile(dtkLogPath(qApp).toLocal8Bit().data(), std::ios::app) {}
};

medLogger* medLoggerPrivate::singleton = nullptr;
Expand Down Expand Up @@ -77,21 +89,29 @@ void medLogger::redirectQtMessage(QtMsgType type, const QString& message)
}
}

void medLogger::redirectMessage(const QString& message)
{
dtkTrace() << message;
}

void medLogger::redirectErrorMessage(const QString& message)
{
dtkError() << message;
}

medLogger::medLogger() : d(new medLoggerPrivate)
{
qRegisterMetaType<QtMsgType>("QtMsgType");

initializeTeeStreams();

truncateLogFileIfHeavy();

dtkLogger::instance().setLevel(logLevel);

dtkLogger::instance().attachFile(dtkLogPath(qApp));
dtkLogger::instance().attachConsole();

// Redirect cerr and cout messages
dtkLogger::instance().redirectCerr();
dtkLogger::instance().redirectCout();

// Redirect Qt messages
QObject::connect(this, SIGNAL(newQtMessage(QtMsgType,QString)), this, SLOT(redirectQtMessage(QtMsgType,QString)));
qInstallMessageHandler(qtMessageHandler);
Expand All @@ -104,6 +124,35 @@ medLogger::~medLogger()

QObject::disconnect(this, SIGNAL(newQtMessage(QtMsgType,QString)), this, SLOT(redirectQtMessage(QtMsgType,QString)));
qInstallMessageHandler(nullptr);
finalizeTeeStreams();
}

void medLogger::initializeTeeStreams()
{
createTeeStream(&std::cout);
createTeeStream(&std::cerr);
}

void medLogger::finalizeTeeStreams()
{
for (int i = 0; i < d->redirectedStreams.length(); i++)
{
d->teeStreams.first()->flush();
d->teeStreams.first()->close();
delete d->teeStreams.takeFirst();
delete d->redirectedStreamDummies.takeFirst();
d->redirectedStreams.takeFirst()->rdbuf(d->previousStreamBuffers.takeFirst());
}
}

void medLogger::createTeeStream(std::ostream* targetStream)
{
d->redirectedStreams.append(targetStream);
d->previousStreamBuffers.append(targetStream->rdbuf());
d->redirectedStreamDummies.append(new std::ostream(targetStream->rdbuf()));
TeeDevice* teeDevice = new TeeDevice(*d->redirectedStreamDummies.last(), d->logFile);
d->teeStreams.append(new TeeStream(*teeDevice));
targetStream->rdbuf(d->teeStreams.last()->rdbuf());
}

void medLogger::truncateLogFileIfHeavy()
Expand Down
14 changes: 14 additions & 0 deletions src/app/medInria/medLogger.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ PURPOSE.
=========================================================================*/

#include <fstream>

#ifndef Q_MOC_RUN
#include <boost/iostreams/tee.hpp>
#include <boost/iostreams/stream.hpp>
#endif

#include <dtkLog/dtkLog.h>

#include <QtGui>
Expand Down Expand Up @@ -40,13 +47,20 @@ public :

private slots:
void redirectQtMessage(QtMsgType type, const QString& message);
void redirectMessage(const QString& message);
void redirectErrorMessage(const QString& message);

private:
medLoggerPrivate* const d;

medLogger();
~medLogger();

void initializeTeeStreams();
void finalizeTeeStreams();

void createTeeStream(std::ostream* targetStream);

/** Test the size of the log file and cut if needed
*/
void truncateLogFileIfHeavy();
Expand Down

0 comments on commit 32af87d

Please sign in to comment.