SLF4J-パラメータ化されたロギング

このチュートリアルの前半で説明したように、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