Redirect stderr to log file
To log side libraries output
This commit is contained in:
parent
5556d7aae2
commit
b73cbde790
@ -6,12 +6,19 @@
|
||||
#include <QMutex>
|
||||
#include <QThread>
|
||||
|
||||
#ifdef Q_OS_WIN
|
||||
#include <io.h>
|
||||
#else
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
|
||||
namespace
|
||||
{
|
||||
QtMessageHandler original = nullptr;
|
||||
QMutex mutex;
|
||||
QFile file;
|
||||
QTextStream stream;
|
||||
QString fileName;
|
||||
int realStdout{};
|
||||
int realStderr{};
|
||||
FILE *logFile{};
|
||||
|
||||
void handler(QtMsgType type, const QMessageLogContext &context,
|
||||
const QString &msg)
|
||||
@ -29,11 +36,30 @@ void handler(QtMsgType type, const QMessageLogContext &context,
|
||||
QFileInfo(context.file).fileName().toUtf8() + ':' +
|
||||
QByteArray::number(context.line) + typeName + msg.toUtf8() + '\n';
|
||||
|
||||
SOFT_ASSERT(original, return );
|
||||
original(type, context, msg);
|
||||
if (logFile)
|
||||
write(fileno(logFile), message.data(), message.size());
|
||||
if (realStderr > 0)
|
||||
write(realStderr, message.data(), message.size());
|
||||
}
|
||||
|
||||
QMutexLocker locker(&mutex);
|
||||
file.write(message);
|
||||
void toDefaults()
|
||||
{
|
||||
qInstallMessageHandler(nullptr);
|
||||
|
||||
if (realStdout > 0) {
|
||||
dup2(realStdout, fileno(stdout));
|
||||
realStdout = -1;
|
||||
}
|
||||
|
||||
if (realStderr > 0) {
|
||||
dup2(realStderr, fileno(stderr));
|
||||
realStderr = -1;
|
||||
}
|
||||
|
||||
if (logFile) {
|
||||
fclose(logFile);
|
||||
logFile = nullptr;
|
||||
}
|
||||
}
|
||||
} // namespace
|
||||
|
||||
@ -44,28 +70,32 @@ std::atomic_bool isTrace = false;
|
||||
QString traceFileName()
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
return file.fileName();
|
||||
return fileName;
|
||||
}
|
||||
|
||||
bool setTraceFileName(const QString &fileName)
|
||||
{
|
||||
QMutexLocker locker(&mutex);
|
||||
|
||||
original = nullptr;
|
||||
qInstallMessageHandler(nullptr);
|
||||
|
||||
if (file.isOpen())
|
||||
file.close();
|
||||
toDefaults();
|
||||
|
||||
if (fileName.isEmpty())
|
||||
return true;
|
||||
|
||||
file.setFileName(fileName);
|
||||
|
||||
if (!file.open(QFile::WriteOnly | QFile::Unbuffered))
|
||||
logFile = fopen(qPrintable(fileName), "w");
|
||||
if (!logFile)
|
||||
return false;
|
||||
|
||||
original = qInstallMessageHandler(handler);
|
||||
realStdout = dup(fileno(stdout));
|
||||
realStderr = dup(fileno(stderr));
|
||||
|
||||
const auto fd = fileno(logFile);
|
||||
dup2(fd, fileno(stdout));
|
||||
dup2(fd, fileno(stderr));
|
||||
|
||||
::fileName = fileName;
|
||||
qInstallMessageHandler(handler);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user