spring-logback引用外部文件

news/2024/11/21 19:17:24/

背景

        在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

这样就完成了所有配置。 


http://www.ppmy.cn/news/1548833.html

相关文章

汽车资讯新高度:Spring Boot技术飞跃

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

android 动画原理分析

一 android 动画分为app内的view动画和系统动画 基本原理都是监听Choreographer的doframe回调 二 app端的实现是主要通过AnimationUtils来实现具体属性的变化通过invilate来驱动 wms来进行更新。这个流程是在app进程完成 这里不是我分析的重点 直接来看下系统动画里面的本地动…

Linux进阶:压缩、解压

压缩、解压 Linux和Mac系统通常有2种压缩格式&#xff0c;后缀名分别是&#xff1a; .tar&#xff0c;称之为tarball&#xff0c;归档文件&#xff0c;即简单的将文件组装到一个.tar的文件内&#xff0c;并没有太多文件体积的减少&#xff0c;仅仅是简单的封装 .gz&#xff0…

Android Framework PMS面试题及参考答案

什么是 Package Manager Service(PMS)? Package Manager Service(PMS)是 Android 系统中一个核心的系统服务。它运行在系统的后台,主要负责系统中所有应用程序包(APK)的管理和维护工作。从本质上讲,它是一个在 Android 操作系统框架层发挥关键作用的服务组件。 它在 A…

【Python】30个Python爬虫的实战项目!!!(附源码)

Python爬虫是数据采集自动化的利器。本文精选了30个实用的Python爬虫项目&#xff0c;从基础到进阶&#xff0c;每个项目都配有完整源码和详细讲解。通过这些项目的实战&#xff0c;可以全面掌握网页数据抓取、反爬处理、并发下载等核心技能。 一、环境准备 在开始爬虫项目前…

iw添加wlan0导致crash问题分析

比如通过日下命令&#xff0c;创建一个wlan0接口 iw phy phy0 interface add wlan0 type managed 会产生如下panic内容 <1> [54245.466372] Unable to handle kernel NULL pointer dereference at virtual address 00000010 <1> [54245.474729] pgd c1794000 &…

【传知代码】VRT_ 关于视频修复的模型

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ VRT_ 关于视频修复的模型 背景介绍&#xff1a;重要性&#xff1a; VRT的重要性和研究背景VRT的背景&#xff1a;VRT的重要性&#xff1a; 视…

LabVIEW中的UDP与TCP比较

在LabVIEW中&#xff0c;UDP和TCP可以用于不同的网络通信场景&#xff0c;开发者可以根据需求选择合适的协议。以下是结合LabVIEW开发时的一些比较和应用场景&#xff1a; 1.TCP在LabVIEW中的应用&#xff1a; 可靠性高的场景&#xff1a;当开发一个对数据传输的准确性和完整…