SpringBoot默认使用Logback,没有使用log4j作为日志系统,而我一直使用log4j作为日志工具,习惯了他的配置了,例如自定义的日志格式,按文件大小切割日志文件,保留日志文件数等等。
pom配置
因为SpringBoot的spring-boot-starter-web默认加了依赖:spring-boot-starter-logging,如图:
所以我们要做两件事情,首先排除spring-boot-starter-logging,然后增加spring-boot-starter-log4j
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!--默认logging,需要log4j的话,这里排除,然后下面加spring-boot-starter-log4j-->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.3.8.RELEASE</version>
</dependency>
增加log4j.properties,和application.properties放在同一层就好了,log4j会自动检测到,并启用配置
#输出到文件,如果要输出到文件,可以取消输出到控制台,改成文件
#log4j.rootLogger=ERROR, file
#切换到输出到控制台(类似System.out.println)
log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]%c{1} - %m%n
log4j.appender.file=org.apache.log4j.RollingFileAppender
# 日志的路径
log4j.appender.file.File=/opt/logs/test.log
# 每个日志的大小 可以用MB的单位
log4j.appender.file.MaxFileSize=100KB
# 超过上面大小的文件,会分割,超过这个MaxBackupIndex后,会删除老的日志文件
log4j.appender.file.MaxBackupIndex=5
log4j.appender.file.layout=org.apache.log4j.PatternLayout
# 日志的输出样式
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p]%c{1} - %m%n
log4j.logger.java.sql.PreparedStatement=ERROR
#log4j.logger.org.springframework.security=DEBUG
如何使用
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class ScheduledTask {
private static final Log log = LogFactory.getLog(ScheduledTask.class);
//每30秒執行一次
@Async()
@Scheduled(fixedRate = 1000 * 3)
public void testSchedule0() {
log.warn("testSchedule0 called: " + Thread.currentThread().getName());
}
}
这样log4j的日志就出现了:
2021-07-25 17:55:42 [WARN]ScheduledTask - testSchedule0 called: task-1 2021-07-25 17:55:45 [WARN]ScheduledTask - testSchedule0 called: task-2 2021-07-25 17:55:48 [WARN]ScheduledTask - testSchedule0 called: task-3 2021-07-25 17:55:51 [WARN]ScheduledTask - testSchedule0 called: task-4
另外如果在比较高版本的SringBoot下(例如2.7.x)上出现如下错误:
ERROR StatusLogger Log4j2 could not find a logging implementation. Please add log4j-core to the classpath. Using SimpleLogger to log to the console...
文章评论