无法在 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("....");
请编辑 fileName
和 filePattern
。您写了绝对路径,因此日志文件位于 [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
我有一个 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("....");
请编辑 fileName
和 filePattern
。您写了绝对路径,因此日志文件位于 [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