springboot-2.日志分析

2023-12-27 14:00:57

一.springboot中常用的日志框架

在Spring Boot中,常见的日志框架有以下几种:

Slf4jSimple Logging Facade for Java):Slf4j是一个标准的日志接口,提供了统一的日志API,可以在运行时动态切换不同的日志实现。

Logback:Logback是Slf4j的默认实现,也是Spring Boot推荐使用的日志框架。它是由Log4j的作者设计的,并且在性能和功能上有较大改进。

Log4j:Log4j是一个功能强大的日志框架,被广泛应用于Java项目中。虽然在Spring Boot中被Slf4j和Logback取代,但是仍然可以通过依赖配置使用Log4j。

Log4j2:Log4j2是Log4j的升级版本,相比于Log4j在性能和功能上有较大的改进。它可以通过依赖配置来在Spring Boot中使用。

JULjava.util.logging):JUL是Java平台自带的日志框架,也可以在Spring Boot中使用。不过,它的功能相对较弱,一般不被推荐使用。

二.slf4j和logback的区别

Slf4j是一个日志接口的抽象层,它定义了一组日志相关的接口和规范。Slf4j本身并不提供具体的日志实现,而是通过绑定(binding)来与底层的具体日志框架进行交互。

Logback是Slf4j的默认实现,它实现了Slf4j的接口,并且提供了一套完整的日志系统,包括日志的记录、过滤、输出等功能。在Spring Boot中,默认使用Slf4j和Logback作为日志框架。

当然,Slf4j还支持与其他日志框架进行绑定,例如与Log4j、Log4j2、JUL等进行绑定,这样就可以在Spring Boot中使用其他的日志框架。

三.日志的工作原理

日志的工作原理可以简单描述为以下几个步骤:

应用程序中的代码通过日志库(如Slf4j)调用相应的日志API来记录日志。日志API提供了不同级别的日志记录,如调试信息、错误信息等。

日志库将日志记录转发给日志框架的实现(如Logback),日志框架负责对日志进行处理和管理。

日志框架根据事先配置好的日志级别过滤掉低于设定级别的日志记录,以提高日志处理的效率。

经过过滤后,日志记录将被传递给日志输出器(如控制台、文件、数据库等),根据配置将日志记录输出到指定的目的地。

对日志的输出可以通过配置参数控制格式化时间戳线程信息等,以满足个性化的需求。

在日志文件中,每条日志记录都会带有相应的级别和时间戳,以便于开发人员快速定位和诊断问题。

四.日志的级别

日志级别用于标识日志的重要性和优先级,常见的日志级别从低到高依次为:

TRACE:最低级别的日志,用于追踪程序的细节,输出非常详细的日志信息。


DEBUG:用于调试程序,输出一些调试信息,帮助定位问题。


INFO:用于输出一些重要的运行时信息,例如程序启动连接数据库等。


WARN:表示警告级别的日志,可以用于指示潜在的问题或错误,但仍然允许程序继续执行。


ERROR:表示程序中发生的错误或异常,但不会导致程序终止。


FATAL:最高级别的日志,表示严重错误,可能导致程序终止运行。


日志级别的使用根据需求而定,一般情况下,可以将日志级别设置为INFO,只记录重要的运行时信息,不必要的调试信息可以设置为DEBUG级别,如果需要追踪程序细节可以使用更低级别的日志级别。

?五.mybatis的默认日志实现

MyBatis 默认使用的日志框架是 Log4j。但是从 MyBatis 3.5.0 开始,推荐使用 SLF4J + Logback 来实现日志记录。这样做是为了提供更好的灵活性和扩展性,并避免与特定日志框架的绑定。可以通过在项目中添加对相关日志框架的依赖,并进行相应的配置来启用日志记录。

?六.logback.xml文件解释

1.引入三个依赖

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.11</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.1.11</version>
        </dependency>

2.根节点configuration

<configuration scan="true" scanPeriod="60 seconds" debug="false"> 
    <!--其他配置省略--> 
</configuration> 

scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。

3.appender节点

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>

负责写日志的组件,它有两个必要属性nameclass。name指定appender名称,class指定appender的全限定名。

4.子节点<logger>?

用来设置某一个或具体的某一个的日志打印级别、以及指定<appender>

<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。

可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。
    name: 用来指定受此loger约束的某一个包或者具体的某一个类。
    level: 用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF,还有一个特殊值INHERITED或者同义词NULL,代表强制执行上级的级别。 如果未设置此属性,那么当前loger将会继承上级的级别。
    addtivity: 是否向上级logger传递打印信息。默认是true。可以包含零个或多个<appender-ref>元素,标识这个appender将会添加到这个logger。
?

?5.子节点<property>

<property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />

用来定义变量值,它有两个属性name和value,通过<property>定义的值会被插入到logger上下文中,可以使“${}”来使用变量。

?七.配置logback.xml实例

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <springProperty scope="context" name="logName" source="logging.file.name" defaultValue="log.log" />
    <!--定义日志文件的存储地址-->
    <property name="LOG_HOME" value="${logName}" />
    <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
    <property name="LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n" />
 
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!-- 输出到日志文件 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_HOME}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}.%d{yyyy-MM-dd}.%i</FileNamePattern>
            <MaxHistory>30</MaxHistory>
            <MaxFileSize>50MB</MaxFileSize>
        </rollingPolicy>
        <encoder>
            <pattern>${LOG_PATTERN}</pattern>
        </encoder>
    </appender>
 
    <!-- 自定义logger -->
    <logger name="com.dispart" level="debug" additivity="false">
        <appender-ref ref="console" />
    </logger>
    <!--sql语句执行输出-->
    <logger name="org.apache.ibatis" level="debug" additivity="false">
        <appender-ref ref="console" />
    </logger>
 
    <root level="info" additivity="false">
        <appender-ref ref="console" />
    </root>
</configuration>

文章来源:https://blog.csdn.net/jjhnb123/article/details/135239847
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。