如何在qt中使用Syslog-Win32库?

时间:2017-09-20 02:57:49

标签: c++ qt syslog

我只想在我的应用程序中使用syslog.h创建一个系统记录器。我不知道如何开始使用该库创建,我在此链接https://github.com/asankah/syslog-win32下载了系统日志,但我不知道它是如何工作的。我搜索了有关如何使用syslog的相关主题,但我在linux OS上看到了很多主题,我试了但是它没有用。我的目标是在Windows操作系统中创建这个系统日志,并将其应用到我开发的应用程序中。

当我使用这种语法时:

#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:函数main

中引用的未解析的外部符号init_syslog

我不知道问题所在。

1 个答案:

答案 0 :(得分:0)

该函数需要char *,即可修改的字符串。您正在提供不可修改的字符串文字(类型const char[]const char *)。

这看起来像链接库中的设计缺陷。根据{{​​3}},值会通过函数syslog()vsyslog()传递给正确期望const char *format的系统函数syslogc.c

作为临时解决方案,您可以创建可修改的字符串并将其传递给syslog()

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

永久解决方案是分支库,更正参数类型并选择性地创建拉取请求。