在log4j2.yml配置文件中声明多个属性变量

问题描述 投票:0回答:1

将 log4j2 的配置文件从 .xml 转换为 .yml 时,我遇到了这些属性变量的问题。 我运行良好的 .xml 文件如下所示,有 2 个属性变量“log-path”和“log-name”:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration xmlns="http://logging.apache.org/log4j/2.0/config" packages="com.mypackage">

    <Properties>
        <Property name="log-path">/var/work/logs/my-service</Property>
        <Property name="log-name">my-service</Property>
    </Properties>

    <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout pattern="%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{userName}] [mid%X{mid}] - %m%n%exception"/>
        </Console>

        <RollingFile name="File" fileName="${log-path}/${log-name}.log" append="true"
                     filePattern="${log-path}/${log-name}-%d{yyyy-MM}/${log-name}-%d{yyyy-MM-dd}-%i.log.gz">
            <PatternLayout charset="UTF-8" pattern="%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{username}] [mid%X{mid}] - %m%n%exception"/>
            <Policies>
                <SizeBasedTriggeringPolicy size="200 MB" />
                <TimeBasedTriggeringPolicy />
            </Policies>
            <DefaultRolloverStrategy max="10000" compressionLevel="9"/>
        </RollingFile>
//..............................

我的 .yml 文件如下所示:

Configuration:
  packages: "com.mypackage"

  Properties:
    Property:
      - name: log-path
        value: "/var/work/logs/my-service"
      - name: log-name
        value: "my-service"

  Appenders:
    Console:
      name: Console
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{userName}] [mid%X{mid}] - %m%n%exception"

    RollingFile:
      name: File
      fileName: ${log-path}/${log-name}.log
      append: true
      filePattern: ${log-path}/${log-name}.log-%d{yyyy-MM}/${log-name}.log-%d{yyyy-MM-dd}-%i.log.gz
      PatternLayout:
        charset: "UTF-8"
        pattern: "%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{username}] [mid%X{mid}] - %m%n%exception"
// ......................

这里的问题是“log-path”和“log-name”的值没有按照我的预期检索:

"/var/work/logs/my-service/my-service.log"
,而是在我的应用程序目录中生成日志文件,路径为:
"${log-path}/${log-name}.log" 
.

但是只有当我声明超过 1 个变量时才会出现问题。如果我只是声明一个这样的变量,一切都会再次正常工作:

Configuration:
  packages: "com.mypackage"

  Properties:
    Property:
      name: log-path
      value: "/var/work/logs/my-service"

  Appenders:
    Console:
      name: Console
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{userName}] [mid%X{mid}] - %m%n%exception"

    RollingFile:
      name: File
      fileName: ${log-path}/my-service.log
      append: true
      filePattern: ${log-path}/my-service.log-%d{yyyy-MM}/my-service.log-%d{yyyy-MM-dd}-%i.log.gz
      PatternLayout:
        charset: "UTF-8"
        pattern: "%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{username}] [mid%X{mid}] - %m%n%exception"
// ......................

我尝试搜索但找不到任何东西。你们能帮我吗?如何声明多个属性变量?

java xml spring yaml log4j2
1个回答
0
投票

我能够使用您的配置和少量添加成功运行一个简单的应用程序(向 RollingFileAppender 添加策略和几个记录器,请参阅下面的列表)。

源文件:

Main.java

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

public class Main {
    private static final Logger logger = LogManager.getLogger(Main.class);

    public static void main(String[] args) {
       logger.info("hello");
    }
}

log4j2.yaml

Configuration:
  packages: "com.igorgoose"

  Properties:
    Property:
      - name: log-path
        value: "C:\\Users\\i.shchepov\\Desktop\\projects\\log4j2-yaml-test"
      - name: log-name
        value: "my-service"

  Appenders:
    Console:
      name: Console
      target: SYSTEM_OUT
      PatternLayout:
        pattern: "%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{userName}] [mid%X{mid}] - %m%n%exception"

    RollingFile:
      name: File
      Policies:
        SizeBasedTriggeringPolicy:
          size: 1 KB
      fileName: ${log-path}/${log-name}.log
      append: true
      filePattern: ${log-path}/${log-name}.log-%d{yyyy-MM}/${log-name}.log-%d{yyyy-MM-dd}-%i.log.gz
      PatternLayout:
        charset: "UTF-8"
        pattern: "%d{DEFAULT} %5p [%20C{1}] [%4L] [trace%X{requestId}] [user%X{username}] [mid%X{mid}] - %m%n%exception"

  Loggers:
    Root:
      level: debug
      AppenderRef:
        - ref: Console
    Logger:
      - name: com.igorgoose
        level: debug
        AppenderRef:
          - ref: File

pom.xml

<dependencies>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-api</artifactId>
            <version>2.13.1</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.1</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.dataformat</groupId>
            <artifactId>jackson-dataformat-yaml</artifactId>
            <version>2.10.0</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.10.0</version>
        </dependency>
</dependencies>

但是,我能够通过不小心弄乱 log4j2 配置中的缩进来重现您的问题,因此

Loggers
属性与
Configuration
处于同一级别。

log4j2.yaml(搞砸了)

Configuration:
  packages: "com.igorgoose"

# ------the rest of configuration-----------

Loggers:
  Root:
    level: debug
    AppenderRef:
      - ref: Console
  Logger:
    - name: com.igorgoose
      level: debug
      AppenderRef:
        - ref: File

因此,请确保您的缩进正确,并让我知道问题是否仍然存在。希望这有帮助!

© www.soinside.com 2019 - 2024. All rights reserved.