Прозрачное журналирование с wxLog

В wxWidgets есть отличный механизм журналирования wxLog.
С его помощью можно решить проблему ведения лога одновременно в файл и, например, в текстовый контрол.

Если необходимо выводить сообщения в файл не только в ANSI, а и в Unicode,
то очень удобно использовать логгер wxLogStream.
Для его использования, потребуется собрать (если еще не собрано) wxWidgets с выставленной поддержкой std потоков:

#define wxUSE_STD_IOSTREAM 1

в файле setup.h. После этого, в приложении потребуется установить целевой логгер:

//wxTestApp.h
// в классе приложения добавить мембер потока
...
#include 
...

class wxTestApp: public wxApp
{
...
private:
    std::ofstream m_logStream;
...
};

//wxTestApp.cpp
// в OnInit() проинициализировать целевой логгер

bool wxCDCreatorApp::OnInit() {
    // задаем имя лога (в каталоге приложения, файл < имя файла приложения>.log
    wxString logPath = wxwxPathOnly(wxGetApp().argv[0]) + 
wxFileName::GetPathSeparator() + GetAppName() +  wxT(".log");
    m_logStream.open(logPath.GetData());

    // не забываем удалить предыдущий логгер
    delete wxLog::SetActiveTarget(new wxLogStream(reinterpret_cast(&m_logStream)));

    // можно работать
    wxLogMessage(wxT("Запуск приложения..."));
...
// инициализация приложения
}

// и в OnExit() закрываем поток
int wxCDCreatorApp::OnExit()
{    
    wxLogMessage(wxT("Выход..."));
    m_logStream.close();
    return wxApp::OnExit();
}

После этого, в любой части приложения возмножно с помощью функций wxLogMessage[/sourcecode], wxLogDebug[/sourcecode] (только в отладочной версии),
wxLogTrace[/sourcecode] вести журналирование. В результате работы, в лог пишутся сообщения в примерно таком формате:

09:55:05: Запуск приложения...

Leave a Reply

Your email address will not be published. Required fields are marked *

Please leave these two fields as-is: