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) { //创建 Logger 对象 Logger logger = LoggerFactory.getLogger(PlaceHolders.class); Integer age = 23; //记录信息 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 才会将年龄转换为整数并将其与字符串连接起来,否则,它什么也不做。因此,在禁用日志记录级别时会产生参数构造的成本。
双参数变体
您还可以在消息中使用两个参数,如下所示 −
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(); //创建 Logger 对象 Logger logger = LoggerFactory.getLogger(Sample.class); //记录信息 logger.info("Old weight is {}. new weight is {}.", oldWeight, newWeight); //记录信息 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"; //创建 Logger 对象 Logger logger = LoggerFactory.getLogger(Sample.class); //记录信息 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