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 <QMutex>
 | 
				
			||||||
#include <QThread>
 | 
					#include <QThread>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef Q_OS_WIN
 | 
				
			||||||
 | 
					#include <io.h>
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace
 | 
					namespace
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
QtMessageHandler original = nullptr;
 | 
					 | 
				
			||||||
QMutex mutex;
 | 
					QMutex mutex;
 | 
				
			||||||
QFile file;
 | 
					QString fileName;
 | 
				
			||||||
QTextStream stream;
 | 
					int realStdout{};
 | 
				
			||||||
 | 
					int realStderr{};
 | 
				
			||||||
 | 
					FILE *logFile{};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void handler(QtMsgType type, const QMessageLogContext &context,
 | 
					void handler(QtMsgType type, const QMessageLogContext &context,
 | 
				
			||||||
             const QString &msg)
 | 
					             const QString &msg)
 | 
				
			||||||
@ -29,11 +36,30 @@ void handler(QtMsgType type, const QMessageLogContext &context,
 | 
				
			|||||||
      QFileInfo(context.file).fileName().toUtf8() + ':' +
 | 
					      QFileInfo(context.file).fileName().toUtf8() + ':' +
 | 
				
			||||||
      QByteArray::number(context.line) + typeName + msg.toUtf8() + '\n';
 | 
					      QByteArray::number(context.line) + typeName + msg.toUtf8() + '\n';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  SOFT_ASSERT(original, return );
 | 
					  if (logFile)
 | 
				
			||||||
  original(type, context, msg);
 | 
					    write(fileno(logFile), message.data(), message.size());
 | 
				
			||||||
 | 
					  if (realStderr > 0)
 | 
				
			||||||
 | 
					    write(realStderr, message.data(), message.size());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  QMutexLocker locker(&mutex);
 | 
					void toDefaults()
 | 
				
			||||||
  file.write(message);
 | 
					{
 | 
				
			||||||
 | 
					  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
 | 
					}  // namespace
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -44,28 +70,32 @@ std::atomic_bool isTrace = false;
 | 
				
			|||||||
QString traceFileName()
 | 
					QString traceFileName()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  QMutexLocker locker(&mutex);
 | 
					  QMutexLocker locker(&mutex);
 | 
				
			||||||
  return file.fileName();
 | 
					  return fileName;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool setTraceFileName(const QString &fileName)
 | 
					bool setTraceFileName(const QString &fileName)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  QMutexLocker locker(&mutex);
 | 
					  QMutexLocker locker(&mutex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  original = nullptr;
 | 
					  toDefaults();
 | 
				
			||||||
  qInstallMessageHandler(nullptr);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  if (file.isOpen())
 | 
					 | 
				
			||||||
    file.close();
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (fileName.isEmpty())
 | 
					  if (fileName.isEmpty())
 | 
				
			||||||
    return true;
 | 
					    return true;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  file.setFileName(fileName);
 | 
					  logFile = fopen(qPrintable(fileName), "w");
 | 
				
			||||||
 | 
					  if (!logFile)
 | 
				
			||||||
  if (!file.open(QFile::WriteOnly | QFile::Unbuffered))
 | 
					 | 
				
			||||||
    return false;
 | 
					    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;
 | 
					  return true;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user