В Qt 4 можно перехватить вывод qDebug(), qCritical() через задание своего обработчика событий messageHandler:
#include <QMutex>
const char* LOGFILE_LOCATION = "d:\\111\\000\\111.txt";
static QFile logFile(LOGFILE_LOCATION);
void messageHandler(QtMsgType type, const char *message)
{
static QMutex mutex;
QMutexLocker lock(&mutex);
if (logFile.isOpen())
{
logFile.write(QString(message).toUtf8() +"\n");
logFile.flush();
}
mutex.unlock();
}
int main(int argc, char *argv[])
{
logFile.resize(0); // clear !!!
logFile.flush();
bool logFileIsOpen = logFile.open(QIODevice::Append | QIODevice::Text);
qInstallMsgHandler(messageHandler);
qDebug()<<"This should be display!";
Все работает, но это лог вызовов qDebug(), qCritical(), qWarning().
А что если у вас в проект включены исходники чужих библиотек, которые написаны не на Qt, а допустим на чистом С (к примеру openssl) и там логирование традиционно использует std::cout и std::cerr.
Дело в том, что к вам в messageHandler они не попадают. А сыплются std::cout в стандартный поток вывода с номером 1, который создается операционной системой для каждого приложения.
Чтобы вес лог свести в один файл можно попробовать qDebug() выводить в std::cout и сделать freopen :
#include <QMutex>
const char* LOGFILE_LOCATION = "d:\\111\\000\\111.txt";
static QFile logFile(LOGFILE_LOCATION);
void messageHandler(QtMsgType type, const char *message)
{
static QMutex mutex;
QMutexLocker lock(&mutex);
std::cout << message << std::endl;
mutex.unlock();
}
int main(int argc, char *argv[])
{
freopen("d:\\111\\000\\111.txt", "w", stdout);
logFile.resize(0); // clear !!!
logFile.flush();
bool logFileIsOpen = logFile.open(QIODevice::Append | QIODevice::Text);
qInstallMsgHandler(messageHandler);
qDebug()<<"This should be display!";
И это кстати будет работать, но выяснится еще небольшой нюанс. Не плохо-бы еще добавить freopen для stderr :
freopen("d:\\111\\000\\111.txt", "w", stdout);
И тогда в файле 111.txt будет собираться общий лог.
Но вот в чем еще проблема : если смотреть лог в выводе терминала (то есть когда без freopen), то порядок вывода информации другой и похоже более правильный.
Остается еще неудобный момент с кракозябрами. В логе явно присутствуют не латинские символы. Попадается это в каких-то полях сертификатов. stdout заменяем из знаком вопроса.