SpringBoot-日志系统

1. Logback 介绍

  • Logback 是由 log4j 创始人设计的又一个开源日志组件
  • Logback 当前分成三个模块:logback-core,logback- classic 和 logback-access
  • logback-core 是其它两个模块的基础模块,类似与 springframework
  • logback-classic 是 log4j 的一个改良版本。此外 logback-classic 完整实现 SLF4J API。使你可以很方便地更换成其它日志系统如 log4j 或 JDK14 Logging
  • logback-access 访问模块与 Servlet 容器集成提供通过 Http 来访问日志的功能

2. log4j

和 SpringBoot 集成的 log4j 依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-log4j</artifactId>
    <version>1.3.8.RELEASE</version>
</dependency>

3. SLF4J

Simple Logging Facade for Java(SLF4J)用作各种日志框架(例如java.util.logging,logback,log4j)的简单外观或抽象,允许最终用户在部署时插入所需的日志框架。

参考:https://blog.csdn.net/qq_39326472/article/details/122569587

4. SpringBoot 日志系统

1. 日志门面

日志门面:是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。

1. common-logging
由 appach 提供的一个通用的日志接口。常见的使用代码:

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
 
public class A {
	private static Log log = LogFactory.getLog(A.getClass());
    log.info("参数:" + name);
}

2. slf4j
slf4j全称为Simple Logging Facade for JAVA,java简单日志门面。类似于Apache Common-Logging,是对不同日志框架提供的一个门面封装,可以在部署的时候不修改任何配置即可接入一种日志实现方案。

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

@Service
public class LogServiceImple implements LogService {

    private static final Logger log = LoggerFactory.getLogger(LogServiceImple.class);

    @Override
    public String creatName(String name) {
        log.info("参数:{}", name);
        return name + "是二货!";
    }
}

也可以结合 lombok 注解 @Slf4j 使用

@Slf4j
@Service
public class LogServiceImple implements LogService {
    @Override
    public String creatName(String name) {
        log.info("参数:{}", name);
        return name + "是二货!";
    }
}

Slf4j 相比 Common-logging,个人感觉就是多了 log.info("参数:{}", "张三") 这种使用 {} 填充参数用法,Common-logging 只能拼接了,Slf4j 也是我们常用的,两种日志门面都在 spring-boot-start 中有,所有都可以直接使用。

2. 日志实现

相比上面的 Slf4j 和 Common-logging 两种日志门面,我们实际需要日志的实现,常用的就是 log4j 和 logback 了。Springboot 默认使用 logback,也是推荐使用的,我们可以不做修改。

当需要修改的时候,只需修改 pom 相关的 starter

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <!-- 排除自带的logging依赖 -->
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-logging</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <!--添加 log4j 依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-log4j</artifactId>
        <version>1.3.8.RELEASE</version>
    </dependency>
</dependencies>

这样就修改 log4j 作为日志系统的底层实现,使用方法不用修改。官方建议使用 logback

3. 日志格式说明

4. 日志级别

日志级别可以帮助我们筛选信息,从而节省程序员筛选日志的时间,日志级别可以控制不同环境下,打印日志的详细程度,如开发环境我们需要详细的日志信息,而线上环境我们为了性能,就打印少量的日志

  • trace:级别最低
  • debug:调试级别的,常用于跟踪程序的进展
  • info:普通的打印信息(默认的日志级别)
  • warn:警告级别,不影响使用,但应该注意
  • error:错误级别,错误日志信息打印
  • fatal:致命级别,因代码异常导致程序退出,级别最高

日志的级别越高,打印的日志信息就越少

设置 SpringBoot 日志级别:默认 info

logging:
  level:
    # 全局日志级别
    root: info
    # 指定包的日志级别
    com.demo.service: warn

5. 持久化日志

将日志打印到固定路径中:

logging:
  file:
    path:  D:\gaox\logs

将日志打印到固定文件中:

logging:
  file:
    name: D:\gaox\logs\test.txt

6. 日志配置

logback 默认读取 logback-spring.xml, logback-spring.groovy, logback.xml, logback.groovy 几个配置文件,放在 src/main/resource 下即可。也可以自己指定配置文件:

logging.config=classpath:logging-config.xml

For Example: logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration  scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>logback</contextName>
    <property name="log.path" value="/logs/xxxx" />
    <!--输出到控制台-->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <!-- <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>ERROR</level>
         </filter>-->
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <!--输出到文件-->
    <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${log.path}/logback.%d{yyyy-MM-dd}.log</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console" />
        <appender-ref ref="file" />
    </root>

    <!-- logback为java中的包 -->
    <logger name="com.xxx"/>
    <!--logback.LogbackDemo:类的全路径 -->
    <logger name="com.xxx.xxx.Test" level="WARN" additivity="false">
        <appender-ref ref="console"/>
    </logger>
</configuration>
posted @ 2023-08-04 13:14  primaryC  阅读(123)  评论(0编辑  收藏  举报