SpringBoot+Slf4j+Logback日志记录方案

目录

依赖

配置

实现


简单介绍下几大日志框架之间的关系

Log4j:这是最早的日志框架之一。

Logback:这是log4j的升级版。

Log4j2:最新推出的日志框架。

Slf4j:日志门面,为各种日志框架提供统一的记录日志的接口。

接下来主要讲一下Logback的实现

依赖

spring-boot-dependencies 包含了 SLF4J,日志框架 Logback 的依赖,因此在使用 Spring Boot 项目时,SLF4J , Logback是自动包含的。

XML 复制代码
<!-- SpringBoot 依赖配置 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring-boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>

配置

在 Logback 配置文件中(如 resources/logback.xml)进行自定义配置,以满足日志需求。

Logback 配置文件的部分能力:

1. 日志级别:可以设置全局日志级别,例如 DEBUG、INFO、WARN 或 ERROR。

2. 日志输出格式:可以定义日志消息的输出格式,包括日期时间格式、日志级别、线程名、消息内容等。

3. 日志输出目的地:可以配置将日志输出到控制台、文件、数据库、网络等。

4. 滚动策略:对于文件输出,可以配置滚动策略,例如按大小滚动或按时间滚动。

5. 异步日志:可以提高日志输出的性能,通过异步方式记录日志。

6. 日志过滤:可以定义过滤规则,例如只记录特定级别的日志或只记录包含特定关键字的日志。

7. 附加配置:可以配置其他高级功能,例如使用多个日志上下文、集成第三方库等。

Logback 日志框架中的部分类介绍:

ch.qos.logback.core.rolling.RollingFileAppender 是 Logback 日志框架中的一个类,它用于将日志消息追加到一个滚动文件中。当文件达到一定大小时,它会自动滚动,创建一个新的日志文件,同时保留旧的日志文件以便后续查看。

ch.qos.logback.core.rolling.TimeBasedRollingPolicy 是 Logback 日志框架中的一个滚动策略类,用于按时间滚动日志文件。

ch.qos.logback.classic.filter.LevelFilter 是 Logback 日志框架中的一个过滤器类,用于根据日志事件的级别来决定是否将该事件传递给后续的日志处理组件。

ch.qos.logback.core.ConsoleAppender 是 Logback 日志框架中的一个类,用于将日志消息输出到控制台。

参考以下配置:

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds">

   <!-- 日志输出格式 -->
   <property name="logPattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
   <!-- 日志存放路径 -->
   <property name="logPath" value="logs/bibo" />
   
    <!-- 控制台输出 -->
   <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
         <pattern>${logPattern}</pattern>
      </encoder>
   </appender>

    <!-- 系统日志输出 INFO -->
   <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${logPath}/info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
      <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
         <fileNamePattern>${logPath}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
         <!-- 日志最大的历史 90天 -->
         <maxHistory>90</maxHistory>
      </rollingPolicy>
      <encoder>
         <pattern>${logPattern}</pattern>
      </encoder>
      <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
   </appender>
   
    <!-- 系统日志输出 ERROR -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
       <file>${logPath}/error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${logPath}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
         <!-- 日志最大的历史 90天 -->
         <maxHistory>90</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${logPattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
         <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
         <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>

   <!-- 一些第三方包的日志过滤级别  -->
   <logger name="org.springframework" level="warn" />
   <logger name="org.apache" level="WARN" />
   
   <!--系统操作日志总体输出级别-->
    <root level="info">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="FILEINFO" />
        <appender-ref ref="FILEERROR" />
    </root>
</configuration>

实现

为某个具体的类创建一个名为logger的静态日志记录器对象,并且这个对象在初始化后不能再被修改。在后续的代码中,可以使用这个logger对象来进行日志记录。

java 复制代码
private final static Logger logger = LoggerFactory.getLogger(SysLoginService.class);

logger常用记录日志级别:

1. DEBUG:指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。

2. INFO:记录一般信息,这些信息可以帮助开发人员了解应用程序的运行情况。

3. WARN:记录警告信息,这些信息可能会导致潜在的问题,但不会影响应用程序的正常运行。

4. ERROR:指出虽然发生错误事件或者异常捕获,但不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。

java 复制代码
logger.info("账号密码尝试登录:{}, IP: {}", username, IpUtils.getIpAddr(ServletUtils.getRequest()));
try {
    logger.debug("res: {}", res);
} catch (Exception e) {
    logger.warn("error", e);
    logger.error(e.getMessage(), e);
    logger.error("Bad get request:{}", newUrl);
}
相关推荐
Java爱好狂.4 小时前
Java初学者如何一周速通SpringBoot!
java·spring boot·后端·spring·高并发·架构师·java面试
马良神笔6 小时前
2026 年Rag最近技术前沿总结
后端·python·django
程序猿DD6 小时前
同样10美元,OpenDesign和Command Code的DeepSeek V4.1 Flash额度到底有多少?
后端
高频因子挖掘机7 小时前
A股量化从日线升级到5分钟线:数据量增加后最先暴露哪些工程问题?
后端·github·api
高频因子挖掘机7 小时前
历史行情返回顺序变了,为什么按行号计算指标很危险?
后端·github·api
团子哒哒9 小时前
数组、切片和Map
后端
专注仿真9 小时前
ThinkPHP6 API接口开发实例:从零搭建RESTful风格接口
后端·php·restful
开心猴爷9 小时前
应对iOS审核4.3:可以使用 IpaGuard 来给属性名混淆的技术细节与平衡之道
后端·ios
1m555555559 小时前
RAG 工程实战(五):正确知识已经进入 Prompt,为什么大模型还是会答错?
后端·面试
易小尊9 小时前
我的模型在 65% 以上时准得可怕,在 50% 时像在掷硬币
后端