2017-09-20 2 views
-1

내 응용 프로그램에서 syslog.h을 사용하여 시스템 로거를 만들고 싶습니다. 그 라이브러리를 사용하여 생성하는 방법을 모르겠고이 링크 https://github.com/asankah/syslog-win32에서 syslog를 다운로드했지만 어떻게 작동하는지 모르겠습니다. syslog 사용 방법에 관한 관련 주제를 검색했지만 Linux OS에 대한 많은 주제를 보았지만 시도했지만 작동하지 않습니다. Windows OS에서이 syslog를 생성하고 개발 한 응용 프로그램에 적용하려고했습니다.qt에서 Syslog-Win32 라이브러리를 사용하는 방법은 무엇입니까?

#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(); 
} 

다음 오류가 발생합니다 :

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

오류 : LNK2019 : 확인되지 않은 외부 기호가

에게 내가 모르는

주요 기능에서 참조 init_syslog 나는이 구문을 사용

무슨 문제 야.

+0

왜 직접 하시겠습니까? Qt는 이미 필요에 따라 사용자 정의 할 수있는 로깅 기능을 갖추고 있습니다. 도움이 될 것입니다. https://stackoverflow.com/questions/4954140/how-to-redirect-qdebug-qwarning-qcritical-etc-output – Azeem

+0

내 게시물을 업데이트했습니다. 그 라이브러리를 사용하여 다른 Qt 기능보다 훨씬 빠르게 테스트하는 방법을 알아야합니다. 왜냐하면 내가 개발 한 응용 프로그램에서 다른 Qt 로깅 기능을 사용할 때 디버깅 프로세스가 느려지 기 때문입니다. –

+0

사용하는 "시설"에 대해 좀 더 구체적으로 설명해 주실 수 있습니까? 그리고 어떤 종류의 천천히 직면하고 있습니까? 코드도 게시하십시오. – Azeem

답변

0

이 함수는 char *, 즉 수정 가능한 문자열을 필요로합니다. 수정할 수없는 문자열 리터럴 (유형 const char[] 또는 const char *)을 제공하고 있습니다.

이것은 링크 된 라이브러리의 디자인 결함처럼 보입니다. syslogc.c에 따르면이 값은 syslog()vsyslog() 함수를 통해 올바르게 const char *format을 예상하는 시스템 함수 vsprintf_s()으로 전달됩니다.

임시 해결책으로, 당신은 수정 가능한 문자열을 만들 수 있고 syslog()에 전달 : 영구적 인 해결책이 라이브러리를 분기 매개 변수 유형을 수정하고 선택적으로 끌어 오기 요청을 만들 것

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

.

+0

실제로는 'pull request'입니다. – Azeem

+0

@Azeem 감사합니다. – Melebius

+0

임시 해결책을 시도해 보겠습니다 :'char fmt [] = { "Debug : % s", "Info : % s", "Warning : % s", "Critical : % s", "Fatal % s"}; 'void syslog (int, char *, ...) ': 인수 2를'char '에서 변환 할 수 없습니다. to 'char *' ' init_syslog()는 qInstallMessageHandler()처럼 main 함수에서 호출 할 수 있습니까? 그리고 내 프로젝트에서 기존 라이브러리를 포크하는 방법을 모르겠습니다. 이견있는 사람? –

관련 문제