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.rhkb.cn/news/476550.html

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

相关文章

PH热榜 | 2024-11-22

DevNow 是一个精简的开源技术博客项目模版&#xff0c;支持 Vercel 一键部署&#xff0c;支持评论、搜索等功能&#xff0c;欢迎大家体验。 在线预览 1. Lovable 标语&#xff1a;全球首位全栈人工智能工程师 介绍&#xff1a;GPT工程师已在140多个国家拥有超过5万用户&#…

时序论文23|ICML24谷歌开源零样本时序大模型TimesFM

论文标题&#xff1a;A DECODER - ONLY FOUNDATION MODEL FOR TIME - SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/abs/2310.10688 论文链接&#xff1a;https://github.com/google-research/timesfm 前言 谷歌这篇时间序列大模型很早之前就在关注&#xff…

【UCIE协议系列-1】

UCIE协议系列-1 1 UCIE背景1.1 UCIE产生背景1.2 UCIE主要特性 2 UCIE分层协议2.1 Protocol 层2.1.1 Mode VS protocal2.1.2 PCIe 6.02.1.2.1 Raw Mode for PCIe 6.02.1.2.2 Flit Mode: Standard 256B Flit for PCIe 6.0 2.1.3 CXL3.0 256B Flit Mode2.1.3.1 Raw Mode for CXL 2…

智能安全配电装置在高校实验室中的应用

​ 摘要&#xff1a;高校实验室是科研人员进行科学研究和实验的场所&#xff0c;通常会涉及到大量的仪器设备和电气设备。电气设备的使用不当或者维护不周可能会引发火灾事故。本文将以一起实验室电气火灾事故为例&#xff0c;对事故原因、危害程度以及防范措施进行分析和总结…

ESP8266 STA模式TCP客户端 电脑手机网络调试助手

1.STA模式TCP客户端和电脑网络调试助手 2.STA模式TCP客户端和手机网络调试助手

高中-信息技术科目考试-编程题

&#xff08;24上&#xff09;1.为了响应国家低碳的倡议&#xff0c;学校请你设计一个饮料瓶回收系统&#xff0c;根据投的饮料瓶类型和数量进行奖励。具体如下图&#xff1a;假设学生投瓶10个&#xff0c;投瓶类型定义为t&#xff08;0表示塑料瓶&#xff0c;1表示易拉罐&…

如何将文件Copy到Docker镜像中

如何将文件Copy到Docker镜像中 一、使用Dockerfile的COPY指令二、使用Docker CP命令三、使用Docker Volume四、综合应用Docker作为一种轻量级的容器化技术,在软件开发和部署中得到了广泛应用。在使用Docker时,经常需要将本地文件或目录复制到Docker镜像中,以便在容器内部使用…

Figma入门-文字、样式、链接、动作

Figma入门-文字、样式、链接、动作 前言 在之前的工作中&#xff0c;大家的原型图都是使用 Axure 制作的&#xff0c;印象中 Figma 一直是个专业设计软件。 最近&#xff0c;很多产品朋友告诉我&#xff0c;很多原型图都开始用Figma制作了&#xff0c;并且很多组件都是内置的…

shell编程(8) until循环以及函数基本创建调用

声明!!! 学习视频来自B站UP主泷羽sec&#xff0c;如涉及侵权马上删除文章 视频链接&#xff1a;泷羽sec 笔记的只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负 # until循环 脚本代码&#xff1a; i0 until [ ! $i -lt 1…

NVR管理平台EasyNVR多品牌NVR管理工具的流媒体视频融合与汇聚管理方案

随着信息技术的飞速发展&#xff0c;视频监控已经成为现代社会安全管理和业务运营不可或缺的一部分。无论是智慧城市、智能交通、还是大型企业、校园安防&#xff0c;视频监控系统的应用都日益广泛。NVR管理平台EasyNVR&#xff0c;作为功能强大的流媒体服务器软件&#xff0c;…

fastadmin实现站内通知功能

实现效果如下 application/admin/view/common/header.html <style>#notificationMenu {display: none;position: absolute;top: 40px;right: 0;background: #fff;border-radius: 6px;padding: 10px 0;width: 300px;box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);z-inde…

大语言模型---LoRA中损失值的计算

文章目录 概要损失计算流程小结 概要 Llama-7B模型的LoRA微调训练中&#xff0c;通过使用Cross-Entropy Loss来度量模型输出的预测分布和真实标签分布之间的距离&#xff0c;来衡量模型的准确性。 本文主要介绍LoRA中损失值的计算流程。 Cross-Entropy Loss作用&#xff1a;是…

【Vue】指令扩充(指令修饰符、样式绑定)

目录 指令修饰符 按键修饰符 事件修饰符 双向绑定指令修饰符 输入框 表单域 下拉框 单选按钮 复选框 样式绑定 分类 绑定class 绑定style tab页切换示例 指令修饰符 作用 借助指令修饰符&#xff0c;可以让指令的功能更强大 分类 按键修饰符&#xff1a;用来…

集成金蝶云星空数据至MySQL的完整案例解析

金蝶云星空数据集成到MySQL的技术案例分享 在企业信息化系统中&#xff0c;数据的高效流动和准确同步是确保业务连续性和决策支持的重要环节。本文将聚焦于一个具体的系统对接集成案例——金蝶云星空的数据集成到MySQL&#xff0c;方案名称为“2金蝶物料同步到商城中间表”。 …

为什么transformer的时间复杂度是N的平方,具体是里面的哪一个计算流程最占用时间

Transformer的时间复杂度为 O(N2)&#xff0c;其中 NN 是输入序列的长度。这一复杂度主要来源于自注意力机制&#xff08;self-attention mechanism&#xff09;的计算过程。 在Transformer模型中&#xff0c;自注意力机制的核心步骤是计算查询&#xff08;Query&#xff09;、…

如何在Linux上安装Canal同步工具

1. 下载安装包 所用到的安装包 canal.admin-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/1B1LxZUZsKVaHvoSx6VV3sA 提取码&#xff1a;v7ta canal.deployer-1.1.4.tar.gz 链接&#xff1a;https://pan.baidu.com/s/13RSqPinzgaaYQUyo9D8ZCQ 提取码&#xff1a;…

操作系统大会2024 | 麒麟信安根植openEuler社区,持续技术创新 共拓新应用 探索新机遇

[中国&#xff0c;北京&#xff0c;2024年11月15日] 以“以智能&#xff0c;致世界”为主题的操作系统大会2024在北京中关村国际创新中心召开&#xff0c;本次大会由openEuler社区和全球计算联盟主办&#xff0c;旨在汇聚全球产业界力量&#xff0c;推动基础软件根技术持续创新…

Wallpaper壁纸制作学习记录03

添加用户属性 Wallpaper Engine 允许用户在用户属性的帮助下进一步自定义您的壁纸。用户属性允许您为用户提供进一步调整和自定义壁纸各个方面的选项&#xff0c;包括完全隐藏壁纸中的对象。 创建可见性属性 每个元素在右上角都有一个 visibility 属性&#xff08;由眼睛图标…

杰理-gpadc

gpadc API是系统提供的用于adc采集的接口 void adc_init(); //adc功能初始化&#xff0c;一般在板级配置.c文件已经默认调用&#xff0c;用户无需再重复调用。 示例&#xff1a; static void WANG_printf(void *_arg) {//adc_init(); //板级配置中默认会调用&#xff0c;实际…

如何使用Jmeter做性能测试?

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 今天我们来说说jmeter如何进行性能测试&#xff0c;我们都知道jmeter工具除了可以进行接口功能测试外&#xff0c;还可以进行性能测试。当项目趋于稳定&#xf…