Spring 在 application.yml 文件中启动多个 log4j appender

Spring Boot multiple log4j appenders in application.yml file

我的 SpringBoot 应用程序需要 2 种不同的日志记录模式。

假设:

first_pattern  -- for root logger (INFO level)
second_pattern -- for packages com.Whosebug.engine.core (DEBUG level)

两个包都必须记录到标准输出。

是否可以在 application.yml 中进行配置?
(不在 XML 或 属性 文件中,而是在 YML 中)

非常感谢!

不,您无法单独使用 Spring 配置获得这样的配置。 Spring Boot 仅支持所有日志框架通用的几个配置选项(参见 documentation)。

如果您想要更复杂的配置,则需要使用您正在使用的特定日志记录框架的本机配置格式。

如果您使用的是 Log4j 2.x,您可以扩展 default Spring configuration 并将其另存为 log4j2-spring.yml 在您的类路径中:

Configuration:
  packages: org.springframework.boot.logging.log4j2
  properties:
    property:
      - name: LOG_EXCEPTION_CONVERSION_WORD
        value: "%xwEx"
      - name: LOG_LEVEL_PATTERN
        value: "%5p"
      - name: LOG_DATEFORMAT_PATTERN
        value: "yyyy-MM-dd HH:mm:ss.SSS"
      - name: CONSOLE_LOG_PATTERN
        value: "%clr{%d{${sys:LOG_DATEFORMAT_PATTERN}}}{faint} %clr{${sys:LOG_LEVEL_PATTERN}} %clr{%pid}{magenta} %clr{---}{faint} %clr{[%15.15t]}{faint} %clr{%-40.40c{1.}}{cyan} %clr{:}{faint} %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}"
      - name: FILE_LOG_PATTERN
        value: "%d{${LOG_DATEFORMAT_PATTERN}} ${LOG_LEVEL_PATTERN} %pid --- [%t] %-40.40c{1.} : %m%n${sys:LOG_EXCEPTION_CONVERSION_WORD}"

  appenders:
    appender:
      - name: Console
        type: Console
        PatternLayout:
          pattern: "${sys:CONSOLE_LOG_PATTERN}"
      - name: Console2
        type: Console
        PatternLayout:
          pattern: "Pattern2 %d %p %c{1.} [%t] %m%n"

  loggers:
    logger:
      - name: com.Whosebug.engine.core
        level: DEBUG
        additivity: false
        AppenderRef:
          - ref: Console2
    root:
      level: INFO
      AppenderRef:
        - ref: Console

备注:使用YAML格式需要在依赖中添加jackson-datatype-yaml。如果你使用 Maven 添加:

<dependency>
    <groupId>com.fasterxml.jackson.dataformat</groupId>
    <artifactId>jackson-dataformat-yaml</artifactId>
    <!-- version managed by Spring Boot -->
</dependency>

spring 属性 logging.config 可能对您的情况非常有用。通过使用此 属性,您可以根据配置文件或环境轻松提供不同的配置。

正如 Piotr P. Karwasz 所说,您仍然需要使用 log4j2 配置文件来定义模式,但您可以轻松地在不同设置之间切换。