无法在 Java 8 Spring 应用程序中使用 Log4j2 Slf4j 进行文件登录

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

我有一个 java spring 5 应用程序部署到 Tomcat 8.5.15。我现在正在尝试将日志记录框架升级到 Log4J2,我也使用 Slf4J。现在的问题是我似乎无法登录到文件(尽管它创建了一个文件)。它只是记录到控制台,为什么?这是一个多模块 Maven 项目。在主要 "pom" 中,我使用这些依赖项(例如):

        <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>

这里是 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>

编辑 这是配置的第二个版本(这会生成一个包含少量内容的文件,但不是来自我的代码......来自测试内容 "DefaultTestContextBootstrapper"。 ..) 日志在这里结束: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>

在 java 代码中,我尝试这样记录:

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

请编辑 fileNamefilePattern。您写了绝对路径,因此日志文件位于 [System root]/logs/

原样

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

未来 案例 1. 使用相对路径 如果你写相对路径那么日志将保存在 [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"

案例2.使用绝对路径 如果你写绝对路径那么日志将保存在 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"

问题是我的 maven poms 并不完美。我在根 pom 中声明了 log4j2,但没有在模块中声明,所以 jars (log4j2...) 不在最终 war 文件的类路径中,但是 log4j (1) 在那里,所以我有从几个 poms 中摆脱这种依赖。然后我使用这个配置让它工作 (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