SLF4J-クイックガイド

SLF4Jはの略です S実装 Lロギング Fアカデミー Jエイバ。これは、Javaのすべてのロギングフレームワークの単純な抽象化を提供します。したがって、ユーザーはLog4j、Logback、およびLogbackなどのロギングフレームワークのいずれかを操作できます。JUL(java.util.logging)単一の依存関係を使用します。実行時/デプロイメント時に必要なロギングフレームワークに移行できます。

CekiGülcüは、JakartaCommonsロギングフレームワークの代替としてSLF4Jを作成しました。

SLF4Jの利点

SLF4Jの利点は次のとおりです。

  • SLF4Jフレームワークを使用すると、デプロイメント時に目的のロギングフレームワークに移行できます。

  • Slf4Jは、log4j、JUL、Simple logging、NOPなどの一般的なすべてのロギングフレームワークへのバインディングを提供します。したがって、展開時にこれらの一般的なフレームワークのいずれかに切り替えることができます。

  • SLF4Jは、使用するバインディングに関係なく、パラメーター化されたログメッセージをサポートします。

  • SLF4Jはアプリケーションとロギングフレームワークを分離しているため、ロギングフレームワークから独立したアプリケーションを簡単に作成できます。アプリケーションの作成に使用されているロギングフレームワークについて気にする必要はありません。

  • SLF4Jは、migratorと呼ばれる単純なJavaツールを提供します。このツールを使用すると、Jakarta Commons Logging(JCL)、log4j、またはJava.util.logging(JUL)のようなロギングフレームを使用する既存のプロジェクトをSLF4Jに移行できます。

プログラミングへのログインとは、アクティビティ/イベントの記録を指します。通常、アプリケーション開発者はロギングを処理する必要があります。

ロギングの仕事を簡単にするために、Javaはさまざまなフレームワーク(log4J、java.util.logging(JUL)、小さなログ、ログバックなど)を提供します。

ロギングフレームワークの概要

ロギングフレームワークには通常、3つの要素が含まれています-

ロガー

メタデータとともにメッセージをキャプチャします。

フォーマッター

ロガーによってキャプチャされたメッセージをフォーマットします。

ハンドラ

ハンドラーまたはアペンダーは、コンソールに印刷するか、データベースに保存するか、電子メールで送信することにより、最終的にメッセージをディスパッチします。

一部のフレームワークは、ロガー要素とアペンダー要素を組み合わせて操作を高速化します。

ロガーオブジェクト

メッセージをログに記録するために、アプリケーションは名前とセキュリティレベルを含むロガーオブジェクトを(場合によっては例外とともに)送信します。

重大度レベル

ログに記録されるメッセージはさまざまなレベルになります。次の表に、ロギングの一般的なレベルを示します。

シニア番号 重大度と説明
1

Fatal

アプリケーションを終了させる重大な問題。

2

ERROR

ランタイムエラー。

3

WARNING

ほとんどの場合、エラーは非推奨のAPIの使用が原因です。

4

INFO

実行時に発生するイベント。

5

DEBUG

システムの流れに関する情報。

6

TRACE

システムのフローに関するより詳細な情報。

log4jとは何ですか?

log4jは、信頼性が高く、高速で、柔軟性があります logging framework (APIs) written in Java、Apacheソフトウェアライセンスの下で配布されます。

log4jは、実行時に外部構成ファイルを介して高度に構成可能です。優先度のレベルの観点からロギングプロセスを表示し、データベース、ファイル、コンソール、UNIX Syslogなどのさまざまな宛先にロギング情報を送信するメカニズムを提供します(log4jの詳細については、チュートリアルを参照してください)。

SLF4JとLog4jの比較

log4jとは異なり、SLF4J(S実装 Lロギング Fアカデミー Java)はロギングフレームワークの実装ではなく、 abstraction for all those logging frameworks in Java similar to log4J。したがって、両方を比較することはできません。ただし、2つのうち1つを優先することは常に困難です。

選択肢がある場合は、ロギングフレームワークよりもロギングの抽象化の方が常に望ましいです。ロギング抽象化、特にSLF4Jを使用する場合、単一の依存関係を選択することなく、デプロイメント時に必要な任意のロギングフレームワークに移行できます。

理解を深めるために、次の図を参照してください。

この章では、EclipseIDEでSLF4J環境を設定する方法について説明します。インストールを続行する前に、システムにEclipseがすでにインストールされていることを確認してください。そうでない場合は、Eclipseをダウンロードしてインストールします。

Eclipseの詳細については、Eclipseチュートリアルを参照してください。

ステップ1:依存関係JARファイルをダウンロードする

SLF4J Webサイトの公式ホームページを開き、ダウンロードページに移動します。

今、の最新の安定バージョンをダウンロードしてください slf4j-X.X.tar.gzまたはslf4j-XXzip、オペレーティングシステムに応じて(windows.zipファイルまたはLinuxtar.gzファイルの場合)。

ダウンロードしたフォルダー内に、slf4j-api-XXjarがあります。これは必須のJarファイルです。

ステップ2:プロジェクトを作成し、ビルドパスを設定します

Eclipseを開き、サンプルプロジェクトを作成します。プロジェクトを右クリックし、オプションを選択しますBuild Path → Configure Build Path… 以下に示すように。

の中に Java Build Path のフレーム Libraries タブをクリックします Add External JARs…

を選択 slf4j-api.x.x.jar ダウンロードしたファイルをクリックします Apply and Close

SLF4Jバインディング

に加えて slf4j-api.x.x.jar ファイル、 SLF4J以下に示すように、他のいくつかのJarファイルを提供します。これらは呼ばれますSLF4J bindings

各バインディングは、それぞれのロギングフレームワーク用です。

次の表に、SLF4Jバインディングとそれに対応するフレームワークを示します。

シニア番号 JARファイルとロギングフレームワーク
1

slf4j-nop-x.x.jar

操作はありません。すべてのログを破棄します。

2

slf4j-simple-x.x.jar

info以上のメッセージが出力され、すべての出力がSystem.errに残る単純な実装。

3

slf4j-jcl-x.x.jar

Jakarta CommonsLoggingフレームワーク。

4

slf4j-jdk14-x.x.jar

Java.util.loggingフレームワーク(JUL)。

5

slf4j-log4j12-x.x.jar

Log4Jフレームワーク。さらに、あなたは持っている必要がありますlog4j.jar

SLF4Jをslf4l-api-xxjarと一緒に機能させるには、プロジェクトのクラスパス(ビルドパスの設定)に目的のロガーフレームワークのそれぞれのJarファイル(バインディング)を追加する必要があります。

あるフレームワークから別のフレームワークに切り替えるには、それぞれのバインディングを置き換える必要があります。境界が見つからない場合は、デフォルトで無操作モードになります。

SLF4JのPom.xml

Mavenプロジェクトを作成している場合は、 pom.xml 次のコンテンツを貼り付けて、プロジェクトを更新します。

<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   
   <modelVersion>4.0.0</modelVersion>
   <groupId>Sample</groupId>
   <artifactId>Sample</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <build>
      <sourceDirectory>src</sourceDirectory>
      <plugins>
         <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
               <source>1.8</source>
               <target>1.8</target>
            </configuration>
         </plugin>
      </plugins>
   </build>
   <dependencies>
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>1.7.25</version>
      </dependency>
   </dependencies>
</project>

この章では、このチュートリアルの後続の章で使用するクラスとメソッドについて説明します。

ロガーインターフェース

のロガーインターフェース org.slf4jパッケージは、SLF4JAPIのエントリポイントです。以下に、このインターフェイスの重要なメソッドを示します。

シニア番号 メソッドと説明
1

void debug(String msg)

このメソッドは、DEBUGレベルでメッセージをログに記録します。

2

void error(String msg)

このメソッドは、エラーレベルでメッセージをログに記録します。

3

void info(String msg)

このメソッドは、INFOレベルでメッセージをログに記録します。

4

void trace(String msg)

このメソッドは、TRACEレベルでメッセージをログに記録します。

5

void warn(String msg)

このメソッドは、WARNレベルでメッセージをログに記録します。

LoggerFactoryクラス

のLoggerFactoryクラス org.slf4j packageはユーティリティクラスであり、log4j、JUL、NOP、シンプルロガーなどのさまざまなロギングAPIのロガーを生成するために使用されます。

シニア番号 方法と説明
1

Logger getLogger(String name)

このメソッドは、名前を表す文字列値を受け入れ、 Logger 指定された名前のオブジェクト。

プロファイラークラス

このクラスはパッケージに属しています org.slf4jこれはプロファイリングの目的で使用され、貧乏人のプロファイラーとして知られています。これを使用して、プログラマーは長時間のタスクを実行するのにかかる時間を知ることができます。

このクラスの重要なメソッドは次のとおりです。

シニア番号 メソッドと説明
1

void start(String name)

このメソッドは、新しい子ストップウォッチ(名前付き)を開始し、以前の子ストップウォッチ(またはタイムインスツルメント)を停止します。

2

TimeInstrument stop()

このメソッドは、最近の子ストップウォッチとグローバルストップウォッチを停止し、現在のタイムインストルメントを返します。

3

void setLogger(Logger logger)

このメソッドは、ロガーオブジェクトを受け入れ、指定されたロガーを現在のプロファイラーに関連付けます。

4

void log()

ロガーに関連付けられている現在の時刻計の内容をログに記録します。

5

void print()

現在の時刻計の内容を印刷します。

この章では、SLF4Jを使用した簡単な基本的なロガープログラムを紹介します。簡単なロガーを作成するには、以下の手順に従ってください。

ステップ1-slf4j.Loggerインターフェースのオブジェクトを作成します

以来 slf4j.Logger はSLF4JAPIのエントリポイントです。まず、そのオブジェクトを取得/作成する必要があります

ザ・ getLogger() の方法 LoggerFactory クラスは名前を表す文字列値を受け入れ、 Logger 指定された名前のオブジェクト。

Logger logger = LoggerFactory.getLogger("SampleLogger");

ステップ2-必要なメッセージをログに記録する

ザ・ info() の方法 slf4j.Logger インターフェイスは、必要なメッセージを表す文字列値を受け入れ、情報レベルでログに記録します。

logger.info("Hi This is my first SLF4J program");

以下は、SLF4Jを使用してJavaでサンプルロガーを作成する方法を示すプログラムです。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
   public static void main(String[] args) {
      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger("SampleLogger");

      //Logging the information
      logger.info("Hi This is my first SLF4J program");
   }
}

出力

次のプログラムを最初に実行すると、目的のメッセージの代わりに次の出力が表示されます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.

このチュートリアルで前述したように、クラスパスをロギングフレームワークを表すバインディングに設定していないため、SLF4Jはデフォルトで操作なしの実装になりました。したがって、メッセージを表示するには、プロジェクトのクラスパスに目的のバインディングを追加する必要があります。Eclipseを使用しているので、build path それぞれのJARファイルに対して、またはその依存関係をpom.xmlファイルに追加します。

たとえば、JUL(Java.util.loggingフレームワーク)を使用する必要がある場合は、jarファイルのビルドパスを設定する必要があります。 slf4j-jdk14-x.x.jar。また、log4Jロギングフレームワークを使用する場合は、ビルドパスを設定するか、jarファイルの依存関係を追加する必要がありますslf4j-log4j12-x.x.jar そして log4j.jar

を除くロギングフレームワークのいずれかを表すバインディングを追加した後 slf4j-nopx.x.jar プロジェクト(クラスパス)に対して、次の出力が得られます。

Dec 06, 2018 5:29:44 PM SLF4JExample main
INFO: Hi Welcome to Tutorialspoint

この章では、SLF4Jの操作中に表示されるさまざまなエラーメッセージまたは警告と、それらのメッセージの原因/意味について説明します。

クラス「org.slf4j.impl.StaticLoggerBinder」のロードに失敗しました。

これは、クラスパスにSLF4Jバインディングが提供されていない場合に発生する警告です。

以下は完全な警告です-

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further
details.

これを解決するには、ロギングフレームワークバインディングのいずれかを追加する必要があります。これはで説明されていますHello world このチュートリアルの章。

Note −これは、1.6.0〜1.8.0-beta2のバージョンのSLF4Jで発生します。

SLF4Jプロバイダーが見つかりませんでした

slf4j-1.8.0-beta2では、上記の警告はより明確に言っています “No SLF4J providers were found”

以下は完全な警告です-

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.

クラスパスには、1.8より前のバージョンのslf4j-apiを対象とするSLF4Jバインディングが含まれています

SLF4J 1.8バージョンを使用していて、クラスパスに以前のバージョンのバインディングがあり、1.8のバインディングがない場合は、次のような警告が表示されます。

SLF4J: No SLF4J providers were found.
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#noProviders for further details.
SLF4J: Class path contains SLF4J bindings targeting slf4j-api versions prior to
1.8.
SLF4J: Ignoring binding found at
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#ignoredBindings for an explanation.

NoClassDefFoundError:org / apache / commons / logging / LogFactory

で作業している場合 slf4j-jcl そしてあなたが持っているだけなら slf4j-jcl.jar クラスパスでは、次のような例外が発生します。

Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/logging/LogFactory
   at org.slf4j.impl.JCLLoggerFactory.getLogger(JCLLoggerFactory.java:77)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:358)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.ClassNotFoundException:
org.apache.commons.logging.LogFactory
   at java.net.URLClassLoader.findClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
   at java.lang.ClassLoader.loadClass(Unknown Source)
   ... 3 more

これを解決するには、追加する必要があります commons-logging.jar クラスパスに。

クラスパスでjcl-over-slf4j.jarとバインドされたslf4j-jcl.jarの両方が検出されました。

バインディング slf4j-jcl.jar slf4jロガーの呼び出しをJCLおよび jcl-over-slf4j.jarJCLロガーの呼び出しをslf4jにリダイレクトします。したがって、プロジェクトのクラスパスに両方を含めることはできません。これを行うと、以下のような例外が発生します。

SLF4J: Detected both jcl-over-slf4j.jar AND bound slf4j-jcl.jar on the class
path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#jclDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:71)
   at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:42)
   at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
   at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
   at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both jcl-over-slf4j.jar
AND bound slf4j-jcl.jar on the class path, preempting StackOverflowError. See
also http://www.slf4j.org/codes.html#jclDelegationLoop for more details.
   at org.slf4j.impl.JCLLoggerFactory.<clinit>(JCLLoggerFactory.java:54)
   ... 7 more

これを解決するには、いずれかのjarファイルを削除します。

検出されたロガー名の不一致

次の方法でロガーオブジェクトを作成できます。

  • 引数として作成するロガーの名前を getLogger() 方法。

  • このメソッドへの引数としてクラスを渡す。

クラスを引数として渡してロガーファクトリオブジェクトを作成しようとしている場合、およびシステムプロパティを設定している場合 slf4j.detectLoggerNameMismatch trueの場合、引数として渡すクラスの名前 getLogger() メソッドと使用するクラスは同じである必要があります。同じでない場合、次の警告が表示されます-

「ロガー名の不一致が検出されました。

次の例を考えてみましょう。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class SLF4JExample {
   public static void main(String[] args) {
      System.setProperty("slf4j.detectLoggerNameMismatch", "true");
      
      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("Hi Welcome to Tutorilspoint");
   }
}

ここでは、slf4j.detectLoggerNameMismatchプロパティをtrueに設定しています。使用したクラスの名前はSLF4JExample getLogger()メソッドに渡したクラス名は次のとおりです。 Sample 両方が等しくないため、次の警告が表示されます。

SLF4J: Detected logger name mismatch. Given name: "Sample"; computed name:
"SLF4JExample".
SLF4J: See http://www.slf4j.org/codes.html#loggerNameMismatch for an
explanation
Dec 10, 2018 12:43:00 PM SLF4JExample main
INFO: Hi Welcome to Tutorilspoint

Note −これはslf4j1.7.9の後に発生します

クラスパスには、複数のSLF4Jバインディングが含まれています。

クラスパスにはバインディングを1つだけ含める必要があります。複数のバインディングがある場合は、バインディングとその場所をリストした警告が表示されます。

たとえば、バインディングがある場合 slf4j-jdk14.jar そして slf4j-nop.jar クラスパスで、次の警告が表示されます。

SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-nop-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in
[jar:file:/C:/Users/Tutorialspoint/Desktop/Latest%20Tutorials/SLF4J%20Tutorial/
slf4j-1.7.25/slf4j-jdk14-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an
explanation.
SLF4J: Actual binding is of type [org.slf4j.helpers.NOPLoggerFactory]

クラスパスでlog4j-over-slf4j.jarとバインドされたslf4j-log4j12.jarの両方が検出されました

log4jロガー呼び出しをslf4jにリダイレクトするには、次を使用する必要があります。 log4j-over-slf4j.jar バインディング。slf4j呼び出しをlog4jにリダイレクトする場合は、次を使用する必要があります。 slf4j-log4j12.jar 製本。

したがって、クラスパスに両方を含めることはできません。これを行うと、次の例外が発生します。

SLF4J: Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the
class path, preempting StackOverflowError.
SLF4J: See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more
details.
Exception in thread "main" java.lang.ExceptionInInitializerError
   at org.slf4j.impl.StaticLoggerBinder.<init>(StaticLoggerBinder.java:72)
   at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:45)
   at org.slf4j.LoggerFactory.bind(LoggerFactory.java:150)
   at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:124)
   at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:412)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:357)
   at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:383)
   at SLF4JExample.main(SLF4JExample.java:8)
Caused by: java.lang.IllegalStateException: Detected both log4j-over-slf4j.jar
AND bound slf4j-log4j12.jar on the class path, preempting StackOverflowError.
See also http://www.slf4j.org/codes.html#log4jDelegationLoop for more details.

このチュートリアルの前半で説明したように、SLF4Jはパラメーター化されたログメッセージのサポートを提供します。

メッセージでパラメーターを使用し、後で同じステートメントで値をメッセージに渡すことができます。

構文

以下に示すように、メッセージ(文字列)では必要に応じてプレースホルダー({})を使用する必要があり、後でプレースホルダーの値をで渡すことができます。 object フォーム、メッセージと値をコンマで区切ります。

Integer age;
Logger.info("At the age of {} ramu got his first job", age);

次の例は、SLF4Jを使用したパラメーター化されたロギング(単一パラメーター)を示しています。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
   public static void main(String[] args) {
      
      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(PlaceHolders.class);
      Integer age = 23;
      
      //Logging the information
      logger.info("At the age of {} ramu got his first job", age);
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

Dec 10, 2018 3:25:45 PM PlaceHolders main
INFO: At the age of 23 Ramu got his first job

パラメータ化されたロギングの利点

Javaでは、ステートメントに値を出力する必要がある場合、連結演算子を-として使用します。

System.out.println("At the age of "+23+" ramu got his first job");

これには、整数値23の文字列への変換と、この値の周囲の文字列への連結が含まれます。

また、それがロギングステートメントであり、ステートメントの特定のログレベルが無効になっている場合、この計算はすべて役に立ちません。

このような状況では、パラメータ化されたロギングを使用できます。この形式では、最初にSLF4Jが特定のレベルのロギングが有効になっているかどうかを確認します。その場合、メッセージ内のプレースホルダーをそれぞれの値に置き換えます。

たとえば、次のようなステートメントがある場合

Integer age;
Logger.debug("At the age of {} ramu got his first job", age);

デバッグが有効になっている場合にのみ、SLF4Jは経過時間を整数に変換し、それ以外の場合は文字列と連結します。それ以外の場合は何もしません。したがって、ロギングレベルが無効になっている場合、パラメータ構築のコストが発生します。

2つの引数のバリアント

メッセージ内で2つのパラメータを-として使用することもできます。

logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);

次の例は、パラメーター化されたロギングでの2つのプレースホルダーの使用法を示しています。

import java.util.Scanner;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class PlaceHolders {
   public static void main(String[] args) {
      Integer oldWeight;
      Integer newWeight;
      Scanner sc = new Scanner(System.in);
      System.out.println("Enter old weight:");
      oldWeight = sc.nextInt();

      System.out.println("Enter new weight:");
      newWeight = sc.nextInt();

      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight);
 
      //Logging the information
      logger.info("After the program weight reduced is: "+(oldWeight-newWeight));
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

Enter old weight:
85
Enter new weight:
74
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: Old weight is 85. new weight is 74.
Dec 10, 2018 4:12:31 PM PlaceHolders main
INFO: After the program weight reduced is: 11

複数の引数のバリアント

次の例に示すように、3つ以上のプレースホルダーを使用することもできます-

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
   public static void main(String[] args) {
      Integer age = 24;
      String designation = "Software Engineer";
      String company = "Infosys";

      //Creating the Logger object
      Logger logger = LoggerFactory.getLogger(Sample.class);

      //Logging the information
      logger.info("At the age of {} ramu got his first job as a {} at {}", age, designation, company);
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

Dec 10, 2018 4:23:52 PM PlaceHolders main
INFO: At the age of 24 ramu got his first job as a Software Engineer at Infosys

Jakarta Commons Logging(JCL)、log4j、またはjava.util.logging(JUL)にプロジェクトがあり、これらのプロジェクトをSLF4Jに変換する場合は、SLF4Jディストリビューションで提供されている移行ツールを使用して変換できます。

SLF4JMigratorの実行

SLF4Jは単純な単一のjarファイル(slf4j-migrator.jar)であり、java –jarコマンドを使用して実行できます。

これを実行するには、コマンドプロンプトで、このjarファイルがあるディレクトリを参照し、次のコマンドを実行します。

java -jar slf4j-migrator-1.8.0-beta2.jar
Starting SLF4J Migrator

これにより移行が開始され、スタンドアロンのJavaアプリケーションが次のように表示されます。

ウィンドウで指定されているように、実行する移行のタイプを確認し、プロジェクトディレクトリを選択して、[プロジェクトをSLF4Jに移行]ボタンをクリックする必要があります。

このツールは、提供されたソースファイルに移動し、インポート行やロガー宣言を現在のログフレームワークからSLF4jに変更するなどの簡単な変更を実行します。

たとえば、サンプルがあるとしましょう log4j(2) 次のように単一のファイルでEclipseでプロジェクトします-

import org.apache.log4j.Logger;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class Sample {
   /* Get actual class name to be printed on */
   static Logger log = Logger.getLogger(Sample.class.getName());

   public static void main(String[] args)throws IOException,SQLException {
      log.debug("Hello this is a debug message");
      log.info("Hello this is an info message");
   }
}

サンプルを移行するには log4j(2) slf4jにプロジェクトし、ラジオボタンをチェックする必要があります from log4j to slf4j プロジェクトのディレクトリを選択して、 Exit 移行します。

移行者は上記のコードを次のように変更しました。ここで、インポートステートメントとロガーステートメントが変更されていることを確認します。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.*;
import java.sql.SQLException;
import java.util.*;

public class Sample {
   static Logger log = LoggerFactory.getLogger(Sample.class.getName());
   public static void main(String[] args)throws IOException,SQLException {
      log.debug("Hello this is a debug message");
      log.info("Hello this is an info message");
   }
}

あなたはすでに持っているので log4j.jar プロジェクトに追加する必要があります slf4j-api.jar そして slf4jlog12.jar それを実行するためにプロジェクトにファイルします。

SLF4JMigratorの制限

SLF4J移行の制限は次のとおりです。

  • Migratorは、ant、maven、ivyなどのビルドスクリプトを自分で変更する必要はありません。

  • Migratorは、文字列型以外のメッセージをサポートしていません。

  • MigratorはFATALレベルをサポートしていません。

  • log4jの操作中、migratorはPropertyConfiguratorまたはDomConfiguratorへの呼び出しを移行しません。

SLF4Jディストリビューションは提供します slf4j-ext.jar これには、プロファイリング、拡張ロギング、イベントロギング、Javaエージェントによるロギングなどの機能のためのAPIが含まれています。

プロファイリング

プログラマーは、メモリの使用、時間の複雑さ、プログラムに関する特定の命令の使用などの属性を測定して、そのプログラムの実際の機能を測定したい場合があります。プログラムに関するこのような測定は、プロファイリングと呼ばれます。プロファイリングは、動的プログラム分析を使用してそのような測定を行います。

SLF4Jは、という名前のクラスを提供します Profiler の中に org.slf4j.profilerプロファイリング用のパッケージ。これは貧乏人のプロファイラーとして知られています。これを使用して、プログラマーは長時間のタスクを実行するのにかかる時間を知ることができます。

プロファイラークラスを使用したプロファイリング

プロファイラーにはストップウォッチと子ストップウォッチが含まれており、プロファイラークラスが提供するメソッドを使用してこれらを開始および停止できます。

プロファイラークラスを使用してプロファイリングを続行するには、以下の手順に従います。

ステップ1-プロファイラークラスをインスタンス化する

プロファイラーの名前を表す文字列値を渡して、プロファイラークラスをインスタンス化します。プロファイラークラスをインスタンス化すると、グローバルストップウォッチが開始されます。

//Creating a profiler
Profiler profiler = new Profiler("Sample");

ステップ2-子ストップウォッチを開始する

を呼び出すと start() メソッドは、新しい子ストップウォッチ(名前付き)を開始し、以前の子ストップウォッチ(またはタイムインスツルメント)を停止します。

を呼び出す start() の方法 Profiler 作成する子ストップウォッチの名前を表す文字列値を渡すことによってクラス。

//Starting a child stopwatch and stopping the previous one.
profiler.start("Task 1");
obj.demoMethod1();

これらのストップウォッチを作成した後、タスクを実行するか、タスクを実行するメソッドを呼び出すことができます。

ステップ3:別の子ストップウォッチを開始します(必要な場合)

必要に応じて、を使用して別のストップウォッチを作成します start()メソッドを実行し、必要なタスクを実行します。これを行うと、新しいストップウォッチが開始され、前のストップウォッチが停止します(つまり、タスク1)。

//Starting another child stopwatch and stopping the previous one.
profiler.start("Task 2");
obj.demoMethod2();

ステップ4:時計を停止します

を呼び出すと stop() メソッドでは、最近の子ストップウォッチとグローバルストップウォッチを停止し、現在のタイムインストルメントを返します。

// Stopping the current child stopwatch and the global stopwatch.
TimeInstrument tm = profiler.stop();

ステップ5:タイムインスツルメントの内容を印刷します。

を使用して現在の時刻計の内容を印刷します print() 方法。

//printing the contents of the time instrument
tm.print();

次の例は、SLF4Jのプロファイラークラスを使用したプロファイリングを示しています。ここでは、1から10000までの数値の二乗和を出力し、1から10000までの数値の合計を出力する、2つのサンプルタスクを実行しました。これら2つのタスクにかかる時間を取得しようとしています。

import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;

public class ProfilerExample {
   public void demoMethod1(){
      double sum = 0;
      for(int i=0; i< 1000; i++){
         sum = sum+(Math.pow(i, 2));
      }
      System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
   }
   public void demoMethod2(){
      int sum = 0;
      for(int i=0; i< 10000; i++){
         sum = sum+i;
      }
      System.out.println("Sum of the numbers from 1 to 10000: "+sum);
   }
   public static void main(String[] args) {
      ProfilerExample obj = new ProfilerExample();

      //Creating a profiler
      Profiler profiler = new Profiler("Sample");

      //Starting a child stop watch and stopping the previous one.
      profiler.start("Task 1");
      obj.demoMethod1();

      //Starting another child stop watch and stopping the previous one.
      profiler.start("Task 2");
      obj.demoMethod2();
 
      //Stopping the current child watch and the global watch.
      TimeInstrument tm = profiler.stop();

      //printing the contents of the time instrument
      tm.print();
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000
+ Profiler [BASIC]
|-- elapsed time [Task 1] 2291.827 microseconds.
|-- elapsed time [Task 2] 225.802 microseconds.
|-- Total [BASIC] 3221.598 microseconds.

プロファイラー情報のログ

この情報をログに記録するためにプロファイラーの結果を印刷する代わりに、次のことを行う必要があります。

  • を使用してロガーを作成します LoggerFactory クラス。

  • プロファイラークラスをインスタンス化してプロファイラーを作成します。

  • 作成されたロガーオブジェクトをに渡すことにより、ロガーをプロファイラーに関連付けます setLogger() の方法 Profiler クラス。

  • 最後に、ログを印刷する代わりに、プロファイラーの情報を使用して log() 方法。

次の例では、(印刷する代わりに)前の例とは異なり、タイムインスツルメントの内容をログに記録しようとしています。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.profiler.Profiler;
import org.slf4j.profiler.TimeInstrument;

public class ProfilerExample_logger {
   public void demoMethod1(){
      double sum = 0;
      for(int i=0; i< 1000; i++){
         sum = sum+(Math.pow(i, 2));
      }
      System.out.println("Sum of squares of the numbers from 1 to 10000: "+sum);
   }
   public void demoMethod2(){
      int sum = 0;
      for(int i=0; i< 10000; i++){
         sum = sum+i;
      }
      System.out.println("Sum of the numbers from 1 to 10000: "+sum);
   }
   public static void main(String[] args) {
      ProfilerExample_logger obj = new ProfilerExample_logger();

      //Creating a logger
      Logger logger = LoggerFactory.getLogger(ProfilerExample_logger.class);

      //Creating a profiler
      Profiler profiler = new Profiler("Sample");

      //Adding logger to the profiler
      profiler.setLogger(logger);

      //Starting a child stop watch and stopping the previous one.
      profiler.start("Task 1");
      obj.demoMethod1();

      //Starting another child stop watch and stopping the previous one.
      profiler.start("Task 2");
      obj.demoMethod2();

      //Stopping the current child watch and the global watch.
      TimeInstrument tm = profiler.stop();

      //Logging the contents of the time instrument
      tm.log();
   }
}

出力

上記のプログラムを実行すると、次の出力が生成されます。

Sum of squares of the numbers from 1 to 10000: 3.328335E8
Sum of the numbers from 1 to 10000: 49995000