суббота, 7 марта 2009 г.

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

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

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

#define wxUSE_STD_IOSTREAM 1


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

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

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

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

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

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

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

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


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


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

Комментариев нет: