日志框架 - 基于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天前
|
前端开发 Java 数据库连接
Spring框架初识
Spring 是一个分层的轻量级开源框架,核心功能包括控制反转(IOC)和面向切面编程(AOP)。主要模块有核心容器、Spring 上下文、AOP、DAO、ORM、Web 模块和 MVC 框架。它通过 IOC 将配置与代码分离,简化开发;AOP 提供了声明性事务管理等增强功能。
57 21
Spring框架初识
|
1天前
|
存储 人工智能 开发框架
Spring AI Alibaba 应用框架挑战赛圆满落幕,恭喜获奖选手
第二届开放原子大赛 Spring AI Alibaba 应用框架挑战赛决赛于 2 月 23 日在北京圆满落幕。
|
28天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
123 29
|
17天前
|
XML Java 开发者
通过springboot框架创建对象(一)
在Spring Boot中,对象创建依赖于Spring框架的核心特性——控制反转(IoC)和依赖注入(DI)。IoC将对象的创建和管理交由Spring应用上下文负责,开发者只需定义依赖关系。DI通过构造函数、setter方法或字段注入实现依赖对象的传递。Spring Boot的自动配置机制基于类路径和配置文件,自动为应用程序配置Spring容器,简化开发过程。Bean的生命周期包括定义扫描、实例化、依赖注入、初始化和销毁回调,均由Spring容器管理。这些特性提高了开发效率并简化了代码维护。
|
1月前
|
Java 测试技术 应用服务中间件
Spring Boot 配置文件总结
Spring Boot 提供全局配置文件 `application.properties` 和 `application.yml`,用于修改自动配置的默认值。前者使用键值对配置,后者使用缩进和冒号。不同环境(开发、测试、生产)可切换配置文件,通过 `spring.profiles.active` 指定。例如,开发环境端口为4790,测试环境为4791,生产环境为4792。配置示例展示了属性、List、Map定义及引用方法。
68 14
|
1月前
|
开发框架 运维 监控
Spring Boot中的日志框架选择
在Spring Boot开发中,日志管理至关重要。常见的日志框架有Logback、Log4j2、Java Util Logging和Slf4j。选择合适的日志框架需考虑性能、灵活性、社区支持及集成配置。本文以Logback为例,演示了如何记录不同级别的日志消息,并强调合理配置日志框架对提升系统可靠性和开发效率的重要性。
|
2月前
|
XML Java 数据格式
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
本文介绍了在使用Spring框架时,如何通过创建`applicationContext.xml`配置文件来管理对象。首先,在resources目录下新建XML配置文件,并通过IDEA自动生成部分配置。为完善配置,特别是添加AOP支持,可以通过IDEA的Live Templates功能自定义XML模板。具体步骤包括:连续按两次Shift搜索Live Templates,配置模板内容,输入特定前缀(如spring)并按Tab键即可快速生成完整的Spring配置文件。这样可以大大提高开发效率,减少重复工作。
使用idea中的Live Templates自定义自动生成Spring所需的XML配置文件格式
|
2月前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
1月前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
91 8
|
2月前
|
Java 开发者 Spring
理解和解决Spring框架中的事务自调用问题
事务自调用问题是由于 Spring AOP 代理机制引起的,当方法在同一个类内部自调用时,事务注解将失效。通过使用代理对象调用、将事务逻辑分离到不同类中或使用 AspectJ 模式,可以有效解决这一问题。理解和解决这一问题,对于保证 Spring 应用中的事务管理正确性至关重要。掌握这些技巧,可以提高开发效率和代码的健壮性。
147 13