Spring boot not searching for log4j2 configuration file
Asked Answered
I

4

5

I am trying to use Apache Log4j 2.12.1 with Spring Boot 2.2.1 but when I run, it doesn't give any warning about missing log4j 2 configuration file. Below is the code for logging(Simple once class to test if it works or note):

package com.example.Log4jdemoSpringboot;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Log4jDemoSpringBootApplication {

    static Logger logger = LogManager.getLogger(Log4jDemoSpringBootApplication.class);
    public static void main(String[] args) {
        SpringApplication.run(Log4jDemoSpringBootApplication.class, args);
        logger.info("info");
        logger.warn("warn");
        logger.error("error");
        logger.debug("debug");
        logger.fatal("fatal");
    }

}

and Below is the output:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.1.RELEASE)

2019-11-18 12:19:20.844  INFO 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : Starting Log4jDemoSpringBootApplication on Gurpreet-PC with PID 13136 (C:\Development\eclipse-workspace\Log4j-demo-Spring-boot\target\classes started by Gurpreet in C:\Development\eclipse-workspace\Log4j-demo-Spring-boot)
2019-11-18 12:19:20.872  INFO 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : No active profile set, falling back to default profiles: default
2019-11-18 12:19:26.946  INFO 13136 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat initialized with port(s): 8080 (http)
2019-11-18 12:19:27.009  INFO 13136 --- [           main] o.apache.catalina.core.StandardService   : Starting service [Tomcat]
2019-11-18 12:19:27.011  INFO 13136 --- [           main] org.apache.catalina.core.StandardEngine  : Starting Servlet engine: [Apache Tomcat/9.0.27]
2019-11-18 12:19:27.442  INFO 13136 --- [           main] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring embedded WebApplicationContext
2019-11-18 12:19:27.444  INFO 13136 --- [           main] o.s.web.context.ContextLoader            : Root WebApplicationContext: initialization completed in 6320 ms
2019-11-18 12:19:28.213  INFO 13136 --- [           main] o.s.s.concurrent.ThreadPoolTaskExecutor  : Initializing ExecutorService 'applicationTaskExecutor'
2019-11-18 12:19:28.925  INFO 13136 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2019-11-18 12:19:28.937  INFO 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : Started Log4jDemoSpringBootApplication in 10.398 seconds (JVM running for 13.269)
2019-11-18 12:19:28.945  INFO 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : info
2019-11-18 12:19:28.949  WARN 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : warn
2019-11-18 12:19:28.952 ERROR 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : error
2019-11-18 12:19:28.953 ERROR 13136 --- [           main] c.e.L.Log4jDemoSpringBootApplication     : fatal

However if I use same configuration with simple java projects, it works.

Incapable answered 18/11, 2019 at 6:54 Comment(4)
What do you mean it doesn't gives any warning about missing log4j file ? From logs I can see your project runs fineExponible
I don't think It's required the log4j config file. If you wish to provide custom logger level and other configs in that case you need a config file. Spring boot will take care of everything if you don't wish to. Just add a dependency and you are good to goCheckered
@Exponible - In logs we can see that it is logging FATAL message as ERROR and it ignored the DEBUG message. Hence it not working as it supposed to be.This can be fixed through the configuration file but spring is completely ignoring the presence or absence of the configuration file.Incapable
@HarshMishra - Yes I want custom log levels and write the logs to a file. But spring is completely ignoring the presence or absence of the configuration file. If I use it with simple Java project I can write logs to a file and change log levels as well.Incapable
C
3

Hope this is what are looking for
This is something that I have used in Spring boot logging In application.properties

#logging.level.root=WARN
logging.level.org.springframework=DEBUG
logging.level.com.appicantion.name=DEBUG

#output to a temp_folder/file
logging.file=${java.io.tmpdir}/application.log

# Logging pattern for the console
logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %msg%n

# Logging pattern for file
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%

Your Answer : In log4j2

add log4j2.xml in src/main/resources folder.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</Property>
        <Property name="APP_LOG_ROOT">c:/temp</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </Console>

        <RollingFile name="appLog"
            fileName="${APP_LOG_ROOT}/SpringBoot2App/application.log"
            filePattern="${APP_LOG_ROOT}/SpringBoot2App/application-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
            <DefaultRolloverStrategy max="1" />
        </RollingFile>

    </Appenders>
    <Loggers>

        <Logger name="com.application.app" additivity="false">
            <AppenderRef ref="appLog" />
            <AppenderRef ref="Console" />
        </Logger>

        <Root level="debug">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

https://howtodoinjava.com/spring-boot2/logging/spring-boot-log4j2-config/

Checkered answered 18/11, 2019 at 7:33 Comment(2)
Thanks :) It provided me enough hint what and where I am missing. However still things are not working as they should but now i know what to look for.Incapable
Log4j2 part fixed all my problems. Thanks a lot.Incapable
B
9

I had the issue, spring boot didn't search the configuration xml file. I added this line to application.properties (log4j2.xml is in src/main/resources)

logging.config=classpath:log4j2.xml
Bensky answered 4/7, 2020 at 16:21 Comment(0)
S
7

Just sharing as I also faced the same issue with my log4j2 configuration. I got the following solution.

  1. Run command: mvn dependency:tree This command will tell you which dependencies are loading before your configuration.

  2. Adding exclusions to the dependency in pom.xml loading before your log dependency, add either of the following mine worked with the option a.

a-

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-logging</artifactId>
        </exclusion>
    </exclusions>
</dependency>

b-

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
        </exclusion>
        <exclusion>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </exclusion>
    </exclusions>
</dependency>

After this all worked well and my log4j2.xml configuration loaded successfully. Make sure the configuration file is in the classpath.

Seabrooke answered 2/2, 2021 at 23:34 Comment(0)
C
3

Hope this is what are looking for
This is something that I have used in Spring boot logging In application.properties

#logging.level.root=WARN
logging.level.org.springframework=DEBUG
logging.level.com.appicantion.name=DEBUG

#output to a temp_folder/file
logging.file=${java.io.tmpdir}/application.log

# Logging pattern for the console
logging.pattern.console= %d{yyyy-MM-dd HH:mm:ss} - %msg%n

# Logging pattern for file
logging.pattern.file= %d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%

Your Answer : In log4j2

add log4j2.xml in src/main/resources folder.

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="LOG_PATTERN">%d{yyyy-MM-dd'T'HH:mm:ss.SSSZ} %p %m%n</Property>
        <Property name="APP_LOG_ROOT">c:/temp</Property>
    </Properties>
    <Appenders>
        <Console name="Console" target="SYSTEM_OUT" follow="true">
            <PatternLayout pattern="${LOG_PATTERN}" />
        </Console>

        <RollingFile name="appLog"
            fileName="${APP_LOG_ROOT}/SpringBoot2App/application.log"
            filePattern="${APP_LOG_ROOT}/SpringBoot2App/application-%d{yyyy-MM-dd}-%i.log">
            <PatternLayout pattern="${LOG_PATTERN}" />
            <Policies>
                <SizeBasedTriggeringPolicy size="19500KB" />
            </Policies>
            <DefaultRolloverStrategy max="1" />
        </RollingFile>

    </Appenders>
    <Loggers>

        <Logger name="com.application.app" additivity="false">
            <AppenderRef ref="appLog" />
            <AppenderRef ref="Console" />
        </Logger>

        <Root level="debug">
            <AppenderRef ref="Console" />
        </Root>
    </Loggers>
</Configuration>

https://howtodoinjava.com/spring-boot2/logging/spring-boot-log4j2-config/

Checkered answered 18/11, 2019 at 7:33 Comment(2)
Thanks :) It provided me enough hint what and where I am missing. However still things are not working as they should but now i know what to look for.Incapable
Log4j2 part fixed all my problems. Thanks a lot.Incapable
W
0

This issue also really annoyed me but solution is close enough: Spring by default using Logback and if you want to use Log4J2 or other loggers first you need to exclude logback from Spring library in Maven and add to resource folder "log4J2.xml" configuration file. You can find instruction here on step 5 - https://www.baeldung.com/spring-boot-logging

Wistrup answered 17/1, 2023 at 18:11 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.