Search code examples
springlog4jslf4jtomcat8

Can't get file loggin to work with Log4j2 Slf4j in a Java 8 Spring app


I have a java spring 5 application that I deploy to Tomcat 8.5.15. I am now trying to upgrade the logging framework to Log4J2, I also use Slf4J. The problem right now is that I can't seem to log to a file (although it creates a file). It just logs to the console, why?. It's a multi module maven project. In the main "pom" i use these dependencies (for example):

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.13.2</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.30</version>
        </dependency>

        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.13.2</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-simple</artifactId>
            <scope>test</scope>
            <version>1.7.30</version>
        </dependency>

Here is the log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
    <Properties>
        <Property name="basePath">logs</Property>
    </Properties>

    <Appenders>
        <RollingFile name="fileLogger" fileName="logs/app-info.log" filePattern="logs/app-info-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout   pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Logger name="foobar" level="debug" additivity="true">
            <appender-ref ref="fileLogger" level="debug" />
        </Logger>
        <Root level="debug" additivity="false">
            <appender-ref ref="console" />
        </Root>
    </Loggers>
</Configuration>

EDIT Here is the 2nd version of the config (This produces a file with a little content, but not from my code.. from testing stuff "DefaultTestContextBootstrapper"...) The log ends up here: mymodule/logs/app-info.log

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">   
    <Appenders>
        <RollingFile name="fileLogger" fileName="logs/app-info.log" filePattern="logs/app-info-%d{yyyy-MM-dd}.log">
            <PatternLayout>
                <pattern>[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n</pattern>
            </PatternLayout>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1" modulate="true" />
            </Policies>
        </RollingFile>

        <Console name="console" target="SYSTEM_OUT">
            <PatternLayout   pattern="[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>        
        <Root level="info" additivity="false">
            <appender-ref ref="fileLogger" />
        </Root>
    </Loggers>
</Configuration>

In the java code, I try to log like this:

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
..
Logger logger = LoggerFactory.getLogger(MyClass.class);
logger.info("....");

Solution

  • The problem was that my maven poms were not perfect. I declared the log4j2 in the root pom, but not in the modules, so the jars (log4j2...) were not in the classpath of the final war file, but log4j (1) was there, so I had to get rid of that dependency from a couple of poms. Then I used this config for it to work (log4j2.yml):

    configuration:
      name: Default
      properties:
        property:
          - name: log-path
            value: /logs
          - name: archive
            value: ${log-path}/archive
      appenders:
        Console:
          PatternLayout:
            pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
          name: Console-Appender
          target: SYSTEM_OUT
        File:
          PatternLayout:
            pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
          fileName: ${log-path}/amc.log
          name: File-Appender
        RollingFile:
          DefaultRolloverStrategy:
            max: '30'
          PatternLayout:
            pattern: '[%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n'
          Policies:
            SizeBasedTriggeringPolicy:
              size: 1 MB
          fileName: ${log-path}/rollingfile.log
          filePattern: ${archive}/rollingfile.log.%d{yyyy-MM-dd-hh-mm}.gz
          name: RollingFile-Appender
      loggers:
        logger:
          additivity: 'false'
          appender-ref:
            - level: info
              ref: Console-Appender
            - level: info
              ref: File-Appender
            - level: info
              ref: RollingFile-Appender
          level: debug
          name: se.su.it.courseservice
        root:
          appender-ref:
            ref: File-Appender
          level: info