土曜日, 3月 11, 2017

Java でログを出力:slf4j+logger

Jar 実行形式ファイルではコンソール入出力が使えません。コンソールが使えずともファイルを使う便利な方法があります。ロガーを使う方法です。

そうでなくともログは重要です。デバッグでなくともアプリのトレースが必要な場合は多いです。

Java でログを出力するための便利なライブラリは多種さまざまありますが、そのなかでも slf4j+logger なる方法が便利です。static で Logger を定義できて、出力形式を XML で指定できます。

必要な jar ファイルは以下の通りです[*]。

logback-classic-1.2.1.jar
logback-core-1.2.1.jar
slf4j-api-1.7.24.jar

必要最小限なコードを示します。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LogTest {
public static void main(String[] args) {
Logger log = LoggerFactory.getLogger(LogTest.class);
log.info("LogTest running ...");
}
}
view raw LogTest.java hosted with ❤ by GitHub

出力用のログファイルの設定は logback.xml で。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
<timestamp key="time" datePattern="yyyy-MM-dd_HHmmss" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log/SCDFgen-${time}.log</file>
<encoder>
<charset>UTF-8</charset>
<pattern>%m%n</pattern>
</encoder>
</appender>
<root>
<appender-ref ref="FILE" />
</root>
</configuration>
view raw logback.xml hosted with ❤ by GitHub

こいつは奥が深いです。ライブラリのソースの規模を見ると圧倒されます。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE logback>
<configuration>
<timestamp key="time" datePattern="yyyy-MM-dd_HHmmss" />
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
<file>log/WavSplit-${time}.log</file>
<encoder>
<charset>UTF-8</charset>
<pattern>%m%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%-7([%level]) %m%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<root>
<appender-ref ref="STDOUT" />
</root>
</configuration>

ログのレベルは error>warn>info>debug>trace などあります。デフォルトではファイル出力はすべて、標準出力はデバッグレベルまで。レベルごと分けておくと便利です。

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...