Логирование

В 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 заменяем из знаком вопроса.