当前位置: 移动技术网 > IT编程>开发语言>Java > 详解Spring Boot实现日志记录 SLF4J

详解Spring Boot实现日志记录 SLF4J

2019年07月22日  | 移动技术网IT编程  | 我要评论

诱夫:囧妃桃花多,乱舞之风靡异界,se.50sqw

在开发中打印内容,使用 system.out.println() 和 log4j 应当是人人皆知的方法了。

其实在开发中我们不建议使用 system.out 因为大量的使用 system.out 会增加资源的消耗。

而log4j 更为灵活在性能上也相比 system.out 要高,我们可以配置输出级别,可以指定多个日志文件分别记录不同的日志。
使用 system.out 是在当前线程执行的,写入文件也是写入完毕后才继续执行下面的程序。而使用log工具不但可以控制日志是否输出,怎么输出,它的处理机制也是通知写日志,继续执行后面的代码不必等日志写完。

如非必要,建议大家不要使用控制台输出,因为控制台输出没有优先级会显得输出太乱。

个人推荐使用 slf4j(simple logging facade for java)的logback来输出日志,其比log4j 要好,因为他效率更高。

spring boot 提供了一套日志系统,logback是最优先的选择。配置了logback.xml可以利用spring boot提供的默认日志配置:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml"/>
  <logger name="org.springframework.web" level="debug"/>
</configuration>

这样就定义了一个 捕获 org.springframework.web 的日志,日志级别是 debug,上面引用的base.xml 文件内容为:

<?xml version="1.0" encoding="utf-8"?>

<!--
base logback configuration provided for compatibility with spring boot 1.1
-->

<included>
  <include resource="org/springframework/boot/logging/logback/defaults.xml" />
  <property name="log_file" value="${log_file:-${log_path:-${log_temp:-${java.io.tmpdir:-/tmp}}/}spring.log}"/>
  <include resource="org/springframework/boot/logging/logback/console-appender.xml" />
  <include resource="org/springframework/boot/logging/logback/file-appender.xml" />
  <root level="info">
    <appender-ref ref="console" />
    <appender-ref ref="file" />
  </root>
</included>

spring boot的日志系统预先定义了一些系统变量:

pid,当前进程id{log_file},spring boot配置文件(application.properties|.yml)中logging.file的值

${log_path}, spring boot配置文件中logging.path的值

同时默认情况下包含另个appender——一个是控制台,一个是文件,分别定义在console-appender.xml和file-appender.xml中。同时对于应用的日志级别也可以通过application.properties进行定义:

logging.level.org.springframework.web=debug
logging.level.org.springboot.sample=trace

这样相当于我们在logback.xml 中配置的对应的日志级别。名称以logging.level开头,后面跟要输入日志的包名。

如果在 logback.xml 和 application.properties 中定义了相同的配置(如都配置了 org.springframework.web)但是输出级别不同,则实际上 application.properties 的优先级高于 logback.xml *

我们既然使用了maven来管理项目,我们就可以根据不同环境来定义不同的日志输出,在 logback-spring.xml 中使用 springprofile 节点来定义,方法如下:

注意文件名称不是logback.xml,想使用spring扩展profile支持,要以logback-spring.xml命名

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <include resource="org/springframework/boot/logging/logback/base.xml" />
  <logger name="org.springframework.web" level="info"/>
  <logger name="org.springboot.sample" level="trace" />

  <springprofile name="dev">
    <logger name="org.springboot.sample" level="debug" />
  </springprofile>

  <springprofile name="staging">
    <logger name="org.springboot.sample" level="info" />
  </springprofile>

</configuration>

如上我们默认为 org.springboot.sample 定义了trace级别的输出,下面又定义两个 springprofile ,分别是 dev 和 staging,输出级别分别是 debug 和 info
我们可以启动服务的时候指定 profile (如不指定使用默认),如指定staging 的方式为:

 java -jar myapp.jar --spring.profiles.active=staging

下面介绍两种常用的appender

consoleappender

logback使用appender来定义日志输出,在开发过程中最常用的是将日志输出到控制台:

<appender name="consoleappender" class="ch.qos.logback.core.consoleappender">
 <encoder>
  <pattern>.%d{hh:mm:ss.sss} [%thread] %-5level %logger{36} - %msg %n</pattern>
 </encoder>
 <filter class="ch.qos.logback.classic.filter.thresholdfilter">
  <level>trace</level>
 </filter>
</appender> 

表示对日志进行编码

  1. %d{hh:mm:ss.sss}——日志输出时间
  2. %thread——输出日志的进程名字,这在web应用以及异步任务处理中很有用
  3. %-5level——日志级别,并且使用5个字符靠左对齐
  4. %logger{36}——日志输出者的名字
  5. %msg——日志消息
  6. %n——平台的换行符

在这种格式下一条日志的输出结果如下:

 10:12:51.012 [threadname] debug o.c.d.r.util.loggingresponsefilter

rollingfileappender

另一种常见的日志输出到文件,随着应用的运行时间越来越长,日志也会增长的越来越多,将他们输出到同一个文件并非一个好办法。rollingfileappender用于切分文件日志:

 <appender name="dailyrollingfileappender" class="ch.qos.logback.core.rolling.rollingfileappender">
 <file>/data/log/app.log</file>
 <rollingpolicy class="ch.qos.logback.core.rolling.timebasedrollingpolicy">
  <!-- daily rollover -->
  <filenamepattern>rest-demo.%d{yyyy-mm-dd}.log</filenamepattern>
  <!-- keep 30 days' worth of history -->
  <maxhistory>30</maxhistory>     
 </rollingpolicy>
 <encoder>
  <pattern>%d{hh:mm:ss.sss} [%thread] %-5level %logger{35} - %msg %n</pattern>
 </encoder>    
</appender>

其中重要的是rollingpolicy的定义,上例中rest-demo.%d{yyyy-mm-dd}.log定义了日志的切分方式——把每一天的日志归档到一个文件中,30表示只保留最近30天的日志,以防止日志填满整个磁盘空间。同理,可以使用%d{yyyy-mm-dd_hh-mm}来定义精确到分的日志切分方式。

sentry

sentry是一个统一的日志跟踪平台,在传统的日志管理中,都是在服务器上通过tail, vim等工具查看日志,并且不同的日志位置也个不相同,而sentry则是将这些日志(主要是错误日志)通过统一的接口收集起来,并且提供跟踪、管理的功能,使得应用程序的错误、bug能够即时被解决。

sentry提供了java库——raven java,java应用程序能够在捕获异常后将其发送到sentry服务器中,另一方面它包含了各类日志框架的支持,以logbakc为例:

 <dependency>
  <groupid>net.kencochrane.raven</groupid>
  <artifactid>raven-logback</artifactid>
  <version>6.0.0</version>
</dependency>

在logback.xml中定义appender:

 <configuration>
  <appender name="sentry" class="net.kencochrane.raven.logback.sentryappender">
    <dsn>https://publickey:secretkey@host:port/1?options</dsn>
    <tags>tag1:value1,tag2:value2</tags>
    <!-- optional, allows to select the ravenfactory -->
    <!--<ravenfactory>net.kencochrane.raven.defaultravenfactory</ravenfactory>-->
  </appender>
  <root level="warn">
    <appender-ref ref="sentry"/>
  </root>
</configuration>

我们推荐在这个中加入用于过滤 error 级别的日志。

总结

在spring boot 中记录日志只需两步:

1、在 src/main/resources 下面创建logback.xml 文件,并按上面讲述的进行配置。

或者使用最简单的方法在 application 配置文件中配置。

2、在java代码中创建实例,并在需要输出日志的地方使用。

// 在java类中创建 logger 实例
private static final logger logger = loggerfactory.getlogger(springbootsampleapplication.class);
// 在方法中使用日志输出,如
public void logtest() {
  logger.debug("日志输出测试 debug");
  logger.trace("日志输出测试 trace");
  logger.info("日志输出测试 info");
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

验证码:
移动技术网