0

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("....");
Jojje
  • 1,749
  • 3
  • 25
  • 44

2 Answers2

1

Please edit fileName and filePattern. You wrote absolute path so the log file made at [System root]/logs/

AS-IS

fileName="logs/app-info.log"
filePattern="logs/app-info-%d{yyyy-MM-dd}.log"

TO-BE Case 1. Using relative path If you write relative path then the log will saved at [project root directory]/LOG_FILE_DIR/LOG_FILE_NAME.log

fileName="./LOG_FILE_DIR/LOG_FILE_NAME.log"
filePattern="./LOG_FILE_DIR/LOG_FILE_NAME.log.gz"

Case 2. Using absolute path If you write absolute path then the log will saved at C:/LOG_FILE_DIR/LOG_FILE_NAME.log

fileName="./LOG_FILE_DIR/LOG_FILE_NAME.log"
filePattern="C:/LOG_FILE_DIR/LOG_FILE_NAME.log.gz"
Han
  • 263
  • 1
  • 8
  • @Jojje Do you want to print the log file name pattern like `app-info-%d{yyyy-MM-dd}.log` ? – Han May 05 '20 at 18:53
  • @Jojje If you want to file name pattern like `app-info-%d{yyyy-MM-dd}.log` then replace `fileName` value from `app-info.log` to `app-info-%d{yyyy-MM-dd}.log`. I updated my answer. please re-check it. – Han May 05 '20 at 19:01
  • @Jojje Second answer for your second question. `The pattern of the file name of the archived log file.`, so your log file will be archived after 1 hour because you are using `TimeBasedTriggeringPolicy`. please visit [reference documentation](https://people.apache.org/~rgoers/log4j2/manual/appenders.html) and search about `TimeBasedTriggeringPolicy Parameters` – Han May 05 '20 at 19:05
  • I must have i "date" in the pattern, or else get exception from Log4J, can't start up. – Jojje May 06 '20 at 06:48
  • @Jojje Yes it is. Isn't that what you want...? – Han May 06 '20 at 09:50
  • @Jojje Ah~ `LOG_FILE_NAME` mean 'you can customize it what you want' so, If you should use `date` pattern, then you can replace `LOG_FILE_NAME` to what you want! `LOG_FILE_DIR` too – Han May 06 '20 at 23:21
0

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
Jojje
  • 1,749
  • 3
  • 25
  • 44