2017-09-20 13 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

実際には 'プルリクエスト'です。 – Azeem

+0

@Azeemありがとうございました。 – Melebius

+0

私は一時的な解決策を試みます: 'char fmt [] = {"デバッグ:%s "、"情報:%s "、"警告:%s "、"クリティカル:%s "、"致命的な%s "}; 'void syslog(int、char *、...) ':引数2を' char 'から' char 'に変換できません。 to 'char *' ' init_syslog()はqInstallMessageHandler()のようにメイン関数で呼び出すことができますか? 私のプロジェクトで既存のライブラリをどのようにフォークするのか分かりません。何かご意見は? –

関連する問題