百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

SpringBoot 项目中使用日志及线上日志相关配置

toyiye 2024-06-21 12:19 12 浏览 0 评论

在 SpringBoot 项目开发及线上运行中免不了使用日志,日志可以帮忙我们在开发和解决线上BUG时去定位问题,这篇文章主要带大家了解一下 SpringBoot 中日志如何使用及线上日志该怎么配置。

接触过日志的同学比较困扰的是,日志好像很多种,Apache Commons Logging、Slf4j、Log4j、Log4j2、Logback等等,完全搞不懂应该用哪个以及怎么用。

其实我们可以把日志分为我们熟悉的接口和实现类。

  1. 日志接口: Apache Commons Logging、Slf4j

主要是定义日志的接口规范,并不提供日志底层的具体实现逻辑,类似于我们定义的service接口。

  1. 日志实现: Log4j、Log4j2、Logback

这些则是日志的具体实现,包括实现了日志级别的控制、日志打印格式、日志输出形式(输出到数据库、输出到文件、输出到控制台等),类似于我们的service实现类。

为什么要把日志定义接口和实现类?

其实是方便我们在相同日志接口下的不同日志框架实现自由切换,不需要改动任何代码。

一、SpringBoot 种日志使用

  1. 依赖引入

如果已经引入了spring-boot-starter或spring-boot-starter-web则不需要再引入,已经包含其中。

xml复制代码<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-logging</artifactId>
</dependency>

SpringBoot默认使用的日志框架是Logback,也是目前最常使用的日志框架,如果想使用其他日志框架需要单独引入依赖并写相应的配置,这里我们就直接使用默认的Logback。

  1. 打印日志
java复制代码import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class LoggerController {
    // 1. 得到日志对象
    private Logger logger = LoggerFactory.getLogger(LoggerController.class);
    @RequestMapping("/logger")
    public String logger() {
        // 2. 日志打印
        logger.trace("日志级别: trace");
        logger.debug("日志级别: debug");
        logger.info("日志级别: info");
        logger.warn("日志级别: warn");
        logger.error("日志级别: error");
        return "logger";
    }
}

首先通过slf4j包提供的日志工厂得到日志的实例,再通过这个实例来打印不同级别的日志。

如果我们项目中有使用lombok,可以使用它所提供的注解来得到这个日志实例,使用如下:

java复制代码import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j // 1. 通过lombok的`@Slf4j`得到日志实例
public class LoggerController {
    @RequestMapping("/logger")
    public String logger() {
        // 2. 日志打印
        log.trace("日志级别: trace");
        log.debug("日志级别: debug");
        log.info("日志级别: info");
        log.warn("日志级别: warn");
        log.error("日志级别: error");
        return "logger";
    }
}

最终打印结果:

二、日志级别了解及配置

可以看到上面明明我们打印了5个级别的日志,但trace和debug级别的日志没有打印,这是因为springboot默认只会打印info及更高级别的日志。

1. 日志级别:

  1. trace:级别最低
  2. debug:调试级别日志
  3. info:普通打印信息基本
  4. warn:警告信息
  5. error:错误信息
  6. fatal:灾难级(代码异常退出执行等)

2. 配置SpringBoot打印日志级别

在application.yml中通过logging.level来配置

root是所有日志级别的打印

sql、web是分别设置sql或web相关的日志级别

另外还可以分别对不同的包设置不同的日志打印级别

如上所示,分别对我们开发的根包和spring框架的打印级别进行配置

3. SpringBoot 日志相关配置

上面我们配置了日志打印级别,还可以配置日志的打印目录和文件名,具体如下:

yml复制代码logging:
  level:
    com.jk: debug
    org.springframework: warn
  file:
    path: ./logs # 配置日志打印目录,默认名称为:spring.log
    name: ./logs/SpringLogging.log # 配置日志打印目录和名称,和上面的path选一即可

三、线上日志配置

日志的配置除了在application.yml里面配置还可以在xml中单独配置,并且xml中配置更加灵活,如线上日志我们需要根据日期及日志级别来分成不同的日志文件,也是为了方便我们在线上查日志。

SpringBoot中加载日志配置顺序:logback.xml->application.yml->logback-spring.xml

我们使用logback.xml来配置,具体配置如下:

logback.xml:

java复制代码<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!-- 日志存放路径 -->
   <property name="log.path" value="./logs" />
    <!-- 日志输出格式 -->
   <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />

   <!-- 控制台输出 -->
   <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <pattern>${log.pattern}</pattern>
      </encoder>
   </appender>
   
   <!-- 系统日志输出 -->
   <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${log.path}/sys-info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
         <fileNamePattern>${log.path}/sys-info.%d{yyyy-MM-dd}.log</fileNamePattern>
         <!-- 日志最大的历史 60天 -->
         <maxHistory>60</maxHistory>
      </rollingPolicy>
      <encoder>
         <pattern>${log.pattern}</pattern>
      </encoder>
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
   </appender>
   
   <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${log.path}/sys-error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/sys-error.%d{yyyy-MM-dd}.log</fileNamePattern>
         <!-- 日志最大的历史 60天 -->
         <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
         <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
         <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
   
   <!-- 用户访问日志输出  -->
    <appender name="sys-user" class="ch.qos.logback.core.rolling.RollingFileAppender">
      <file>${log.path}/sys-user.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 按天回滚 daily -->
            <fileNamePattern>${log.path}/sys-user.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
   
   <!-- 系统模块日志级别控制  -->
   <logger name="com.jk" level="info" />
   <!-- Spring日志级别控制  -->
   <logger name="org.springframework" level="warn" />

   <root level="info">
      <appender-ref ref="console" />
   </root>
   
   <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info" />
        <appender-ref ref="file_error" />
    </root>
   
   <!--系统用户操作日志-->
    <logger name="sys-user" level="info">
        <appender-ref ref="sys-user"/>
    </logger>
</configuration> 

这个配置线上可以直接使用,其中大家需要关注的就是:

  1. 日志打印目录修改
xml复制代码<property name="log.path" value="./logs" />
  1. 日志打印级别配置
xml复制代码<!-- 系统模块日志级别控制  -->
<logger name="com.jk" level="info" />
<!-- Spring日志级别控制  -->
<logger name="org.springframework" level="warn" />

name配置为自己的开发根包(即启动类所在包),level配置为自己想要打印的日志级别。

以上就是在SpringBoot项目中使用日志即线上日志的相关配置,其实整体非常简单,特别是使用lombok来自动注入日志实例,我们直接打印即可,线上也就是配置一下打印目录等。


相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码