2017-09-20 1 views
-1

Ich möchte nur eine System-Logger mit syslog.h in meiner Anwendung erstellen. Ich weiß nicht, wie man beginnt, mit dieser Bibliothek zu erstellen, und ich habe das Syslog in diesem Link https://github.com/asankah/syslog-win32 heruntergeladen, aber ich weiß nicht, wie es funktioniert. Ich suchte verwandte Themen darüber, wie man Syslog verwendet, aber ich sah viele Themen auf Linux OS, ich versuche es, aber es funktioniert nicht. Ich zielte darauf ab, dieses Syslog in Windows OS zu erstellen und es in meiner Anwendung, die ich entwickelte, anzuwenden.Wie wird die Syslog-Win32-Bibliothek in qt verwendet?

Wenn ich diese Syntax verwendet:

#include "mainwindow.h" 
#include <QApplication> 
#include <syslog.h> 
#include<stdio.h> 
#include<stdlib.h> 
#include<stdarg.h> 
#include <QString> 
#include <QByteArray> 
#include<QtCore/QtGlobal> 
#include <QFile> 
#include <QTextStream> 
#pragma comment(lib,"Ws2_32.lib") 
void SyslogMessageHandler(QtMsgType type, const QMessageLogContext &context, const QString &msg) 
{ 
    QByteArray localMsg = msg.toLocal8Bit(); 
    QString Stype; 
    char fmt[] = {"Debug: %s", "Info: %s", "Warning: %s", "Critical: %s", "Fatal %s"}; 
     switch (type) { 
     case QtDebugMsg: 
      syslog(LOG_DEBUG, fmt[0], localMsg.constData()); 
      break; 
     case QtInfoMsg: 
      syslog(LOG_INFO, fmt[1], localMsg.constData()); 
      break; 
     case QtWarningMsg: 
      syslog(LOG_WARNING, fmt[2], localMsg.constData()); 
      break; 
     case QtCriticalMsg: 
      syslog(LOG_CRIT, fmt[3], localMsg.constData()); 
      break; 
     case QtFatalMsg: 
      syslog(LOG_ALERT, fmt[4], localMsg.constData()); 
      abort(); 
      break; 
     } 
     QFile outFile("Log.txt"); 
     outFile.open(QIODevice::WriteOnly | QIODevice::Append /*|QIODevice::Truncate*/); 
     QTextStream ts(&outFile); 
     QString log = QString("%1: %2 \n").arg(Stype).arg(msg).arg(context.file).arg(context.line).arg(context.function); 
     QByteArray logMsg = log.toLocal8Bit(); 
     ts << logMsg << endl; 
     outFile.close(); 

} 

int main(int argc, char *argv[]) 
{ 
    init_syslog("localhost"); 
    qInstallMessageHandler(SyslogMessageHandler); 
    QApplication a(argc, argv); 
    MainWindow w; 


    w.show(); 

    return a.exec(); 
} 

Der folgende Fehler tritt auf:

void syslog(int,char *,...)': cannot convert argument 2 from const char [7]' to 'char * 

Fehler: LNK2019: nicht aufgelöstes externes Symbol in Funktion verweist init_syslog Haupt

Ich weiß nicht, Was das Problem ist.

+0

Warum willst du es selbst? Qt verfügt bereits über Protokollierungsfunktionen, die Ihren Anforderungen entsprechend angepasst werden können. Dies könnte Ihnen helfen: https://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output – Azeem

+0

Ich habe meinen Beitrag aktualisiert. Ich muss wissen, wie man diese Bibliothek verwendet, um zu testen, ob es viel schneller ist als in anderen qt-Einrichtungen. weil in der Anwendung, die ich entwickelte, der Debugging-Prozess langsam ging, wenn ich die andere qt Protokollierungseinrichtung verwendete. –

+0

Können Sie etwas genauer über die "Einrichtungen" sein, die Sie verwenden? Und welche Art von Langsamkeit hast du vor? Sende deinen Code auch. – Azeem

Antwort

0

Die Funktion erwartet char *, d. H. Eine änderbare Zeichenkette. Sie stellen ein nicht änderbares String-Literal zur Verfügung (Typ const char[] oder const char *).

Das sieht wie ein Designfehler in der verbundenen Bibliothek aus. Gemäß syslogc.c wird der Wert über die Funktionen syslog() und vsyslog() an die Systemfunktion vsprintf_s() übergeben, die korrekt const char *format erwartet.

Als temporäre Lösung, könnten Sie eine veränderbare Zeichenfolge erstellen und übergeben es an syslog():

char fmt[] = "Debug: %s"; // added %s to make it a usable format string 
syslog(LOG_DEBUG, fmt, localMsg.constData()); 

Eine dauerhafte Lösung würde die Bibliothek werden Forking, die Korrektur der Parametertypen und optional eine Pull-Anforderung zu erstellen.

+0

Es ist 'Pull Request', eigentlich. – Azeem

+0

@Azeem Danke, korrigiert. – Melebius

+0

Ich versuche die temporäre Lösung: 'char fmt [] = {" Debug:% s "," Info:% s "," Warnung:% s "," Kritisch:% s "," Fatal% s "}; syslog (LOG_DEBUG, fmt [0], localMsg.constData()); ' aber das Ergebnis ist wie folgt: ' void syslog (int, char *, ...) ': Argument 2 kann nicht von' char 'konvertiert werden zu 'char *' ' Kann der init_syslog() in der Hauptfunktion wie qInstallMessageHandler() aufgerufen werden? Und ich weiß nicht, wie Sie die vorhandene Bibliothek in meinem Projekt verzweigen. Irgendwelche Gedanken? –

Verwandte Themen