如何在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库?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Qt中配置OpenGL

C++学习(四七九)qt如何使用系统opengl库

Qt (Creator) 与 WinSocks (ws2_32)

如何在 Qt 应用程序中使用 MFC dll

与 Qt 项目的静态链接

如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?