首页 > 其他分享 >后台管理系统的通用权限解决方案(六)SpringBoot整合Logback实现日志记录

后台管理系统的通用权限解决方案(六)SpringBoot整合Logback实现日志记录

时间:2024-10-29 15:47:07浏览次数:6  
标签:... SpringBoot Logback hsgx 日志 logback logger Logger

1 Logback介绍

1.1 Logback的组件

由上图可知,Logback和Log4j都是slf4j规范的具体实现。在程序中直接调用Logback的API其实都是slf4j规范定义好的API,其底层则是真正的日志实现组件—Logback或者Log4j。

Logback构建在三个主要的类上:LoggerAppenderLayout。这三个不同类型的组件一起作用能够让开发者根据消息的类型以及日志的级别来打印日志。

  • Logger:作为日志的记录器,主要用于存放日志对象,也可以定义日志类型、级别。各个Logger都会被关联到一个LoggerContext上。
  • Appender:主要用于指定日志输出的目的地,目的地可以是控制台、文件、 数据库等。
  • Layout:负责把事件转换成字符串,输出格式化的日志信息。

1.2 Logback的层级

Logback中的每一个Logger都依附在一个LoggerContext上,它负责产生Logger,并且通过一个树状的层级结构来进行管理。

一个Logger被当作为一个实体,它们的命名是大小写敏感的,并且遵循以下规则:

  • 如果一个Logger的名字加上一个.,作为另一个Logger名字的前缀,那么该Logger就是另一个Logger的祖先。例如名为com.hsgxLogger是名为com.hsgx.serviceLogger的父级。

  • 如果一个Logger与另一个Logger之间没有其它的Logger,则该Logger就是另一个Logger的父级。例如名为comLogger是名为com.hsgxLogger的父级,是名为com.hsgx.service的logger的祖先。

在Logback中有一个Root Logger,它是层次结构的最高层,它是一个特殊的Logger,因为它是每一个层次结构的一部分。

1.3 Logback日志输出等级

Logback的日志输出等级分为:TRACE,DEBUG,INFO,WARN,ERROR。

如果一个给定的Logger没有指定日志输出等级,那么它就会继承离它最近的一个祖先的层级。

为了确保所有的Logger都有一个日志输出等级,Root Logger会有一个默认输出等级————DEBUG。

1.4 Logback初始化步骤

  • 1)Logback会在类路径下寻找名为logback-test.xml的文件
  • 2)如果没有找到,会继续寻找名为logback.groovy的文件
  • 3)如果没有找到,会继续寻找名为logback.xml的文件
  • 4)如果没有找到,会在类路径下寻找文件META-INFO/services/ch.qos.logback.classic.spi.Configurator,该文件的内容为实现了Configurator接口的实现类的全限定类名
  • 5)如果以上都没有成功,logback会通过BasicConfigurator为自己进行配置,并且日志将会全部在控制台打印出来。

最后一步的目的是为了保证在所有的配置文件都没有被找到的情况下,提供一个默认的配置。

2 Logback案例

  • 1)创建maven工程logback-demo,并配置其pom.xml文件如下
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.hsgx</groupId>
    <artifactId>logback-demo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>
    <dependencies>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.2.3</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>
</project>
  • 2)创建单元测试类,对Logback的特性进行测试
package com.hsgx.logback.test;

import ch.qos.logback.classic.Level;
import ch.qos.logback.classic.LoggerContext;
import ch.qos.logback.core.util.StatusPrinter;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class LogbackTest {

    // 简单使用
    @Test
    public void test1(){
        Logger logger = LoggerFactory.getLogger("com.hsgx.logback");
        logger.debug("debug ...");
    }

    // 打印日志内部状态
    @Test
    public void test2(){
        Logger logger = LoggerFactory.getLogger("com.hsgx.logback");
        logger.debug("debug ...");
        LoggerContext lc = (LoggerContext)LoggerFactory.getILoggerFactory();
        StatusPrinter.print(lc);
    }

    // 测试默认的日志输出级别
    // ERROR > WARN > INFO > DEBUG > TRACE
    @Test
    public void test3(){
        Logger logger = LoggerFactory.getLogger("com.hsgx.logback");
        logger.error("error ...");
        logger.warn("warn ...");
        logger.info("info ...");
        logger.debug("debug ...");
        // 因为默认的输出级别为debug,所以这一条日志不会输出
        logger.trace("trace ...");
    }

    // 设置日志输出级别
    @Test
    public void test4(){
        ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("com.hsgx.logback");
        logger.setLevel(Level.WARN);
        logger.error("error ...");
        logger.warn("warn ...");
        // 设置了级别为warn,则下面的日志都不会再输出
        logger.info("info ...");
        logger.debug("debug ...");
        logger.trace("trace ...");
    }

    // 测试Logger的继承
    @Test
    public void test5(){
        ch.qos.logback.classic.Logger logger = (ch.qos.logback.classic.Logger) LoggerFactory.getLogger("cn.hsgx");
        logger.setLevel(Level.INFO);
        logger.error("error ...");
        logger.warn("warn ...");
        logger.info("info ...");
        logger.debug("debug ...");
        logger.trace("trace ...");

        // "cn.hsgx.logback" 会继承 "cn.hsgx" 的有效级别
        Logger barLogger = LoggerFactory.getLogger("cn.hsgx.logback");
        // 这条日志会打印,因为 INFO >= INFO
        barLogger.info("子级信息");
        // 这条日志不会打印,因为 DEBUG < INFO
        barLogger.debug("子级调试信息");
    }

    // Logger获取,根据同一个名称获得的logger都是同一个实例
    @Test
    public void test6(){
        Logger logger1 = LoggerFactory.getLogger("cn.hsgx");
        Logger logger2 = LoggerFactory.getLogger("cn.hsgx");
        System.out.println(logger1 == logger2);
    }

    // 参数化日志
    @Test
    public void test7(){
        Logger logger = LoggerFactory.getLogger("cn.hsgx");
        logger.debug("hello {}","world");
    }
}

  • 3)在resources目录下编写Logback配置文件logback-base.xmllogback-spring.xml

logback-base.xml

<?xml version="1.0" encoding="UTF-8"?>
<included>
    <contextName>logback</contextName>
    <!--
		name的值是变量的名称,value的值时变量定义的值
		定义变量后,可以使“${}”来使用变量
	-->
    <property name="log.path" value="logs" />

    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule
            conversionWord="clr"
            converterClass="org.springframework.boot.logging.logback.ColorConverter" />
    <conversionRule
            conversionWord="wex" converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter" />
    <conversionRule conversionWord="wEx" converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter" />
    <!-- 彩色日志格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!--输出到控制台-->
    <appender name="LOG_CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <Pattern>${CONSOLE_LOG_PATTERN}</Pattern>
            <!-- 设置字符集 -->
            <charset>UTF-8</charset>
        </encoder>
    </appender>

    <!--输出到文件-->
    <appender name="LOG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!-- 正在记录的日志文件的路径及文件名 -->
        <file>${log.path}/Business.log</file>
        <!--日志文件输出格式-->
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>UTF-8</charset>
        </encoder>
        <!-- 日志记录器的滚动策略,按日期,按大小记录 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 每天日志归档路径以及格式 -->
            <fileNamePattern>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>100MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
            <!--日志文件保留天数-->
            <maxHistory>15</maxHistory>
        </rollingPolicy>
    </appender>
</included>

logback-spring.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--引入其他配置文件-->
    <include resource="logback-base.xml" />
    <!--
    <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。
    <logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。
        name:用来指定受此logger约束的某一个包或者具体的某一个类。
        level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,
            如果未设置此属性,那么当前logger将会继承上级的级别。
        addtivity:是否向上级logger传递打印信息。默认是true。
    -->

    <!--开发环境-->
    <springProfile name="dev">
        <logger name="com.hsgx.controller" additivity="false" level="debug">
            <appender-ref ref="LOG_CONSOLE"/>
        </logger>
    </springProfile>
    <!--生产环境-->
    <springProfile name="pro">
        <logger name="com.hsgx.controller" additivity="false" level="info">
            <appender-ref ref="LOG_FILE"/>
        </logger>
    </springProfile>

    <!--
    root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性
    level:设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF 默认是DEBUG
    可以包含零个或多个元素,标识这个appender将会添加到这个logger。
    -->
    <root level="info">
        <appender-ref ref="LOG_CONSOLE" />
        <appender-ref ref="LOG_FILE" />
    </root>
</configuration>

在以上配置中,开发环境的日志打印在控制台,生产环境的日志输出到文件中。

  • 4)编写配置文件application.yml
server:
  port: 9000
logging:
  #在Spring Boot项目中默认加载类路径下的logback-spring.xml文件
  config: classpath:logback-spring.xml
spring:
  profiles:
    active: dev
  • 5)创建UserController
package com.hsgx.logback.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/user")
public class UserController {

    Logger logger = LoggerFactory.getLogger(UserController.class);

    @GetMapping("/get")
    public String get(){
        logger.trace("trace...");
        logger.debug("debug...");
        logger.info("info...");
        logger.warn("warn...");
        logger.error("error...");
        return "OK";
    }
}
  • 6)创建启动类,启动项目后访问http://localhost:9000/user/get,可以看到控制台已经开始输出日志信息

  • 7)修改application.yml文件中的模式为生产环境pro,重启项目,会发现日志输出到了文件中

本节完,更多内容查阅:后台管理系统的通用权限解决方案

延伸阅读:后台管理系统的通用权限解决方案(五)SpringBoot整合hibernate-validator实现表单校验

标签:...,SpringBoot,Logback,hsgx,日志,logback,logger,Logger
From: https://blog.csdn.net/weixin_42739799/article/details/143265175

相关文章

  • SpringBoot请销假管理信息系统8wz1t(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,领导,在线请假,提交审批,审批信息,延假申请,在线销假,学生统计,班级统计,学院统计开题报告内容一、课题背景与意义随着教育管理的信息化发展,传统的......
  • SpringBoot琴行管理系统42jfd--(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表学生,教师,课程信息,课程类型,课程购买,课程作业,作业提交,作业批改,课程签到,财务信息开题报告内容一、研究背景与意义随着音乐教育的普及和琴行的不断增多,传......
  • SpringBoot汽车销售管理系统1cv5c--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表销售员,客户,销售订单,品牌,车系,汽车库存,汽车入库,财务报表开题报告内容一、课题背景与意义随着汽车市场的不断扩大,汽车销售管理变得日益复杂。为了提高销售......
  • 【langchain4j接入springboot项目】想学AI平台接入?langchain4j,是不二的选择
    一、项目结构二、示例代码1.Calulator.javapackageorg.ivy.aiservice.func;importdev.langchain4j.agent.tool.Tool;importorg.springframework.stereotype.Component;@ComponentpublicclassCalculator{@Tool("Calculatesthelengthofastring")......
  • SpringBoot区域特色产品营销推广平台cd554--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、研究背景与意义在全球化与信息化交织的今天,区域特色产品作为地方文化、经济的重要载体,面临着前所未有的发展机遇与挑战。一方面,消费者对于独特......
  • SpringBoot青少年心理健康服务bpro6--程序+源码+数据库+调试部署+开发环境
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,咨询师,咨询师信息,在线咨询,预约信息,分析报告,心理测试,提交测试,测试评分开题报告内容一、课题名称青少年心理健康服务体系建设研究二、研究背景及意......
  • SpringBoot黔西南旅游景点信息交流平台7p1x5(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,景点类型,美食类型,景点信息,美食信息,酒店信息,线路信息,景点购票,美食购买,酒店预订开题报告内容一、项目背景黔西南布依族苗族自治州位于中国贵州省西......
  • springboot限制上传文件大小,nginx出现413
    spring.servlet.multipart.enabled=true:启用文件上传功能。spring.servlet.multipart.max-file-size=2MB:设置单个文件的最大大小为2MB。spring.servlet.multipart.max-request-size=10MB:设置包含所有文件的请求的最大大小为10MB。 如果使用了nginx,需要在配置设置到http{}......
  • 使用 `screen` + `nohup` 实现高效日志记录和多环境任务管理
    使用screen+nohup实现高效日志记录和多环境任务管理在深度学习模型训练中,特别是在服务器上运行长时间的任务时,有效的任务管理和日志记录至关重要。我们通常需要在后台运行多个任务,同时为每个任务配置不同的conda环境。通过结合使用screen和nohup,我们不仅可以在后......
  • SpringBoot实现的扶贫成效监测平台
    摘要随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了精准扶贫管理系统的开发全过程。通过分析精准扶贫管理系统管理的不足,创建了一个计算机管理精准扶贫管理系统的方案。文章介绍了精准扶贫管理系统的系统分析部分,包括可行性......