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...
文章评论