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 才会将年龄转换为整数并将其与字符串连接,否则,它什么都不做。因此在禁用日志记录级别时会产生参数构造的成本。
  • 两个参数变体

    您还可以在消息中使用两个参数作为 -
    
    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