spring-logback引用外部文件

背景

        在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.mzph.cn/web/60446.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

.NET周刊【11月第3期 2024-11-17】

国内文章 .NET 9使用Scalar替代Swagger https://www.cnblogs.com/netry/p/18543378/scalar-an-alternative-to-swagger-in-dotnet-9 .NET 9 移除了 Swashbuckle.AspNetCore&#xff0c;因为其维护不力&#xff0c;并转向 Microsoft.AspNetCore.OpenApi。除了 Swashbuckle&am…

国土变更调查拓扑错误自动化修复工具的研究

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、拓扑错误的形成原因 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭长 5.细小碎面 6.更新层相互重叠 二、修复成果展示 1.边界不一致 2.不规则图形 3.尖锐角 4.局部狭…

react 使用中注意事项提要

1、尽可能的减少数组index作为key&#xff0c;数组中插入元素的等操作时&#xff0c;会使得效率底下&#xff1b; 2、如果在 JSX 中给元素添加类, 需要使用 className 代替 class&#xff1b;类似&#xff1a;label 的 for属性&#xff0c;使用htmlFor代替&#xff1b; 3、在…

异常和中断

在计算机系统中&#xff0c;异常和中断是两种常见的用于处理异步事件的机制。以下是常见的异常和中断及其特点的详细解释&#xff1a; 异常&#xff08;内中断&#xff09; 异常&#xff0c;也称为内中断&#xff0c;是由CPU内部事件引起的中断。异常通常与程序执行的当前指令…

WPS 加载项开发说明wpsjs

wpsjs几个常用的CMD命令&#xff1a; 1.打开cmd输入命令测试版本号 npm -v 2.首次安装nodejs&#xff0c;npm默认国外镜像&#xff0c;包下载较慢时&#xff0c;可切换到国内镜像 //下载速度较慢时可切换国内镜像 npm config set registry https://registry.npmmirror.com …

Javaweb梳理18——JavaScript

今日目标 掌握 JavaScript 的基础语法掌握 JavaScript 的常用对象&#xff08;Array、String&#xff09;能根据需求灵活运用定时器及通过 js 代码进行页面跳转能通过DOM 对象对标签进行常规操作掌握常用的事件能独立完成表单校验案例 18.1 JavaScript简介 JavaScript 是一门跨…

android 使用MediaPlayer实现音乐播放--权限请求

在Android应用中&#xff0c;获取本地音乐文件的权限是实现音乐扫描功能的关键步骤之一。随着Android版本的不断更新&#xff0c;从Android 6.0&#xff08;API级别23&#xff09;开始&#xff0c;应用需要动态请求权限&#xff0c;而到了android 13以上需要的权限又做了进一步…

GPT系列文章

GPT系列文章 GPT1 GPT1是由OpenAI公司发表在2018年要早于我们之前介绍的所熟知的BERT系列文章。总结&#xff1a;GPT 是一种半监督学习&#xff0c;采用两阶段任务模型&#xff0c;通过使用无监督的 Pre-training 和有监督的 Fine-tuning 来实现强大的自然语言理解。在 Pre-t…

NUXT3学习日记四(路由中间件、导航守卫)

前言 在 Nuxt 3 中&#xff0c;中间件&#xff08;Middleware&#xff09;是用于在页面渲染之前或导航发生之前执行的函数。它们允许你在路由切换时执行逻辑&#xff0c;像是身份验证、重定向、权限控制、数据预加载等任务。中间件可以被全局使用&#xff0c;也可以只在特定页…

汽车免拆诊断案例 | 2012款路虎揽胜运动版柴油车加速无力

故障现象  一辆2012款路虎揽胜运动版车&#xff0c;搭载3.0T柴油发动机&#xff08;型号为306DT&#xff09;&#xff0c;累计行驶里程约为10.2万km。车主进厂反映&#xff0c;车辆行驶中加速无力&#xff0c;且发动机故障灯异常点亮。 故障诊断 接车后试车&#xff0c;发动…

网络安全与加密

1.Base64简单说明描述&#xff1a;Base64可以成为密码学的基石&#xff0c;非常重要。特点&#xff1a;可以将任意的二进制数据进行Base64编码结果&#xff1a;所有的数据都能被编码为并只用65个字符就能表示的文本文件。65字符&#xff1a;A~Z a~z 0~9 / 对文件进行base64编码…

DrissionPage爬虫工具教程

当然可以&#xff01;下面是一些更高级和复杂的 DrissionPage 使用示例&#xff0c;包括处理动态加载的内容、处理登录和会话、处理多页面操作等。 处理动态加载的内容 许多现代网站使用 JavaScript 动态加载内容。在这种情况下&#xff0c;我们需要等待特定的元素出现&#…

C语言:数组转换指针的时机

1、指针数组 如果一个数组中的所有元素保存的都是指针&#xff0c;那么我们就称它为指针数组&#xff0c;指针数组的定义形式一般为&#xff1a; dataType *arrayName[length];[ ]的优先级高于*&#xff0c;该定义形式应该理解为&#xff1a; dataType *(arrayName[length])…

华为机试HJ60 查找组成一个偶数最接近的两个素数

首先看一下题 描述 任意一个偶数&#xff08;大于2&#xff09;都可以由2个素数组成&#xff0c;组成偶数的2个素数有很多种情况&#xff0c;本题目要求输出组成指定偶数的两个素数差值最小的素数对。 数据范围&#xff1a;输入的数据满足 4≤n≤1000 输入描述&#xff1a; 输…

UE5 DownloadImage加载jpg失败的解决方法

DownloadImage加载jpg失败的解决方法 现象解决方案具体方法 现象 用UE自带的 DownloadImage 无法下载成功&#xff0c;从 failure 引脚出来。 接入一个由监控器自动保存起的图像&#xff0c;有些可以正常加载成功&#xff0c;有些无法加载成功。 经调查问题出现在&#xff0c;…

使用 helm 部署 gitlab

一、下载 Gitlab chart 进入 artifacthub 官网 选择你想要的版本&#xff08;我选择的chart版本是 8.4.0 , gitlab 版本是17.4.0 &#xff09; 进入到控制台&#xff0c;添加helm仓库 如果你想不改任何配置&#xff0c;你可以执行安装命令&#xff0c;等待安装即可helm instal…

FreeRTOS信号量(一)

目录 什么是信号量&#xff1f; 1.信号量简介 2.二值信号量 2.1二值信号量简介 1. 首先&#xff0c;创建时&#xff0c;二值信号量默认无效 2. 之后中断释放信号量 3.信号量获取成功 4、任务再次进入阻塞态 2.2 创建二值信号量 1、函数vSemaphoreCreateBinary () 2、…

51单片机-独立按键与数码管联动

独立键盘和矩阵键盘检测原理及实现 键盘的分类&#xff1a;编码键盘和非编码键盘 键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值的称为编码键盘&#xff0c;如&#xff1a;计算机键盘。靠软件编程识别的称为非编码键盘&#xff1b;在单片机组成…

springboot课程答疑系统(代码+数据库+LW)

摘要 随着信息互联网信息的飞速发展&#xff0c;无纸化作业变成了一种趋势&#xff0c;针对这个问题开发一个专门适应师生交流形式的网站。本文介绍了课程答疑系统的开发全过程。通过分析企业对于课程答疑系统的需求&#xff0c;创建了一个计算机管理课程答疑系统的方案。文章…

electron主进程和渲染进程之间的通信

主进程 (main.js) const { app, BrowserWindow, ipcMain } require("electron"); const path require("node:path"); // 导入fs模块 const fs require("fs");const createWindow () > {const win new BrowserWindow({width: 800,height…