2013-11-19 2 views
2

Я хочу сгенерировать Вход в мое приложение i.e независимо от того, что я получаю в окне терминала или CMD-окне, которое будет сгенерировано как запись в текстовый файл.Печать всех сообщений и предупреждений на терминале в файл?

например. У меня есть программа клиентского сервера, поэтому любое сообщение или предупреждения, которые я получаю на терминале, нужно печатать в файле журнала вместе с меткой времени.

Любая идея, QxtLog или log4Qt делают то же самое, что я хочу?

+1

Я не уверен, может быть, [этот ответ] (http://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output) поможет (если вы используете 'Qt 4. *'? Else, если вы используете 'Qt 5. *', тогда прочитайте [this] (http://qt-project.org/doc/qt-5.0/qtcore/qtglobal. html # qInstallMsgHandler): API был немного изменен, но он не учитывает предыдущий! – Nawaz

+0

@Nawaz: Я пробовал это, но qInstallMsgHandler() не работает, он показывает, что он не существует. – CowboY

+0

затем попробуйте 'qInstallMessageHandler()', как я уже сказал, [API был изменен с Qt 5.0] (http://qt-project.org/doc/qt-5.0/qtcore/qtglobal.html#qInstallMsgHandler). – Nawaz

ответ

1

Одним быстрым и простым подходом было бы подключение вывода вашего программного обеспечения к файлу.

Для более сложного подхода я предлагаю рассмотреть log4cplus (http://sourceforge.net/p/log4cplus/wiki/Home/) - я не знаю log4Qt, но я предполагаю, что он может иметь похожий интерфейс.

Log4Cplus позволяет создавать различные каналы/приоритеты для ваших журналов, поэтому вы также можете фильтровать выходные данные с точки зрения важности, что может быть интересно в зависимости от размера вашего проекта.

2

Установите обработчик сообщений Qt.

FILE *fd; 

void myMessageOutput(QtMsgType type, const char *msg) 
{ 
    QString timeStamp = QTime::currentTime().toString("hh:mm:ss:zzz"); 
    switch (type) { 
    case QtDebugMsg: 
     fprintf(fd, "[%s]", timeStamp.toStdString().c_str()); 
     fprintf(fd, "[Debug] %s\n", msg); 
     break; 
    case QtWarningMsg: 
     fprintf(fd, "[%s]", timeStamp.toStdString().c_str()); 
     fprintf(fd, "[Warning] %s\n", msg); 
     break; 
    case QtCriticalMsg: 
     fprintf(fd, "[%s]", timeStamp.toStdString().c_str()); 
     fprintf(fd, "[Critical] %s\n", msg); 
     break; 
    case QtFatalMsg: 
     fprintf(fd, "[%s]", timeStamp.toStdString().c_str()); 
     fprintf(fd, "[Fatal] %s\n", msg); 
     abort(); 
    } 
} 

int main(int argc, char **argv) 
{ 
    fd = fopen("log.txt", "a"); 
    qInstallMsgHandler(myMessageOutput); 
    QApplication app(argc, argv); 
    ... 
    return app.exec(); 
} 
+0

Будет ли он печатать все сообщения на терминале, будь то предупреждение, сообщения об ошибках и т. д. Я имею в виду, что эти типы сообщений все сообщения, появляющиеся на CMD, терминал? – CowboY

+1

Да. В Qt есть четыре уровня отладки. Для записи предупреждающего сообщения и отладочного сообщения используются четыре глобальных функции. Это 'qDebug()', 'qWarning()', 'qCritical()' и 'qFatal()'. –

+0

Я использовал его, как вы сказали, как я использую Qt5, поэтому нужно заменить qInstallMessageHandler(), но он показывает ошибку следующим образом: неверное преобразование из 'void (*) (QtMsgType, const char *)' в 'QtMessageHandler {aka void (*) (QtMsgType, const QMessageLogContext &, const QString &)} '[-fpermissive] – CowboY

Смежные вопросы