【发布时间】:2019-09-16 15:27:14
【问题描述】:
我尝试创建简单的 Spring Boot 应用程序,其中日志应在控制台和项目文件夹之外的文件中打印。日志能够在控制台中打印但不能写入文件。我指定了文件位置(文件没有创建,我认为文件会自动生成)
这是添加的依赖项
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- Add Log4j2 Dependency -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
</dependencies>
这里是 log4j.xml 文件(位置 src/main/resources/log4j2.xml)
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN" monitorInterval="30">
<Properties>
<Property name="LOG_PATTERN">
%d{yyyy-MM-dd HH:mm:ss.SSS} %5p ${hostName} --- [%15.15t] %-40.40c{1.} : %m%n%ex
</Property>
</Properties>
<Appenders>
<Console name="ConsoleAppender" target="SYSTEM_OUT"
follow="true">
<PatternLayout pattern="${LOG_PATTERN}" />
</Console>
<!-- Rolling File Appender -->
<RollingFile name="FileAppender"
fileName="/home/ubuntu/Documents/eclipse/logs/log4j2-demo.log"
filePattern="logs/log4j2-demo-%d{yyyy-MM-dd}-%i.log">
<PatternLayout>
<Pattern>${LOG_PATTERN}</Pattern>
</PatternLayout>
<Policies>
<TimeBasedTriggeringPolicy interval="1" />
<SizeBasedTriggeringPolicy size="10MB" />
</Policies>
<DefaultRolloverStrategy max="10" />
</RollingFile>
</Appenders>
<Loggers>
<Root level="debug">
<AppenderRef ref="ConsoleAppender" />
<AppenderRef ref="FileAppender" />
</Root>
</Loggers>
</Configuration>
我在主类中添加了日志功能
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 LoggingApplication {
private static final Logger logger = LogManager.getLogger(LoggingApplication.class);
public static void main(String[] args) {
logger.info("in main class");
logger.info("info logging is printed");
logger.debug("logger debud is worked");
logger.warn("logging warn is worked");
SpringApplication.run(LoggingApplication.class, args);
}
}
【问题讨论】:
-
我会尝试从 in the documentation 概述的类路径中删除 logback binder。在文档中,他们建议从您的 Maven 依赖项中排除日志记录启动器。
-
我要做的另一件事是直接使用来自
slf4j的记录器API,而不是直接使用log4j。 Spring boot 已经配置为将 slf4j 与类路径上的任何绑定器一起使用。因此,您的输出中出现重复绑定错误。因此,我将使用org.slfj.Logger作为您的记录器类并使用org.slf4j.LoggerFactory.getLogger()创建它。与直接使用 log4j 类相比,这样做的好处是您可以在 slf4j 下切换活页夹,而无需更改所有代码。 -
@TaylorO'Connor 考虑将评论总结为答案,因为它们是正确的,并且将使这篇文章的未来读者受益。
标签: spring-boot log4j2