SpringBoot使⽤slf4j进⾏⽇志记录
Spring Boot使⽤slf4j进⾏⽇志记录
背景
在开发中,我们经常使⽤System.out.println()来打印⼀些信息,但是这样不好,因为⼤量的使⽤会增加资源的消耗。我们实际项⽬中使⽤的是 slf4j 的 logback 来输出⽇志,效率挺⾼的,Spring Boot 提供了⼀套⽇志系统,logback 是最优的选择。当然了,除了选择logback,也可以选择log4j2或者log4j。
内容参考:武哥学编程
不建议System.out.println()来打印消息的原因
底层是System.out返回的对象是PrintStream,PrintStream调⽤out(),代码的内容是synchronized修饰的代码块。
System.out.println()是⼀个同步⽅法,当多处调⽤System.out.println()的时候同步锁影响性能。
System:
/
/ 返回的是静态的PrintStream。
public final static PrintStream out =null;
PrintStream:
...
public void println(){
newLine();
}
...
private void newLine(){
try{
// this指的是静态对象PrintStream
synchronized(this){
ensureOpen();
textOut.flushBuffer();
charOut.flushBuffer();
深圳php网站开发if(autoFlush)
out.flush();
}
}
catch(InterruptedIOException x){
Thread.currentThread().interrupt();
}
catch(IOException x){
trouble =true;
}
}
测试
public static void main(String[] args){
long start1 = System.currentTimeMillis();
for(int i=0;i<100000;i++){
System.out.println("i:"+i);
}
long end1 = System.currentTimeMillis();
System.out.println("有输出语句的耗时:"+(end1-start1));
long start2 = System.currentTimeMillis();
for(int i=0;i<100000;i++){
}
long end2 = System.currentTimeMillis();
System.out.println("⽆输出语句的耗时:"+(end2-start2));
}
有输出语句的耗时:408
⽆输出语句的耗时:0
强制
在⽇常开发或者调试的过程中,尽量使⽤log4j2或者logback这些异步的⽅法,进⾏⽇志的统⼀收集,禁⽌使⽤System.out.println。项⽬上线前也要进⾏全局搜索,防⽌有⼈误提交带有System.out.println的代码。
slf4j
1. slf4j 介绍
引⽤百度百科⾥的⼀段话:
资源分享辅助源码
SLF4J,即简单⽇志门⾯(Simple Logging Facade for Java),不是具体的⽇志解决⽅案,它只服务于各种各样的⽇志系统。按照官⽅的说法,SLF4J是⼀个⽤于⽇志系统的简单Facade,允许 最终⽤户在部署其应⽤时使⽤其所希望的⽇志系统。
这段的⼤概意思是:你只需要按统⼀的⽅式写记录⽇志的代码,⽽⽆需关⼼⽇志是通过哪个⽇志系统, 以什么风格输出的。因为它们取决于部署项⽬时绑定的⽇志系统。例如,在项⽬中使⽤了 slf4j 记录⽇志,并且绑定了 log4j(即导⼊相应的依赖),则⽇志会以 log4j 的风格输出;后期需要改为以 logback 的风格输出⽇志,只需要将 log4j 替换成 logback 即可,不⽤修改项⽬中的代码。这对于第三⽅组件的引⼊的不同⽇志系统来说⼏乎零学习成本,况且它的优点不仅仅这⼀个⽽已,还有简洁的占位符的使⽤ 和⽇志级别的判断。
正因为 sfl4j 有如此多的优点,阿⾥巴巴已经将 slf4j 作为他们的⽇志框架了。在《阿⾥巴巴Java开发⼿册(正式版)》中,⽇志规约⼀项第⼀条就强制要求使⽤ slf4j:
1. 【强制】应⽤中不可直接使⽤⽇志系统(Log4j、Logback)中的API,⽽应依赖使⽤⽇志框架SLF4J中的API,使⽤门⾯模式的⽇志框架,有利
于维护和各个类的⽇志处理⽅式统⼀。
“强制”两个字体现出了 slf4j 的优势,所以建议在实际项⽬中,使⽤ slf4j 作为⾃⼰的⽇志框架。使⽤
slf4j 记录⽇志⾮常简单,直接使⽤ LoggerFactory 创建即可:
import Logger;
import LoggerFactory;
public class  Test  {
private static final  Logger  logger  =  Logger(Test.class);
// ……
}
⼩结- 重要-必看
1. springboot框架默认的⽇志框架slf4j不能提供具体的⽇志实现,具体的⽇志实现是靠log4j、logback等⽇志框架;
2. 阿⾥强制推荐使⽤slf4j⽇志的API。我理解为:可以把slf4j看作Java中的接⼝,log4j和logback可以看作它的实现类;我们在项⽬开
发中调⽤的API均是slf4j的API,这些API都被log4j和logback都⾃⼰实现了;虽然log4j和logback都有⾃⼰的API,但是不推荐被使⽤,不被使⽤的原因是考虑到后期更改⽇志框架的时候修改的地⽅太⼤(⽐如:原先使⽤了log4j的A⽅法,现在⽇志框架改成了Logback可是logback没有A⽅法);
3. springboot默认提供的slf4j是不会把信息打印到指定的⽂件中的,它只会在控制台打印信息。⽽log4j和logback有⾃⼰的xml配置⽂
件,配置⽂件⾥⾯指定了输出⽇志的格式、⽇志⽂件名称、⽇志⽂件的位置等信息;
4. 记住:slf4j是⽤LoggerFactory调⽤getLogger打印⽇志的。 上学的时候,⾃⼰搭建的项⽬使⽤的就是这种⽅式(公司也是使⽤这
种⽅式),但是⾃⼰居然没有丝毫印象;这说明了⾃⼰当时只是实现了功能,并没有思考太多,⽇后必须对遇到的技术点做深⼊反思;
这是⼤学写的项⽬使⽤到了slf4j:
2. l 中对⽇志的配置
Spring Boot 对 slf4j ⽀持的很好,内部已经集成了 slf4j,⼀般我们在使⽤的时候,会对slf4j 做⼀下配置。 l ⽂件是Spring Boot 中唯⼀⼀个需要配置的⽂件,⼀开始创建⼯程的时候是application.properties⽂件,个⼈⽐较喜欢⽤ yml ⽂件,因为 yml ⽂件的层次感特别好,看起来更直观,但是 yml ⽂件对格式要求⽐较⾼,⽐如英⽂冒号后⾯必须要有个空格,否则项⽬估计⽆法启动,⽽且也不报错。⽤ properties 还是 yml 视个⼈习惯⽽定,都可以。本课程使⽤ yml。
我们看⼀下 l ⽂件中对⽇志的配置:
logging:
mysql进入表命令config:  l
level:
urse03.dao:  trace
路径下的 l ⽂件,关于⽇志的相关配置信息,都放在 l ⽂件中了。
logging.level 是⽤来指定具体的 mapper 中⽇志的输出级别,上⾯的配置表⽰
urse03.dao 包下的所有 mapper ⽇志输出级别为 trace,会将操作数据库的 sql 打
印出来,开发时设置成 trace ⽅便定位问题,在⽣产环境上,将这个⽇志级别再设置成 error 级别即可
(本节课不讨论 mapper 层,在后⾯ Spring Boot 集成 MyBatis 时再详细讨论)。
常⽤的⽇志级别按照从⾼到低依次为:ERROR、WARN、INFO、DEBUG。
3. l 配置⽂件解析
在上⾯ l ⽂件中,我们指定了⽇志配置⽂件 l , l ⽂件中
主要⽤来做⽇志的相关配置。在 l 中,我们可以定义⽇志输出的格式、路径、控制台输出
格式、⽂件⼤⼩、保存时长等等。下⾯来分析⼀下:
3.1 定义⽇志输出格式和存储路径
<configuration>
<property  name="LOG_PATTERN"  value="%date{HH:mm:ss.SSS}[%thread]%-5l evel
%logger{36}-%msg%n"  />
<property  name="FILE_PATH"  value="D:/logs/course03/demo.%d{yyyy-MM- dd}.%i.log"/>
</configuration>
我们来看⼀下这个定义的含义:⾸先定义⼀个格式,命名为 “LOG_PATTERN”,该格式中 %date 表⽰⽇期, %thread 表⽰线程名, %-5level 表⽰级别从左显⽰5个字符宽度, %logger{36} 表⽰ logger 名
字最长36个字符, %msg 表⽰⽇志消息, %n 是换⾏符。
然后再定义⼀下名为 “FILE_PATH” ⽂件路径,⽇志都会存储在该路径下。 %i 表⽰第 i 个⽂件,当⽇志⽂件达到指定⼤⼩时,会将⽇志⽣成到新的⽂件⾥,这⾥的 i 就是⽂件索引,⽇志⽂件允许的⼤⼩可以
设置,下⾯会讲解。这⾥需要注意的是,不管是 windows 系统还是 Linux 系统,⽇志存储的路径必须
要是绝对路径。
3.2 定义控制台输出
<configuration>
<appender name="CONSOLE"class="ch.ConsoleAppender">
<encoder>
<!--按照上⾯配置的LOG_PATTERN来打印⽇志-->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
使⽤ 节点设置个控制台输出( class=“ch.ConsoleAppender” )的
配置,定义为 “CONSOLE”。使⽤上⾯定义好的输出格式(LOG_PATTERN)来输出,使⽤ ${} 引⽤进来即可。
3.3 定义⽇志⽂件的相关参数
<configuration>
<appender  name="FILE"class="ch.olling.RollingFileAppender">
<rollingPolicy class="ch.olling.TimeBasedRollingPolicy">
<!--按照上⾯配置的FILE_PATH路径来保存⽇志-->
<fileNamePattern>${FILE_PATH}</fileNamePattern>
<!--⽇志保存15天-->
<maxHistory>15</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.olling.SizeAndTimeBasedFNATP">
<!--单个⽇志⽂件的最⼤,超过则新建⽇志⽂件存储-->
<maxFileSize>10MB</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
<encoder>
<!--按照上⾯配置的LOG_PATTERN来打印⽇志-->
<pattern>${LOG_PATTERN}</pattern>
</encoder>
</appender>
</configuration>
使⽤ 定义⼀个名为 “FILE” 的⽂件配置,主要是配置⽇志⽂件保存的时间、单个⽇志⽂件
存储的⼤⼩、以及⽂件保存的路径和⽇志的输出格式。
3.4 定义⽇志输出级别
<configuration>
properties文件用什么打开<logger  name="urse03"  level="INFO"/>
<root  level="INFO">
<appender-ref  ref="CONSOLE"/>
activiti工作流与业务整合
<appender-ref  ref="FILE"/>
rmit服装设计排名
</root>
</configuration>
有了上⾯那些定义后,最后我们使⽤ 来定义⼀下项⽬中默认的⽇志输出级别,这⾥定义级
别为 INFO,然后针对 INFO 级别的⽇志,使⽤ 引⽤上⾯定义好的控制台⽇志输出和⽇志⽂件
的参数。这样 l ⽂件中的配置就设置完了。
4. 使⽤Logger在项⽬中打印⽇志
在代码中,我们⼀般使⽤ Logger 对象来打印出⼀些 log 信息,可以指定打印出的⽇志级别,也⽀持占位符,很⽅便。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。