Javaロギングの概要
1. 概要
ロギングは、プログラムの実行時の動作を理解およびデバッグするための強力な支援です。 ログは重要なデータをキャプチャして保持し、いつでも分析できるようにします。
この記事では、最も人気のあるJavaロギングフレームワークであるLog4j 2とLogback、およびそれらの前身であるLog4jについて説明し、さまざまなロギングフレームワークに共通のインターフェースを提供するロギングファサードであるSLF4Jについて簡単に触れます。
2. ロギングの有効化
この記事で説明したすべてのロギングフレームワークは、ロガー、アペンダー、レイアウトの概念を共有しています。 プロジェクト内でログを有効にするには、次の3つの一般的な手順に従います。
-
必要なライブラリを追加する
-
設定
-
ログステートメントの配置
次のセクションでは、各フレームワークの手順について個別に説明します。
3. Log4j 2
Log4j 2は、Log4jロギングフレームワークの新しい改良バージョンです。 最も魅力的な改善点は、非同期ロギングの可能性です。 Log4j 2には次のライブラリが必要です。
org.apache.logging.log4j
log4j-api
2.6.1
org.apache.logging.log4j
log4j-core
2.6.1
3.1. 設定
Log4j 2の構成は、メイン構成log4j.xmlファイルに基づいています。 最初に設定するのはアペンダーです。
これらは、ログメッセージがルーティングされる場所を決定します。 宛先は、コンソール、ファイル、ソケットなどです。
Log4j 2には、さまざまな目的のための多くのアペンダーがあります。詳細については、公式のLog4j 2サイトを参照してください。
簡単な設定例を見てみましょう:
各アペンダーに名前を設定できます。たとえば、stdoutの代わりに名前consoleを使用します。
PatternLayout要素に注意してください。これにより、メッセージがどのように表示されるかが決まります。 この例では、パターンはpatternパラメータに基づいて設定されます。ここで、%dは日付パターンを決定し、%p –ログレベルの出力、%m –ログメッセージの出力および%n –新しい線記号を追加します。 パターンの詳細については、公式のLog4j 2ページをご覧ください。
最後に–to enable an appender(または複数)を<Root>セクションに追加する必要があります。
3.2. ファイルへのロギング
ファイルへのロギングを使用する必要がある場合があるため、構成にfoutロガーを追加します。
%d{yyyy-MM-dd HH:mm:ss} %-5p %m%nw
Fileアペンダーには、構成可能ないくつかのパラメーターがあります。
-
file –ログファイルのファイル名を決定します
-
append –このパラメーターのデフォルト値はtrueです。つまり、デフォルトでは、Fileアペンダーは既存のファイルに追加され、切り捨てられません。
-
前の例で説明したPatternLayout。
Fileアペンダーを有効にするには、<Root>セクションに追加する必要があります。
3.3. 非同期ロギング
Log4j 2を非同期にしたい場合は、LMAXディスラプターライブラリをpom.xmlに追加する必要があります。 LMAXディスラプターは、ロックフリーのスレッド間通信ライブラリです。
中断をpom.xmlに追加する:
com.lmax
disruptor
3.3.4
ディスラプターの最新バージョンはhereで見つけることができます。
LMAXディスラプターを使用する場合は、構成で<Root>の代わりに<asyncRoot>を使用する必要があります。
または、システムプロパティLog4jContextSelectorをorg.apache.logging.log4j.core.async.AsyncLoggerContextSelectorに設定して、非同期ロギングを有効にすることもできます。
もちろん、Log4j2非同期ロガーの構成の詳細を読んだり、Log4j2 official pageのパフォーマンス図を確認したりできます。
3.4. 使用法
以下は、ロギングにLog4jを使用することを示す簡単な例です。
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Log4jExample {
private static Logger logger = LogManager.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
}
}
実行後、アプリケーションは次のメッセージをコンソールとexample.log:という名前のファイルの両方に記録します。
2016-06-16 17:02:13 INFO Info log message
2016-06-16 17:02:13 ERROR Error log message
ルートログレベルをERRORに上げる場合:
出力は次のようになります。
2016-06-16 17:02:13 ERROR Error log message
ご覧のとおり、ログレベルを上限のパラメーターに変更すると、ログレベルの低いメッセージがアペンダーに出力されなくなります。
メソッドlogger.errorを使用して、発生した例外をログに記録することもできます。
try {
// Here some exception can be thrown
} catch (Exception e) {
logger.error("Error log message", throwable);
}
3.5. パッケージレベルの構成
たとえば、com.example.log4j2などの特定のパッケージからのログレベルTRACEでメッセージを表示する必要があるとします。
logger.trace("Trace log message");
他のすべてのパッケージでは、INFOメッセージのみのログ記録を継続します。
TRACEは、構成で指定したルートログレベルINFOよりも低いことに注意してください。
いずれかのパッケージのログのみを有効にするには、<Root>の前に次のセクションをlog4j.xmlに追加する必要があります。
com.example.log4jパッケージのログが有効になり、出力は次のようになります。
2016-06-16 17:02:13 TRACE Trace log message
2016-06-16 17:02:13 DEBUG Debug log message
2016-06-16 17:02:13 INFO Info log message
2016-06-16 17:02:13 ERROR Error log message
4. ログバック
LogbackはLog4jを改良したバージョンであり、Log4jを作成した開発者と同じ開発者によって開発されました。
LogbackにはLog4jと比較してより多くの機能があり、それらの多くはLog4j 2にも導入されています。 official siteでのログバックのすべての利点を簡単に見てみましょう。
pom.xmlに次の依存関係を追加することから始めましょう。
ch.qos.logback
logback-classic
1.1.7
この依存関係は、別の2つの依存関係、logback-coreとslf4j-apiを推移的にプルします。 Logbackの最新バージョンはhereにあることに注意してください。
4.1. 設定
次に、ログバック構成の例を見てみましょう。
# Console appender
# Pattern of log message for console appender
%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
# File appender
example.log
false
# Pattern of log message for file appender
%d{yyyy-MM-dd HH:mm:ss} %-5p %m%n
# Override log level for specified package
ログバックはSLF4Jをインターフェースとして使用するため、SLF4JのLoggerとLoggerFactory.をインポートする必要があります
4.2. SLF4J
SLF4Jは、ほとんどのJavaロギングフレームワークに共通のインターフェースと抽象化を提供します。 ファサードとして機能し、ロギングフレームワークの基本機能にアクセスするための標準化されたAPIを提供します。
Logbackは、その機能のネイティブAPIとしてSLF4Jを使用します。 以下は、Logbackロギングを使用した例です。
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Log4jExample {
private static Logger logger = LoggerFactory.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
}
}
出力は、前の例と同じままです。
5. Log4J
最後に、由緒あるLog4jロギングフレームワークを見てみましょう。
この時点ではもちろん時代遅れですが、より現代的な後継者の基盤を築くため、議論する価値があります。
構成の詳細の多くは、Log4j 2セクションで説明したものと一致します。
5.1. 設定
まず、プロジェクトにLog4jライブラリを追加する必要がありますpom.xml:
log4j
log4j
1.2.17
HereLog4jの最新バージョンを見つけることができるはずです。
コンソールアペンダーが1つしかない単純なLog4j構成の完全な例を見てみましょう。
<log4j:configuration debug=”false”>は、構成全体のオープンタグであり、debugという1つのプロパティがあります。 Log4jデバッグ情報をログに追加するかどうかを決定します。
5.2. 使用法
Log4jライブラリと構成を追加したら、コードでロガーを使用できます。 簡単な例を見てみましょう。
import org.apache.log4j.Logger;
public class Log4jExample {
private static Logger logger = Logger.getLogger(Log4jExample.class);
public static void main(String[] args) {
logger.debug("Debug log message");
logger.info("Info log message");
logger.error("Error log message");
}
}
6. 結論
この記事では、Log4j、Log4j2、Logbackなどのさまざまなロギングフレームワークの使用方法の非常に簡単な例を示します。 上記のすべてのフレームワークの簡単な構成例をカバーしています。
記事に付随する例はover on GitHub.で見つけることができます