0

I am facing problems with these property variables when converting config files of log4j2 from .xml to .yml. My well working .xml file looks like this, with 2 property variables "log-path" and "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>
//..............................

My .yml file looks like this:

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"
// ......................

The problem here is that the values โ€‹โ€‹of "log-path" and "log-name" are not retrieved as I expected: "/var/work/logs/my-service/my-service.log", instead the log file is generated right in my application directory with the path: "${log-path}/${log-name}.log".

But it only has problems when I declare more than 1 variable. If I just declare a variable like this, everything works fine again:

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"
// ......................

I tried searching but couldn't find anything. Can you guys help me? How do I declare multiple property variables?

  • It is probably a quoting problem, see [YAML: Do I need quotes for strings in YAML?](https://stackoverflow.com/q/19109912/11748454). โ€“ Piotr P. Karwasz Sep 01 '23 at 15:27

1 Answers1

0

I was able to successfully run a simple app with your configuration and small additions(added Policies to RollingFileAppender and a couple Loggers, see the listings below).

Source files:

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>

However, I was able to reproduce your issue by accidentally messing up the indentation in the log4j2 config, so that Loggers attribute was on the same level as Configuration.

log4j2.yaml(messed up)

Configuration:
  packages: "com.igorgoose"

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

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

So please make sure that your indentations are correct and let me know if the issue is still there. Hope this helps!

Igor
  • 91
  • 3