Qtをメインに、プログラムやITに関する情報を発信

Qtの戯言

デバッグ

Log4Qtの使用方法

更新日:

Javaでよく使われるロギングユーティリティに「Log4J」がありますが、そのQt版にあたる「Log4Qt」の使用方法のメモ。

 

概要

オリジナルのプロジェクトはここのようですが、長らく更新されておらず、今はこちらで開発が続けられています。
ライセンスは Apache License 2, Version 2.0 となっており、改変、再頒布などに制限はありません。

 

ダウンロード&コンパイル

gitを使用されている方は、以下コマンドにて取得しましょう。

git clone https://github.com/MEONMedical/Log4Qt.git

 

使用していない方は、ブラウザからZIPでダウンロードすることも可能です。
リンク先の「Clone or download ▼」と書かれたボタンをクリックし、「Download ZIP」を選択すればOK。

 

展開した中にある「log4qt.pro」をダブルクリックし、Qt Creatorでコンパイルします。
「Configure Project」画面で使用するコンパイラにチェックが入っていることを確認し(ここではMSVC2017 64bit)、「Configure Project」ボタンをクリック。

 

メニュー → 「ビルド」 → 「qmakeの実行」よりqmakeを実行し、左下の金槌アイコンにてビルドを実施。

 

ビルドが完了すると、binフォルダ内にdllとlibファイルが生成されます。

 

プロジェクトで利用する

.proファイルにライブラリを追加する

.proファイルに以下を追記。

LIBS += -L$$PWD -llog4qt

 

ヘッダファイルをコピーまたはパスを通す

Log4Qt-master\src\log4qt を全てプロジェクトフォルダ内にコピーするか、または.proファイルにインクルードパスを追加します。
後者の場合は、.proファイルに以下を追記。

INCLUDEPATH += [log4qtのパス]/log4qt

 

main.cppファイルに、前処理・後処理を実装

#include "widget.h"
#include <QApplication>

#include "log4qt/logger.h"
#include "log4qt/loggerrepository.h"
#include "log4qt/propertyconfigurator.h"

int main(int argc, char *argv[])
{
    Log4Qt::PropertyConfigurator::configureAndWatch("./testLog4Qt.exe.log4qt.properties");

    QApplication a(argc, argv);
    Widget w;
    w.show();

    int ret = a.exec();

    auto logger = Log4Qt::Logger::rootLogger();
    logger->removeAllAppenders();
    logger->loggerRepository()->shutdown();

    return ret;
}

10行目で指定しているファイルは、ログの設定ファイルで、ここにログの出力先フォルダ名やファイル名、出力するログの内容、ローテーションの設定などを記載します。

設定ファイルの作成

基本はlog4jと同じ書き方でOK。
このあたりに詳しく載ってるかも。

サンプルでは、以下の内容を出力しています。
・ログフォルダ名:log
・ログファイル名:testLog4Qt.log
・出力先:コンソール、ファイル
・ファイルの最大サイズ:10MB
・ファイルの最大ローテーション数:10ファイル
・ログ出力内容:年/月/日/ 時:分:秒.ミリ秒、ログレベル、ファイル名・行番号・関数名、スレッドID、ログメッセージ、改行

logpath=log

log4j.reset=true
log4j.handleQtMessages=true
log4j.watchThisFile=false

log4j.rootLogger=ALL, console, rolling

log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=STDOUT_TARGET
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yyyy/MM/dd hh:mm:ss.zzz} %p [%l][%t] - %m%n

log4j.appender.rolling=org.apache.log4j.RollingFileAppender
log4j.appender.rolling.file=${logpath}/testLog4Qt.log
log4j.appender.rolling.MaxFileSize=10MB
log4j.appender.rolling.MaxBackupIndex=10
log4j.appender.rolling.layout=${log4j.appender.console.layout}
log4j.appender.rolling.layout.ConversionPattern=${log4j.appender.console.layout.ConversionPattern}

 

使用してみる

設定ファイル4行目の「log4j.handleQtMessages」をtrueにすることで、Qt標準のqDebug()関数等の出力をLog4Qtで横取りできるので、既に本関数を使用しているコードを書き替える必要はありません。

なお、使用する側のプロジェクトをデバッグでビルドする場合、Log4Qtもデバッグでビルドしたdllやlibを使用して下さい。
(使用する側をリリースビルドする場合、Log4Qtもリリースビルド)

#include <QtDebug>
#include "widget.h"
#include "ui_widget.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    qDebug()    << "debug";
    qInfo()     << "info";
    qWarning()  << "warning";
    qCritical() << "critical";
}

Widget::~Widget()
{
    delete ui;
}

 

2019/01/30 23:39:12.183 DEBUG [widget.cpp:11 - __cdecl Widget::Widget(class QWidget *)][0x00000030b7575a80] - debug
2019/01/30 23:39:12.183 INFO [widget.cpp:12 - __cdecl Widget::Widget(class QWidget *)][0x00000030b7575a80] - info
2019/01/30 23:39:12.184 WARN [widget.cpp:13 - __cdecl Widget::Widget(class QWidget *)][0x00000030b7575a80] - warning
2019/01/30 23:39:12.184 ERROR [widget.cpp:14 - __cdecl Widget::Widget(class QWidget *)][0x00000030b7575a80] - critical

 

-デバッグ
-, ,

Copyright© Qtの戯言 , 2020 All Rights Reserved Powered by STINGER.