SLF4J参数化日志消息
精华
小牛编辑
100浏览
2023-03-14
正如本教程前面所讨论的,SLF4J提供了对参数化日志消息的支持。可以在消息中使用参数,并在稍后的同一语句中将值传递给它们。
语法
如下所示,需要在消息(String)中的任何位置使用占位符({}
),稍后可以在对象形式中为占位符传递值,并使用逗号分隔消息和值。
Integer age;
Logger.info("At the age of {} I go to school.", 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 {} I go to school.", age);
}
}
执行时,上述程序生成以下输出 -
Dec 10, 2019 13:27:05 PM PlaceHolders main
INFO: At the age of 23 I go to school.
参数化日志的优势
在Java中,如果需要在语句中打印值,可使用连接运算符 -
System.out.println("At the age of "+23+" I go to school.");
这涉及将整数值:23
转换为字符串并将该值连接到其周围的字符串。
如果它是一个日志记录语句,并且如果语句的特定日志级别被禁用,则所有这些计算都没有用。
在这种情况下,可以使用参数化日志记录。在这种格式中,最初SLF4J确认是否启用了特定级别的日志记录。如果是,那么它将使用相应的值替换消息中的占位符。
例如,如果有一个语句为 -
Integer age;
Logger.debug("At the age of {} I go to school.", 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:
86
Enter new weight:
77
Dec 20, 2019 4:12:21 PM PlaceHolders main
INFO: Old weight is 86. new weight is 77.
Dec 20, 2019 4:12:21 PM PlaceHolders main
INFO: After the program weight reduced is: 9
多个参数变体
还可以使用两个以上的占位符,如以下示例所示 -
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class PlaceHolders {
public static void main(String[] args) {
Integer age = 23;
String designation = "Software Engineer";
String company = "Yiibai";
//Creating the Logger object
Logger logger = LoggerFactory.getLogger(Sample.class);
//Logging the information
logger.info("At the age of {} Maxsu got his first job as a {} at {}", age, designation, company);
}
}
执行上面示例代码,得到以下结果:
Dec 10, 2019 8:43:52 PM main
INFO: At the age of 23 I got his first job as a Software Engineer at Yiibai