Практически для любого приложения необходима функция ведения логов.
Приведу пример, который использую в небольших проектах.
Конечно, для серьезных решений желательно пользоваться syslog или его альтернативами, дополнительными библиотеками типа log4qt.
Данный пример ведет лог в файл и консоль.
main.cpp:
// Данные для ведения логов
static QTextStream* logStream;
static QFile* logFile;
// Типы сообщений
static const char* msgType[] =
{
"(II) ", // Info
"(WW) ", // Warning
"(EE) ", // Error
"(FF) " // Fatal error
};
const QString TextDescription = QObject::tr(
"%1 %2\n"
"Built on " __DATE__ " at " __TIME__ ".\n"
"Based on Qt %3.\n"
"Copyright %4. All rights reserved.\n"
"See also %5\n")
.arg(QLatin1String(APP_NAME), QLatin1String(APP_VERSION),
QLatin1String(QT_VERSION_STR), QLatin1String(ORG_NAME), QLatin1String(ORG_DOMAIN)
);
// Вывод логов в файл
void customMessageHandler(QtMsgType type, const char* msg);
// Создание файла для логов
void installLog();
// Закрытие файла логов
void finishLog();
// Информация об ОС
QString getOSInfo();
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
// Под Windows устанавливаем кодировку cp1251
#ifdef Q_WS_WIN
QTextCodec::setCodecForTr(QTextCodec::codecForName("Windows-1251"));
// Под остальными ОС - utf8
#else
QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
#endif
installLog();
MainWindow w;
w.show();
int mainReturn = a.exec();
finishLog();
return mainReturn;
}
void customMessageHandler(QtMsgType type, const char* msg)
{
std::cout << msgType[type] << msg << std::endl;
if(logStream && logStream->device())
{
*logStream << msgType[type] << msg << endl;
}
}
void installLog()
{
logFile = new QFile("messages.log");
if(logFile->open(QFile::WriteOnly | QIODevice::Append | QIODevice::Unbuffered))
logStream = new QTextStream(logFile);
#ifdef Q_WS_WIN
logStream->setCodec("Windows-1251");
// Под остальными ОС - utf8
#else
logStream->setCodec("utf-8");
#endif
// Запись заголовка с информацией о запуске
if(logStream && logStream->device())
{
*logStream << endl << TextDescription << endl;
*logStream << QString("Markers: (II) informational, (WW) warning,") << endl;
*logStream << QString("(EE) error, (FF) fatal error.") << endl;
*logStream << getOSInfo() << endl;
*logStream << QString("Runned at %1.").arg(QDateTime::currentDateTime().toString()) << endl << endl;
}
qInstallMsgHandler(customMessageHandler);
qDebug("Success opening log file");
}
void finishLog()
{
qDebug("Success closing log file");
delete logStream;
logStream = 0;
delete logFile;
logFile = 0;
qInstallMsgHandler(0);
}
QString getOSInfo()
{
QString infoStr("Current Operating System: %1");
#ifdef Q_OS_WIN
switch(QSysInfo::windowsVersion())
{
case QSysInfo::WV_NT: return infoStr.arg("Windows NT");
case QSysInfo::WV_2000: return infoStr.arg("Windows 2000");
case QSysInfo::WV_XP: return infoStr.arg("Windows XP");
case QSysInfo::WV_2003: return infoStr.arg("Windows 2003");
case QSysInfo::WV_VISTA: return infoStr.arg("Windows Vista");
case QSysInfo::WV_WINDOWS7: return infoStr.arg("Windows Seven");
default: return infoStr.arg("Windows");
}
#endif // Q_OS_WIN
#ifdef Q_OS_MAC
switch(QSysInfo::MacintoshVersion())
{
case QSysInfo::MV_CHEETAH: return infoStr.arg("Mac OS X 1.0 Cheetah");
case QSysInfo::MV_PUMA: return infoStr.arg("Mac OS X 1.1 Puma");
case QSysInfo::MV_JAGUAR: return infoStr.arg("Mac OS X 1.2 Jaguar");
case QSysInfo::MV_PANTHER: return infoStr.arg("Mac OS X 1.3 Panther");
case QSysInfo::MV_TIGER: return infoStr.arg("Mac OS X 1.4 Tiger");
case QSysInfo::MV_LEOPARD: return infoStr.arg("Mac OS X 1.5 Leopard");
case QSysInfo::MV_SNOWLEOPARD: return infoStr.arg("Mac OS X 1.6 Snow Leopard");
default: return infoStr.arg("Mac OS X");
}
#endif // Q_OS_MAC
#ifdef Q_OS_LINUX
#ifdef LINUX_OS_VERSION
return infoStr.arg(LINUX_OS_VERSION);
#else
return infoStr.arg("Linux");
#endif // LINUX_OS_VERSION
#endif // Q_OS_LINUX
}
Использование:
qDebug(...);
qWarning(...);
qCritical(...);
Пример вывода логгера:
MyApplication 0.0.2
Built on Jan 12 2010 at 13:29:24.
Based on Qt 4.6.0.
Copyright My Company. All rights reserved.
See also http://www.mycompany.ru
Markers: (II) informational, (WW) warning,
(EE) error, (FF) fatal error.
Current Operating System: Windows XP
Runned at Чт 14. янв 10:52:08 2010.
(II) Success opening log file
(II) Reading application settings...
(II) Application settings read and applied.
(WW) Object::connect: No such slot QDragTreeView::customContextMenuRequestedHandler(QPoint) in QDragTreeView.cpp:15
(II) Loaded logDockWidget.
(II) Loaded consoleDockWidget.
(II) Finding plugins
(II) Default configuration of Instrument_1 successfully read.
(II) Default configuration of Module_1 successfully read.
(II) Default configuration of Module_2 successfully read.
(II) Default configuration of Module_3 successfully read.
(II) Default configuration of Module_4 successfully read.
(II) Instrument plugins Instrument_1 found.
(II) Module plugins Module_1 found.
(II) Module plugins Module_2 found.
(II) Module plugins Module_3 found.
(II) Module plugins Module_4 found.
(II) Success closing log file
55.988859
37.181683