spring-logback引用外部文件实现方式

 更新时间:2025年11月19日 09:18:43   作者:码上走人  
本文介绍了如何在Spring微服务开发中实现统一的日志配置,包括使用logback的继承方式和spring-logback.xml配置,以及如何解决logback-include.xml文件在jar包中的位置问题,通过这种方式,可以在统一的日志格式和存储方式下,给予服务一定程度的自主控制

背景

在spring微服务开发和云部署中,都涉及到日志的收集,很多时候为例方便管理和开发,很多公司都会开发一些基础配置代码。其中日志就是很重要的部分,

为了方便部署、收集、查看,所以日志文件需要存储在同一个目录下,且日志格式必须是相同的。

但是在微服务开发中,如果每个服务都自己创建的logback-spring.xml文件并配置信息,难免会出现错误或者遗漏的地方。所以需要统一的logback-spring.xml配置,但是因为某些需要,可能服务又会有自己独特的日志文件记录。所以需要日志打印不能请控制,必须未服务留有一定的自主控制。

原理

基于以上的要求,使用logback配置文件的继承方式,既可以统一需要的日志的打印存储方式,又可以在一定程度上给与服务自主开发的空间。

由于需要引入springboot的一些配置项,所以我们使用spring-logback.xml配置。

因为加载顺序:

logback.xml > application.properties/application.yaml > logback-spring.xml

logback的引用实现

logback引入其他的配置项使用<included></included> 和<include></include> 来实现。

从文件中包含

<include file="src/main/java/com/xxxx/configuration/includedConfig.xml"/>

特别注意一点 :logback-include.xml在 maven 中 , 不能直接放在src/resouces路径下 。

这样的情况就是 ,logback-include.xml在 jar 的根路径中 , 但不是跟logback.xml同一目录 . 在没有路径的情况下 , 默认只会去找同目录下的文件 . 就找不到jar包里的了 。

<!-- logback.xml -->

<configuration>

<!-- 这么配置 , 只会找同目录下的文件 -->

<include resource="logback-include.xml" />

</configuration>

从 classpath 中包含

<include resource="includedConfig.xml"/>

从 URL 中包含

<include url="http://some.host.com/includedConfig.xml"/>

如果包含不成功,那么 logback 会打印出一条警告信息,如果不希望 logback 抱怨,只需这样做:

<include optional="true" ..../>

实现方式

公共基础配置

先新建一个基础配置模块,这个模块将被打成jar包,并在其他项目中被引用,这个项目中包括了基础的日志配置,配置信息如下:

logback-base.xml

<included>

<contextName>${APPLICATION_NAME}</contextName>
<springProperty name="APPLICATION_NAME" scope="context" source="spring.application.name" defaultValue="core-logback-base"/>
<springProperty name="LOG_PATH" scope="context" source="logging.file" defaultValue="./log/application/${SERVICE_NAME}"/>
<springProperty name="LOG_MAX_FILE_SIZE" scope="context" source="logback.file.size" defaultValue="50MB"/>
<springProperty name="LOG_FILE_MAX_TIME" scope="context" source="logback.file.maxTime" defaultValue="24"/>
<springProperty name="LOG_FILE_TIME_FORMAT" scope="context" source="logback.file.timeFormat" defaultValue="yyyy-MM-dd'T'HH"/>
<springProperty name="ServerIP" scope="context" source="spring.cloud.client.ip-address" defaultValue="0.0.0.0"/>
<springProperty name="ServerPort" scope="context" source="server.port" defaultValue="0000"/>

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

<appender name ="InfoLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--指定日志路径和名称-->
<file>${LOG_PATH}/${SERVICE_NAME}-info.log</file>
<!--是否使用追加日志的方式-->
<append>true</append>
<!--级别过滤器,只打印指定级别的日志-->
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名 -->
<!--SizeAndTimeBasedRollingPolicy 它根据时间来制定滚动策略,也限制每个文件的大小,既负责滚动也负责出发滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--每天生成一个日志文件,保存maxHistory天的日志文件-->
<!--<fileNamePattern>${LOG_PATH}/rollingFileAppender.%d{yyyy-MM-dd}.log</fileNamePattern>-->
<!--每个分钟生成一个日志文件,保存maxHistory小时的日志文件-->
<!--<fileNamePattern>${LOG_PATH}/rollingFileAppender.%d{yyyy-MM-dd'T'HH}.-%i.log</fileNamePattern>-->
<!--每个小时生成一个日志文件,保存maxHistory分钟的日志文件,并且将及时日志文件进行压缩zip-->
<fileNamePattern>${LOG_PATH}/${SERVICE_NAME}.info.%d{${LOG_FILE_TIME_FORMAT}}.log%i.zip</fileNamePattern>
<!--限制每一个log文件的大小-->
<maxFileSize>100MB</maxFileSize>
<maxHistory>${LOG_FILE_MAX_TIME}</maxHistory>
</rollingPolicy>
<encoder>
<!--日志格式-->
      <pattern>${LOG_PATTERN}</pattern>
    </encoder>
</appender>

<appender name ="ErrorLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--指定日志路径和名称-->
<file>${LOG_PATH}/${SERVICE_NAME}-error.log</file>
<!--是否使用追加日志的方式-->
<append>true</append>
<!--级别过滤器,只打印指定级别的日志-->
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>ERROR</level>
</filter>
<!-- 当发生滚动时,决定RollingFileAppender的行为,涉及文件移动和重命名 -->
<!--SizeAndTimeBasedRollingPolicy 它根据时间来制定滚动策略,也限制每个文件的大小,既负责滚动也负责出发滚动-->
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--每天生成一个日志文件,保存maxHistory天的日志文件-->
<!--<fileNamePattern>${LOG_PATH}/rollingFileAppender.%d{yyyy-MM-dd}.log</fileNamePattern>-->
<!--每个分钟生成一个日志文件,保存maxHistory小时的日志文件-->
<!--<fileNamePattern>${LOG_PATH}/rollingFileAppender.%d{yyyy-MM-dd'T'HH}.-%i.log</fileNamePattern>-->
<!--每个小时生成一个日志文件,保存maxHistory分钟的日志文件,并且将及时日志文件进行压缩zip-->
<fileNamePattern>${LOG_PATH}/${SERVICE_NAME}.error.%d{${LOG_FILE_TIME_FORMAT}}.log%i.zip</fileNamePattern>
<!--限制每一个log文件的大小-->
<maxFileSize>100MB</maxFileSize>
<maxHistory>24</maxHistory>
</rollingPolicy>
<encoder>
<!--日志格式-->
      <pattern>${LOG_PATTERN}</pattern>
     </encoder>
</appender>

<root level ="INFO">
<appender-ref ref="InfoLog" level ="INFO"/>
<appender-ref ref="ErrorLog" level ="ERROR"/>
</root>
</included>

位置不要放在resources下,需要放在java目录或其子目录下,假设起路径是:

com/test/core/log/xml/logback-base.xml

引用基础配置

在其他的项目中,我们可以通过maven方式引入公共基础配置的jar包。然后在项目的resources新建logback-spring.xm引入基础配置,并加入自己的配置项。

<configuration scan="true" scanPeriod="60 seconds" debug="false">
<include resource="com/test/core/log/xml/logback-base.xml"/>

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

<root level ="INFO">
<!-- 控制台打印方式 -->
<appender-ref ref="CONSOLE" level="INFO"/>
</root>
</configuration>

同时在application.properties或application.yaml中配置日志文件方式:

logging.config=classpath:logback.xml

这样就完成了所有配置。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • idea新建Springboot项目,设置默认maven和jdk版本方式

    idea新建Springboot项目,设置默认maven和jdk版本方式

    这篇文章主要介绍了idea新建Springboot项目,设置默认maven和jdk版本方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • java序列化和java反序列化示例

    java序列化和java反序列化示例

    在web项目开发的时候,经常用到序列化和反序列化用来传递大流量的数据,类只有实现Serializable借口才能被序列化,下来是java序列化和反序列化演示
    2014-01-01
  • Java中父类强制转换子类问题解决

    Java中父类强制转换子类问题解决

    在Java编程中继承是基础,但父类转换为子类时需谨慎,正确的转换要求父类引用实际指向子类对象,错误转换可能引发ClassCastException,解决方案包括使用instanceof关键字检查、利用泛型避免转换、以及通过多态性避免直接转换,感兴趣的可以了解一下
    2024-11-11
  • SpringSecurity Demo 创建项目的过程详解

    SpringSecurity Demo 创建项目的过程详解

    本文介绍了使用SpringBoot 3.2.4创建一个简单的安全验证项目的过程,包括引入依赖、配置文件修改、创建控制器和启动类等步骤,并最终成功启动项目并在浏览器访问到请求接口,感兴趣的朋友跟随小编一起看看吧
    2026-04-04
  • Java JDK动态代理的基本原理详细介绍

    Java JDK动态代理的基本原理详细介绍

    这篇文章主要介绍了Java JDK动态代理的基本原理详细介绍的相关资料,这里对动态代理进行了详解并附简单实例代码,需要的朋友可以参考下
    2017-01-01
  • WPF实现自定义一个自删除的多功能ListBox

    WPF实现自定义一个自删除的多功能ListBox

    这篇文章主要为大家详细介绍了如何利用WPF实现自定义一个自删除的多功能ListBox,文中示例代码讲解详细,感兴趣的小伙伴可以了解一下
    2022-12-12
  • Java中&&与?表达式结合时出现的坑

    Java中&&与?表达式结合时出现的坑

    这篇文章主要给大家介绍了关于Java中&&与?表达式结合时出现的坑的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02
  • Java数据结构之常见排序算法(下)

    Java数据结构之常见排序算法(下)

    这篇文章主要介绍了Java数据结构之常见排序算法(下),与之相对有(上),想了解的朋友可以去本网站扫搜,在这两篇文章里涵盖关于八大排序算法的所有内容,需要的朋友可以参考下
    2023-01-01
  • 一篇文章带你深入了解Java异常

    一篇文章带你深入了解Java异常

    本篇文章主要介绍了java异常处理机制及应用,异常处理机制是Java语言的一大特色。从异常处理的机制、异常处理的方法、异常处理的原则等方面介绍Java语言的异常处理技术,有兴趣的可以了解一下
    2021-08-08
  • 聊聊java变量的初始化之后的默认值

    聊聊java变量的初始化之后的默认值

    这篇文章主要介绍了聊聊java变量的初始化之后的默认值,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08

最新评论