详解Spring Boot实现日志记录 SLF4J

在开发中打印内容,使用 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");
}

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

(0)

相关推荐

  • 详解Spring Boot 使用slf4j+logback记录日志配置

    在学校的时候使用Java进行开发,工作之后由于项目组采用.net进行开发就转到.net了.最近开始学习Java,对一些新东西进行学习.开始看SpringBoot,对遇到的问题进行记录. 学习新的东西最好从例子开始,只看文档太枯燥,但是文档还是必须要看的. spring boot主要的目的是: 为 Spring 的开发提供了更快更广泛的快速上手 使用默认方式实现快速开发 提供大多数项目所需的非功能特性,诸如:嵌入式服务器.安全.心跳检查.外部配置等 SLF4J是为各种loging APIs提供一个

  • 详解Spring Boot实现日志记录 SLF4J

    在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人皆知的方法了. 其实在开发中我们不建议使用 System.out 因为大量的使用 System.out 会增加资源的消耗. 而Log4j 更为灵活在性能上也相比 System.out 要高,我们可以配置输出级别,可以指定多个日志文件分别记录不同的日志. 使用 System.out 是在当前线程执行的,写入文件也是写入完毕后才继续执行下面的程序.而使用Log工具不但可以控制日志是否输出,怎么输出,它的处理机

  • 详解Spring Boot使用系统参数表提升系统的灵活性

    目录 一.使用系统参数表的好处 二.系统参数表的表结构 三.系统参数表在项目中的使用 3.1.Entity类 3.2.Dao类 3.3.Service类 3.4.ServiceImpl类 3.5.全局配置服务类 3.6.启动时加载 3.7.在服务实现类中访问系统参数 一.使用系统参数表的好处 ​​以数据库表形式存储的系统参数表比配置文件(.properties文件或.yaml文件)要更灵活,因为无需重启系统就可以动态更新. ​系统参数表可用于存储下列数据: 表字段枚举值,如下列字段: `ques

  • 详解Spring Boot 访问Redis的三种方式

    目录 前言 开始准备 RedisTemplate JPA Repository Cache 总结 前言 最近在极客时间上面学习丁雪丰老师的<玩转 Spring 全家桶>,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同, 分别是这三种方式 RedisTemplate JPA Repository Cache 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis, 主要命令如下 docker pull redis doc

  • 详解Spring boot Admin 使用eureka监控服务

    前言 最近刚好有空,来学习一下如何搭建spring boot admin环境.其中遇到很多的坑. 网上大多都是使用admin-url的方式直接来监控的,感觉一点也不灵活,这不是我想要的结果,所以本篇介绍借助eureka服务注册和发现功能来灵活监控程序. 本文主要记录spring boot admin的搭建过程,希望能有所帮助.其实非常的简单,不要被使用常规方式的误导! 环境介绍 IDE:intellij idea jdk: java8 maven:3.3.9 spring boot:1.5.6

  • 详解spring boot jpa整合QueryDSL来简化复杂操作

    前言 使用过spring data jpa的同学,都很清楚,对于复杂的sql查询,处理起来还是比较复杂的,而本文中的QueryDSL就是用来简化JPA操作的. Querydsl定义了一种常用的静态类型语法,用于在持久域模型数据之上进行查询.JDO和JPA是Querydsl的主要集成技术.本文旨在介绍如何使用Querydsl与JPA组合使用.JPA的Querydsl是JPQL和Criteria查询的替代方法.QueryDSL仅仅是一个通用的查询框架,专注于通过Java API构建类型安全的SQL查

  • 详解Spring Boot中使用Flyway来管理数据库版本

    如果没有读过上面内容的读者,有兴趣的可以一阅.在上面的使用JdbcTemplate一文中,主要通过spring提供的JdbcTemplate实现对用户表的增删改查操作.在实现这个例子的时候,我们事先在MySQL中创建了用户表.创建表的过程我们在实际开发系统的时候会经常使用,但是一直有一个问题存在,由于一个系统的程序版本通过git得到了很好的版本控制,而数据库结构并没有,即使我们通过Git进行了语句的版本化,那么在各个环境的数据库中如何做好版本管理呢?下面我们就通过本文来学习一下在Spring B

  • 详解spring boot starter redis配置文件

    spring-boot-starter-Redis主要是通过配置RedisConnectionFactory中的相关参数去实现连接redis service. RedisConnectionFactory是一个接口,有如下4个具体的实现类,我们通常使用的是JedisConnectionFactory. 在spring boot的配置文件中redis的基本配置如下: # Redis服务器地址 spring.redis.host=192.168.0.58 # Redis服务器连接端口 spring.

  • 实例详解Spring Boot实战之Redis缓存登录验证码

    本章简单介绍redis的配置及使用方法,本文示例代码在前面代码的基础上进行修改添加,实现了使用redis进行缓存验证码,以及校验验证码的过程. 1.添加依赖库(添加redis库,以及第三方的验证码库) <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> </dependency&

  • 详解spring boot rest例子

    简介:本文将帮助您使用 Spring Boot 创建简单的 REST 服务. 你将学习 什么是 REST 服务? 如何使用 Spring Initializr 引导创建 Rest 服务应用程序? 如何创建获取 REST 服务以检索学生注册的课程? 如何为学生注册课程创建 Post REST 服务? 如何利用 postman 执行 rest 服务? 本教程使用的 rest 服务 在本教程中,我们将使用适当的 URI 和 HTTP 方法创建三个服务: @GetMapping("/ students

  • 详解Spring Boot 目录文件结构

    1.目录结构 src/main/java:存放代码 src/main/resources resources:(Spring Boot 默认的)存放资源文件 static:(Spring Boot 默认的)存放静态文件,比如 css.js.image, (访问方式 http://localhost:8080/js/main.js) public:(Spring Boot 默认的)存放公共文件 templates:(用户自己定义的,可以随便取名,但这里使用公认的文件名)存放静态页面,比如 jsp.

随机推荐