SpringBoot日志配置log4j以及日志格式,切割日志等

2021-07-27 3880点热度 0人点赞 0条评论

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...

详见:https://blog.terrynow.com/2022/05/26/springboot-2-7-x-error-status-logger-log4j2-cound-not-found-a-logging-implemention-sovled/

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论