日志框架 - 基于spring-boot - 实现1 - 配置文件

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 日志框架系列讲解文章日志框架 - 基于spring-boot - 使用入门日志框架 - 基于spring-boot - 设计日志框架 - 基于spring-boot - 实现1 - 配置文件日志框架 - 基于spring-boot - 实现2 - 消...

日志框架系列讲解文章
日志框架 - 基于spring-boot - 使用入门
日志框架 - 基于spring-boot - 设计
日志框架 - 基于spring-boot - 实现1 - 配置文件
日志框架 - 基于spring-boot - 实现2 - 消息定义及消息日志打印
日志框架 - 基于spring-boot - 实现3 - 关键字与三种消息解析器
日志框架 - 基于spring-boot - 实现4 - HTTP请求拦截
日志框架 - 基于spring-boot - 实现5 - 线程切换
日志框架 - 基于spring-boot - 实现6 - 自动装配

上一篇我们讲解了日志框架的总体设计
本篇讲日志框架实现的第一部分:配置文件

Spring Boot默认日志框架是logback,实现日志框架需要自定义logback的配置,根据官方文档的指引,在classpath目录下新增文件名为logback-spring.xml的配置文件。文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <!--第1步. 引入spring-boot提供的默认格式配置-->
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>

    <!--第2步.定义从application.properties引入的配置-->  
    <!--spring-boot logging.path-->
    <property name="LOG_PATH" value="${LOG_PATH:-./logs}"/>
    <!--spring-boot logging.file-->
    <property name="LOG_FILE"
              value="${LOG_PATH}/${LOG_FILE:-spring.log}"/>
    <springProperty scope="context" name="ROOT_PACKAGE"
                    source="xpay.framework.logging.package.root"
                    defaultValue="com"/>
    <springProperty scope="context" name="LOG_TO_CONSOLE"
                    source="xpay.framework.logging.log-to-console"
                    defaultValue="false"/>
    <!--message log patterns-->
    <springProperty scope="context" name="MESSAGE_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.message.filename.pattern"
                    defaultValue="%d{yyyy-MM-dd}/message.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="MESSAGE_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.message.encoder.pattern"
                    defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} %msg%n"/>
    <springProperty scope="context" name="MESSAGE_MAX_FILE_SIZE"
                    source="xpay.framework.logging.logback.message.max-file-size"
                    defaultValue="200MB"/>
    <!--system log patterns-->
    <springProperty scope="context" name="SYSTEM_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.system.filename.pattern"
                    defaultValue="%d{yyyy-MM-dd}/info.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="SYSTEM_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.system.encoder.pattern"
                    defaultValue="${FILE_LOG_PATTERN}"/>
    <springProperty scope="context" name="SYSTEM_MAX_FILE_SIZE"
                    source="xpay.framework.logging.logback.system.max-file-size"
                    defaultValue="200MB"/>
    <!--alarm log patterns-->
    <springProperty scope="context" name="ALARM_FILENAME_PATTERN"
                    source="xpay.framework.logging.logback.alarm.filename.pattern"
                    defaultValue="alarm/alarm.log.%d{yyyy-MM-dd}"/>
    <springProperty scope="context" name="ALARM_ENCODER_PATTERN"
                    source="xpay.framework.logging.logback.alarm.encoder.pattern"
                    defaultValue="${FILE_LOG_PATTERN}"/>
    <!--第3步. 引入spring-boot提供的默认文件配置-->
    <include
            resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <include
            resource="org/springframework/boot/logging/logback/file-appender.xml"/>

    <!--第4步. 定义三种日志 Appender-->
    <!-- 处理消息日志 -->
    <appender name="MESSAGE_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${MESSAGE_FILENAME_PATTERN}.%i
            </fileNamePattern>
            <maxFileSize>${MESSAGE_MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${MESSAGE_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_MESSAGE_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每个日志内容2KB大小计算,最大缓存10MB的日志。-->
        <queueSize>5000</queueSize>
        <!--单位为毫秒-->
        <maxFlushTime>1000</maxFlushTime>
        <appender-ref ref="MESSAGE_APPENDER"/>
    </appender>
    <!-- 系统运行日志 -->
    <appender name="SYSTEM_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy
                class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${SYSTEM_FILENAME_PATTERN}.%i
            </fileNamePattern>
            <maxFileSize>${SYSTEM_MAX_FILE_SIZE}</maxFileSize>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${SYSTEM_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_SYSTEM_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每个日志内容0.5KB大小为基础,大约允许缓存10MB的日志。-->
        <queueSize>20000</queueSize>
        <!--单位为毫秒-->
        <maxFlushTime>1000</maxFlushTime>
        <appender-ref ref="SYSTEM_APPENDER"/>
    </appender>
    <!-- 告警日志记录 -->
    <appender name="ALARM_APPENDER"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <!--deny all events with a level below this level-->
            <level>WARN</level>
        </filter>
        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${ALARM_FILENAME_PATTERN}
            </fileNamePattern>
        </rollingPolicy>
        <encoder>
            <outputPatternAsHeader>true</outputPatternAsHeader>
            <charset>utf8</charset>
            <pattern>${ALARM_ENCODER_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="ASYNC_ALARM_APPENDER"
              class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <!--以每个日志内容0.5KB大小为基础,大约允许缓存1MB的日志。-->
        <queueSize>2000</queueSize>
        <!--单位为毫秒 -->
        <maxFlushTime>500</maxFlushTime>
        <appender-ref ref="ALARM_APPENDER"/>
    </appender>


    <!--第5步. 定义默认的logger 与appender 的对应关第-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
        <appender-ref ref="ASYNC_ALARM_APPENDER"/>
    </root>
    <if condition='property("LOG_TO_CONSOLE").contains("true")'>
        <then>
            <logger name="${ROOT_PACKAGE}" level="INFO" additivity="true">
                <appender-ref ref="ASYNC_ALARM_APPENDER"/>
                <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
            </logger>
        </then>
        <else>
            <logger name="${ROOT_PACKAGE}" level="INFO" additivity="false">
                <appender-ref ref="ASYNC_ALARM_APPENDER"/>
                <appender-ref ref="ASYNC_SYSTEM_APPENDER"/>
            </logger>
        </else>
    </if>
    <logger name="com.cmsz.framework.logging.aop.MessageToLogAspect"
            level="INFO" additivity="true">
        <appender-ref ref="ASYNC_MESSAGE_APPENDER"/>
    </logger>
</configuration>

如上文件所示,配置文件包含几个部分:

  1. 引入配置文件Spring Boot在org.springframework.boot.logging.logback包中提供了4个默认的logback配置文件,分别是base.xml,console-appender.xml,defaults.xml,file-appender.xml,本配置文件里在第1步与第3步中分别引入。
  2. 定义配置项:为了在Spring Boot的配置文件(如application.properties文件)中能配置日志文件名及日志打印格式,第2步定义了许多与Spring配置项对应的属性(property
    3.定义Appender: 第4步分别为三种日志(系统运行日志,消息日志与告警日志)定义输出文件及格式,并使用异步的Appender避免I/O成为系统性能开销的瓶颈。
  3. 定义Logger:第5步定义默认的logger,与对应的日志级别。

至此,logback的配置基本完成。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
10天前
|
XML 安全 Java
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
本文介绍了Java日志框架的基本概念和使用方法,重点讨论了SLF4J、Log4j、Logback和Log4j2之间的关系及其性能对比。SLF4J作为一个日志抽象层,允许开发者使用统一的日志接口,而Log4j、Logback和Log4j2则是具体的日志实现框架。Log4j2在性能上优于Logback,推荐在新项目中使用。文章还详细说明了如何在Spring Boot项目中配置Log4j2和Logback,以及如何使用Lombok简化日志记录。最后,提供了一些日志配置的最佳实践,包括滚动日志、统一日志格式和提高日志性能的方法。
110 30
【日志框架整合】Slf4j、Log4j、Log4j2、Logback配置模板
|
17天前
|
数据采集 监控 前端开发
二级公立医院绩效考核系统源码,B/S架构,前后端分别基于Spring Boot和Avue框架
医院绩效管理系统通过与HIS系统的无缝对接,实现数据网络化采集、评价结果透明化管理及奖金分配自动化生成。系统涵盖科室和个人绩效考核、医疗质量考核、数据采集、绩效工资核算、收支核算、工作量统计、单项奖惩等功能,提升绩效评估的全面性、准确性和公正性。技术栈采用B/S架构,前后端分别基于Spring Boot和Avue框架。
|
30天前
|
Java API 数据库
构建RESTful API已经成为现代Web开发的标准做法之一。Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐。
【10月更文挑战第11天】本文介绍如何使用Spring Boot构建在线图书管理系统的RESTful API。通过创建Spring Boot项目,定义`Book`实体类、`BookRepository`接口和`BookService`服务类,最后实现`BookController`控制器来处理HTTP请求,展示了从基础环境搭建到API测试的完整过程。
40 4
|
27天前
|
Java API 数据库
Spring Boot框架因其简洁的配置、快速的启动特性及丰富的功能集而备受开发者青睐
本文通过在线图书管理系统案例,详细介绍如何使用Spring Boot构建RESTful API。从项目基础环境搭建、实体类与数据访问层定义,到业务逻辑实现和控制器编写,逐步展示了Spring Boot的简洁配置和强大功能。最后,通过Postman测试API,并介绍了如何添加安全性和异常处理,确保API的稳定性和安全性。
34 0
|
20天前
|
Java API Spring
在 Spring 配置文件中配置 Filter 的步骤
【10月更文挑战第21天】在 Spring 配置文件中配置 Filter 是实现请求过滤的重要手段。通过合理的配置,可以灵活地对请求进行处理,满足各种应用需求。还可以根据具体的项目要求和实际情况,进一步深入研究和优化 Filter 的配置,以提高应用的性能和安全性。
|
21天前
|
前端开发 Java 数据库连接
Spring 框架:Java 开发者的春天
Spring 框架是一个功能强大的开源框架,主要用于简化 Java 企业级应用的开发,由被称为“Spring 之父”的 Rod Johnson 于 2002 年提出并创立,并由Pivotal团队维护。
41 1
Spring 框架:Java 开发者的春天
|
14天前
|
JavaScript 安全 Java
如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能
本文介绍了如何使用 Spring Boot 和 Ant Design Pro Vue 构建一个前后端分离的应用框架,实现动态路由和菜单功能。首先,确保开发环境已安装必要的工具,然后创建并配置 Spring Boot 项目,包括添加依赖和配置 Spring Security。接着,创建后端 API 和前端项目,配置动态路由和菜单。最后,运行项目并分享实践心得,帮助开发者提高开发效率和应用的可维护性。
32 2
|
13天前
|
消息中间件 NoSQL Java
springboot整合常用中间件框架案例
该项目是Spring Boot集成整合案例,涵盖多种中间件的使用示例,每个案例项目使用最小依赖,便于直接应用到自己的项目中。包括MyBatis、Redis、MongoDB、MQ、ES等的整合示例。
61 1
|
21天前
|
Java 数据库连接 开发者
Spring 框架:Java 开发者的春天
【10月更文挑战第27天】Spring 框架由 Rod Johnson 在 2002 年创建,旨在解决 Java 企业级开发中的复杂性问题。它通过控制反转(IOC)和面向切面的编程(AOP)等核心机制,提供了轻量级的容器和丰富的功能,支持 Web 开发、数据访问等领域,显著提高了开发效率和应用的可维护性。Spring 拥有强大的社区支持和丰富的生态系统,是 Java 开发不可或缺的工具。
|
20天前
|
Java 程序员 API
Android|集成 slf4j + logback 作为日志框架
做个简单改造,统一 Android APP 和 Java 后端项目打印日志的体验。
76 1