使用YAML的Log4j 2配置

Log4j 2 Configuration Using YAML

对于不同的Log4J 2配置选项,您可以浏览以下相关文章:

  • Log4J 2配置:使用属性文件

  • Log4J 2配置:使用XML

  • Log4J 2配置:使用JSON

  • 在本文中,我将讨论如何使用YAML配置Log4J 2。

    Yaven配置的Maven依赖关系

    要使用Log4J2,您需要在Maven POM中添加所需的Log4J 2依赖关系,如此处所述。 对于YAML配置,您还需要Jackson,这是用于Java的一组数据处理工具。 对Log4J 2的YAML支持使用两个Jackson软件包:Jackson数据格式和Jackson数据绑定,它们的依赖关系必须存在于Maven POM中。

    以下代码段显示了使用YAML配置Log4J 2所需的依赖项。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
       <exclusions>
          <exclusion>
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-logging</artifactId>
          </exclusion>
       </exclusions>
    </dependency>
    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-api</artifactId>
       <version>2.5</version>
    </dependency>
    <dependency>
       <groupId>org.apache.logging.log4j</groupId>
       <artifactId>log4j-core</artifactId>
       <version>2.5</version>
    </dependency>
    <dependency>
       <groupId>com.fasterxml.jackson.dataformat</groupId>
       <artifactId>jackson-dataformat-yaml</artifactId>
       <version>2.7.3</version>
    </dependency>
    <dependency>
       <groupId>com.fasterxml.jackson.core</groupId>
       <artifactId>jackson-databind</artifactId>
       <version>2.5.4</version>
    </dependency>
    . . .

    创建一个记录器

    在开始使用YAML配置Log4J 2之前,让我们创建一个使用Log4J 2 API记录消息的记录器类。

    Log4J2YamlConf.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    package guru.springframework.blog.log4j2yaml;

    import org.apache.logging.log4j.LogManager;
    import org.apache.logging.log4j.Logger;

    public class Log4J2YamlConf {
        private static Logger logger = LogManager.getLogger();
        public void performSomeTask(){
            logger.debug("This is a debug message");
            logger.info("This is an info message");
            logger.warn("This is a warn message");
            logger.error("This is an error message");
            logger.fatal("This is a fatal message");
        }
    }

    我们将使用JUnit测试前面的类。

    Log4J2YamlConfTest.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    package guru.springframework.blog.log4j2yaml;

    import org.junit.Test;

    import static org.junit.Assert.*;

    public class Log4J2YamlConfTest {

        @Test
        public void testPerformSomeTask() throws Exception {
            Log4J2YamlConf log4J2YamlConf = new Log4J2YamlConf();
            log4J2YamlConf.performSomeTask();
        }
    }

    配置控制台和文件添加器

    为了使用YAML配置Log4J 2,您需要一个YAML配置文件,在项目类路径中名为 log4j2.yaml log4j2.ym

    YAML配置文件的框架是这个。

    1
    2
    3
    4
    Configuration:
      Properties:
      Appenders:
      Loggers:

    上面的log4j2.yaml文件的语法由Configuration键组成,该键具有以下属性列表:Properties,Appenders和Loggers。

    让我们从配置两个追加程序开始,以将日志消息写入控制台和一个文件。 我们还将配置特定于应用程序的记录器和根记录器,以使用附加程序,如下所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    Configutation:
      name: Default

      Properties:
        Property:
          name: log-path
          value:"logs"

      Appenders:

        Console:
          name: Console_Appender
          target: SYSTEM_OUT
          PatternLayout:
            pattern:"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

        File:
          name: File_Appender
          fileName: ${log-path}/logfile.log
          PatternLayout:
            pattern:"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

      Loggers:

          Root:
            level: debug
            AppenderRef:
              - ref: Console_Appender

          Logger:
            - name: guru.springframework.blog.log4j2yaml
              level: debug
              AppenderRef:
                - ref: File_Appender
                  level: error

    在上面的配置代码中:

  • 第4行-第7行:我们声明了配置文件其他部分可以访问的log-path属性。

  • 第9行-第21行:我们配置了控制台和文件追加器。

  • 第23 – 35行:我们为guru.springframework.blog.log4j2yaml包的所有记录器类配置了特定于应用程序的记录器。 该记录器将错误和较低级别的日志消息写入文件追加器。 我们还将根记录器配置为将 debug 和较低级别的消息记录到已配置的控制台附加程序中。

  • 如果我们运行 Log4J2YamlConfTest 测试类,则Log4J 2将生成日志消息,并将它们发送到控制台和文件,如图所示。

    Log4J 2 JSON Configuration for File and Console Output

    配置滚动文件附加器

    在我以前的有关使用XML和JSON配置Log4J 2的文章中,我讨论了滚动文件附加器的好处以及如何配置它。 另外,您可以参考Log4J 2手册以了解有关滚动文件的更多信息。 在YAML中,您可以像这样配置滚动文件附加程序。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    . . .
     RollingFile:
          - name: RollingFile_Appender
            fileName: ${log-path}/rollingfile.log
            filePattern:"logs/archive/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz"
            PatternLayout:
              pattern:"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
            Policies:
              SizeBasedTriggeringPolicy:
                size: 1 KB
            DefaultRollOverStrategy:
              max: 30
    . . .

    在上面的代码中:

  • 第3行:我们使用RollingFile的名称值来定义记录器可以使用的此附加程序的名称。

  • 第4行-第5行:我们使用filename和filePattern值分别定义要写入的文件名和已归档日志文件的文件名模式。

  • 第8行-第10行:我们使用Policies属性定义了基于大小的触发策略。 为了进行测试,我们设置size:1KB值以在其大小超过1 KB时滚动日志文件。

  • 第11行-第12行:我们将DefaultRolloverStrategy属性与max:30值一起使用。 这指示Log4J 2最多保留30个滚动文件,然后再删除它们。

  • 要使用滚动文件附加程序,请将附加程序引用添加到记录器中,如下所示。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    . . .
    Loggers:

        Root:
          level: debug
          AppenderRef:
            - ref: Console_Appender

        Logger:
          - name: guru.springframework.blog.log4j2yaml
            level: debug
            AppenderRef:
              - ref: File_Appender
                level: error
              - ref: RollingFile_Appender
                level: debug
    . . .

    在上述配置代码的第15行-第16行中,我们添加了对具有 debug 级别的滚动文件附加程序的引用。

    在运行 Log4J2YamlConfTest 测试类时,会在 logs 文件夹中生成 rollingfile.log 文件,并带有 debug 和更低版本 级日志消息。 现在,如果您多次运行 Log4J2YamlConfTest 测试类,直到 rollingfile.log 文件的大小超过1 KB,则Log4J 2将创建一个 .gz archive 目录中生成的滚动文件的存档。Log4J 2 YAML Output of Rolling File

    测井加性

    到目前为止,在我们的示例中,我们一直在使用可加性将发送到文件追加器的消息也发送到控制台追加器。 您可以通过将记录器的 additivity 属性设置为 false 来覆盖此默认行为。

    log4j2.yaml 文件的完整代码,没有添加。

    log4j2.yaml
    <铅>

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Configutation:
      name: Default

      Properties:
        Property:
          name: log-path
          value:"logs"

      Appenders:

        Console:
          name: Console_Appender
          target: SYSTEM_OUT
          PatternLayout:
            pattern:"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

        File:
          name: File_Appender
          fileName: ${log-path}/logfile.log
          PatternLayout:
            pattern:"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"

        RollingFile:
          - name: RollingFile_Appender
            fileName: ${log-path}/rollingfile.log
            filePattern:"logs/archive/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz"
            PatternLayout:
              pattern:"[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n"
            Policies:
              SizeBasedTriggeringPolicy:
                size: 1 KB
            DefaultRollOverStrategy:
              max: 30

      Loggers:

          Root:
            level: debug
            AppenderRef:
              - ref: Console_Appender

          Logger:
            - name: guru.springframework.blog.log4j2yaml
              additivity: false
              level: debug
              AppenderRef:
                - ref: Console_Appender
                  level: info
                - ref: File_Appender
                  level: error
                - ref: RollingFile_Appender
                  level: debug

    在上面代码的47行-48行中,我们为控制台附加程序配置了记录器的级别信息。 我们还在第44行中通过添加additivity:false值禁用了可加性。

    现在,当我们运行测试类时,记录器将使用新配置的控制台附加程序,而不是根记录器中的控制台附加程序。 您可以再次运行测试类,以检查 info 和更低的日志消息现在是否已发送到控制台,如图所示。 您可以看到调试级别不再发送到控制台。

    Log4J 2 YAML Additivity Configuration

    有关使用XML和JSON配置可加性的信息,请参考我之前的文章,也请参考此处。 我还建议您阅读有关该主题的Log4J 2文档,他们在其中提供了一些很好的示例。

    摘要

    在所有配置选项中,YAML是最紧凑和易读的格式。 但是,与属性和XML配置不同,您在项目中需要其他的Jackson JAR来解析YAML配置文件。 如果您熟悉XML或JSON格式,则可以使用几种转换器之一将XML或JSON配置转换为YAML,也可以采用其他方法。 您可以尝试使用的工具之一是此处提供的在线转换器。 但是,请注意,转换器并非总是100%准确的。 作为开发人员,请使用它作为参考。