我只想在我的应用程序中使用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我不知道问题所在。
答案 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());
永久解决方案是分支库,更正参数类型并选择性地创建拉取请求。