Spring boot 使用log4j2.xml将日志写入spring引导项目中的文件和控制台
我试图创建一个简单的spring启动应用程序,在这个应用程序中,日志应该同时在控制台和项目文件夹之外的文件中打印。日志可以在控制台中打印,但不能写入文件。我指定了文件位置(文件未创建,我认为文件会自动生成) 这是添加的依赖项Spring boot 使用log4j2.xml将日志写入spring引导项目中的文件和控制台,spring-boot,log4j2,Spring Boot,Log4j2,我试图创建一个简单的spring启动应用程序,在这个应用程序中,日志应该同时在控制台和项目文件夹之外的文件中打印。日志可以在控制台中打印,但不能写入文件。我指定了文件位置(文件未创建,我认为文件会自动生成) 这是添加的依赖项 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spr
<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>
这是控制台:
我要做的第一件事是尝试从类路径中删除logback绑定,如所述 因此,您的
pom.xml
配置最终将包含一个排除项,如:
org.springframework.boot
应用程序编程接口。SpringBoot已经配置为将SL4J与您在类路径上配置的任何绑定器一起使用(在本例中是log4j)
因此,我不会使用org.apache.logging.log4j.Logger
而是将org.slfj.Logger
用于您的Logger类,并使用org.slf4j.LoggerFactory.getLogger()创建它。直接使用log4j类的好处是,您可以在slf4j下切换绑定,而无需更改所有代码。以防万一您以后决定使用logback或其他方法
如果您对pom进行更改,并使用slf4j API,我认为spring boot自动配置将加载您的配置并开始记录到文件appender和控制台。请遵循以下方法,这里我为单个记录器配置了两个appender。如果使用该记录器名称记录任何内容,所有日志消息都将发送到这两个位置。在您的情况下,控制台和文件
<logger name="pushnotification" level="debug" additivity="false">
<appender-ref ref="NOTIFICATION-FILE-APPENDER" />
<appender-ref ref="NOTIFICATION-CONSOLE-APPENDER" />
</logger>
<appender name="NOTIFICATION-CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%date{yyyy-MM-dd HH:mm:ss}][%level][%c][%t] - %msg%n
</pattern>
</encoder>
</appender>
<appender name="NOTIFICATION-FILE-APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logs.home}/applogs/notification.log</file>
<append>true</append>
</appender>
[%date{yyyyy-MM-dd HH:MM:ss}][%level][%c][%t]-%msg%n
${logs.home}/applogs/notification.log
真的
您可以执行以下操作:
应用程序属性
您也可以在应用程序中使用AOP进行中心日志记录…我将尝试从类路径中删除logback绑定,如所述。在文档中,他们建议从maven依赖项中排除logging starter。我要做的另一件事是使用来自的logger API,而不是直接使用log4j
。Spring boot已经配置为将slf4j与类路径上的任何绑定一起使用。因此,输出中会出现重复绑定错误。因此,我将为您的Logger类使用org.slfj.Logger
,并使用org.slf4j.LoggerFactory.getLogger()
创建它。这样做的好处是直接使用Log4J类,您可以在不改变所有代码的情况下切换SLF4J下的绑定。@ Tayl Oror Cor考虑将注释归纳为答案,因为它们是正确的,并且将有利于该职位的未来读者。<代码>日志。文件< /代码>应该是“代码>日志记录。文件。
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);
}
}
<logger name="pushnotification" level="debug" additivity="false">
<appender-ref ref="NOTIFICATION-FILE-APPENDER" />
<appender-ref ref="NOTIFICATION-CONSOLE-APPENDER" />
</logger>
<appender name="NOTIFICATION-CONSOLE-APPENDER" class="ch.qos.logback.core.ConsoleAppender">
<encoder
class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<pattern>[%date{yyyy-MM-dd HH:mm:ss}][%level][%c][%t] - %msg%n
</pattern>
</encoder>
</appender>
<appender name="NOTIFICATION-FILE-APPENDER"
class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${logs.home}/applogs/notification.log</file>
<append>true</append>
</appender>
#####LOGGING. . . .
logging.level.org.springframework.web=ERROR
logging.level.com.hsc.adauth.*=DEBUG
# Logging pattern for the console
logging.pattern.console="%d{yyyy-MM-dd HH:mm:ss} - %msg%n"
# Logging pattern for file
logging.pattern.file= "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
#output to a temp_folder/file(give your file path here)
logging.file=${java.io.tmpdir}/application.log