如何在qt中使用Syslog-Win32库?
Posted
技术标签:
【中文标题】如何在qt中使用Syslog-Win32库?【英文标题】:How to use the Syslog-Win32 Library in qt? 【发布时间】:2017-09-20 02:57:49 【问题描述】:我只想在我的应用程序中使用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
我不知道是什么问题。
【问题讨论】:
为什么你自己想要它? Qt 已经拥有可以根据您的需要定制的日志记录工具。这可能会对您有所帮助:***.com/questions/4954140/… 我更新了我的帖子。我需要知道如何使用该库来测试它是否比其他 qt 工具快得多。因为在我开发的应用程序中,当我使用其他 qt 日志工具时,调试过程会变慢。 您能更具体地了解您使用的“设施”吗?而且,你正面临什么样的缓慢?也发布您的代码。void syslog( int pri, char* fmt, ... )' is
fmt` 的第二个参数需要像printf
函数一样的格式。您需要在此处提供%s
,即syslog(LOG_DEBUG, "Debug: %s", localMsg.constData());
。
【参考方案1】:
该函数需要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());
永久的解决方案是分叉库、更正参数类型并可选择创建拉取请求。
【讨论】:
其实是pull request
。
我尝试了临时解决方案:char fmt[] = "Debug: %s", "Info: %s", "Warning: %s", "Critical: %s", "Fatal %s"; syslog(LOG_DEBUG, fmt[0], localMsg.constData());
但结果是这样的:void syslog(int,char *,...)': cannot convert argument 2 from 'char' to 'char *'
init_syslog() 是否可以像 qInstallMessageHandler() 一样在 main 函数中调用?而且我不知道如何在我的项目中分叉现有的库。有什么想法吗?
@EruEl 我建议的 char 数组类型 (char fmt[]
) 与您的 string 数组不同。字符串数组是二维字符数组,所以使用char fmt[][]
。
但我改变了它,同样的错误发生了。当我使用init_syslog("localhost")
时,也会出现此错误消息。 unresolved external symbol init_syslog referenced in function main
会有什么问题?
@EruEl 完全一样的错误,一个接一个的字母?什么代码?我注意到您已在问题中更新了之前的变体,但尚未更正字符串数组问题。 “未解决的外部符号”是一个完全不同的问题,Stack Overflow 已经有了a plenty of these questions。请先搜索它们,不要将两个问题混在一个问题中。以上是关于如何在qt中使用Syslog-Win32库?的主要内容,如果未能解决你的问题,请参考以下文章