上一篇博文记录了再springboot项目中读取属性文件中配置的属性,本文学习在springboot项目中记录日志。
日志记录在项目中是很常见的一个功能了,对排查问题有很大帮助,也可以做分类分析及统计。SpringBoot内部使用的是Commons Logging做日志的记录,但是对其他的日志框架也提供了默认的配置,如:Java util Logging,Log4j2,Logback,每一种情况下日志记录器都预先配置为使用控制台输出和可选的文件输出。
日志格式及内容
如果我们的SpringBoot项目使用的是Starters启动器,默认使用LogBack做日志记录。如我们启动项目时在控制台上看到的
输出的信息有以下几点
日期和时间:精确到毫秒,如 2019-01-24 14:03:14.260
日志级别:日志级别有ERROR,WARN,INFO,DEBUG,TRACE,如上边的INFO
进程号:如上边的 10348
分割线:如上边的 ---
线程名:如上边用[]括起来的
日志名:一般使用的是代码的类名
日志信息:我们在代码中要输出的内容
日志输出
Spring Boot中默认配置了ERROR
、WARN
和INFO
级别的日志输出到控制台,我们也是可以修改的日志级别的,比如我们修改为debug级别,有两种方式
1 使用命令 $ java -jar myapp.jar --debug
2 在application.properties中添加配置debug=true 开启debug,此配置只会对核心Logger(如内嵌的tomcat容器、hibernate、spring)有效,但是我们自己应用的日志并不会输出为DEBUG级别,需要自己配置,如 logger.level.root=debug
日志级别
可以通过logger.level.*=LEVEL来改变对应日志级别,如
logging.level.root=warn
logging.level.org.springframework.web=info
logging.level.org.hibernate=error
######修改mubatis日志级别
logging.level.org.mybatis=info
#mapper接口为debug级别
logging.level.mybatis mapper接口所在包=debug
输出文件
SpringBoot默认只在控制台输出日志信息,如果想把日志信息写入文件中记录,需要在application.properties中配置,如
##文件存放路径
logging.path=/usr/local/log
##写入的文件
logging.file=myapp.log
##日志文件大小,超过大小时会在新的文件中记录
logging.file.max-size=10Mb
##日志保存时间 天
logging.file.max-history=15
集成log4j
SpringBoot在高版本中已经不支持log4j了,支持的是log4j2。在pom.xml中引入需要的log4j2的jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<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-log4j2</artifactId>
</dependency>
由于web依赖包中已经有了log的依赖,所以我们选去掉web中的log依赖,避免jar包冲突。
然后配置log4j2的属性,在官方文档中可以看到集成的日志文件的命名如下
在resources目录下创建一个log4j2-spring.xml文件
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<properties>
<!-- 文件输出格式 -->
<property name="PATTERN">%d{yyyy-MM-dd HH:mm:ss,SSS} |-%-5level [%thread] %c [%L] -| %msg%n</property>
</properties>
<appenders>
<!--添加一个控制台追加器-->
<Console name="Console" target="system_out">
<PatternLayout pattern="${PATTERN}" />
</Console>
<!--添加一个文本追加器,文件位于E:\\logs目录下,名为HelloWorld.log-->
<File name="File" fileName="E:\\logs\\HelloWorld.log">
<PatternLayout>
<pattern>${PATTERN}</pattern>
</PatternLayout>
<Policies>
<SizeBasedTriggeringPolicy size="10 MB" />
</Policies>
</File>
</appenders>
<loggers>
<root level="info">
<appenderref ref="File" />
<!--为了直观,在控制天中也输出info级别的日志-->
<appenderref ref="Console" />
</root>
<!--把org.springframework包下的所有日志输出到log文件,additivity="false"表示不输出到控制台-->
<Logger name="org.springframework" level="debug" additivity="true">
<appenderRef ref="File" />
</Logger>
</loggers>
</configuration>
正式项目中,我们需要对上述xml文件中的配置信息做些修改。写一个控制器访问,看看输出的信息
@RestController
public class HelloController {
private static final Logger logger = LoggerFactory.getLogger(HelloController.class);
@RequestMapping("/hello")
public String hello(){
logger.info("使用log4j输出日志!");
return "helloworld";
}
}
控制台和生成的log文件中输出的信息一致
由于个人能力有限,难免有错误之处,敬请读者指正,不胜感激。