SLF4J - 参数化日志记录



如本教程前面所述,SLF4J 支持参数化日志消息。

您可以在消息中使用参数,并在稍后的同一语句中传递值。

语法

如下所示,您需要在消息(字符串)中使用占位符({}),稍后您可以以**对象**形式传递占位符的值,并用逗号分隔消息和值。

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 才会将 age 转换为整数并将其与字符串连接起来,否则它不会做任何事情。从而在日志级别被禁用时避免了参数构造的开销。

两个参数变体

您也可以在消息中使用两个参数,如下所示:

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

示例

以下示例演示了在参数化日志记录中使用两个占位符。

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

多个参数变体

您还可以使用两个以上的占位符,如下例所示:

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
广告