logback整合rabbitmq实现消息记录日志

logback.xml文件配置

   <!-- 配置rabbitmq的信息,数据取值yml --><springProperty name="rabbitmqHost" source="spring.rabbitmq.host"/><springProperty name="rabbitmqPort" source="spring.rabbitmq.port"/><springProperty name="rabbitmqUsername" source="spring.rabbitmq.username"/><springProperty name="rabbitmqPassword" source="spring.rabbitmq.password"/><springProperty name="rabbitmqvirtualHost" source="spring.rabbitmq.virtual-host"/><!-- 配置rabbitmq的日志记录appender --><appender name="LogAmqpAppender" class="org.springframework.amqp.rabbit.logback.AmqpAppender"><!--Layout(纯文本)而不是格式化的JSON --><layout><pattern>{"source":"%c-%L","createtime":"%d{yyyy-MM-dd HH:mm:ss}","thread":"%thread","level":"%-5level", "logTrackId": "%X{logTrackId}", "requestUri":"%X{requestUri}", "msg":"%msg"}</pattern></layout><host>${rabbitmqHost}</host><port>${rabbitmqPort}</port><username>${rabbitmqUsername}</username><password>${rabbitmqPassword}</password><virtualHost>${rabbitmqvirtualHost}</virtualHost><declareExchange>true</declareExchange><exchangeType>direct</exchangeType><exchangeName>log.exchange.direct</exchangeName><routingKeyPattern>logDirectQueue</routingKeyPattern><generateId>true</generateId><charset>UTF-8</charset><durable>false</durable><autoDelete>false</autoDelete><deliveryMode>NON_PERSISTENT</deliveryMode></appender><!-- root 级别的配置 --><root level="INFO"><appender-ref ref="LogAmqpAppender" /></root>

yml文件配置

  # rabbitmqrabbitmq:host: 132.33.228.149username: adminpassword: admin@2023$port: 5673#虚拟host 可以不设置,使用server默认hostvirtual-host: /connection-timeout: 10000listener:simple:prefetch: 1 # 每次只能获取一条,处理完成才能获取下一条acknowledge-mode: manual #一定改为要手动确认模式

代码配置rabbitmq信息

package com.xx.weixin.rabbitmq;import java.util.HashMap;import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitAdmin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/**
* @author 作者 srp
* @version 创建时间:2023-12-1 16:42:41
* 
*/
@Configurationpublic class RabbitMqLogConfig {@Autowiredprivate RabbitAdmin rabbitAdmin;//强制用此方法生成自己希望的队列@Beanpublic Queue logDirectQueue() {//设置过期时间,以毫秒为单位HashMap<String, Object> map = new HashMap<>();map.put("x-message-ttl", 60000);//true,false跟logback.xml对应Queue queue = new Queue( "logDirectQueue", true,false,false,map);rabbitAdmin.declareQueue(queue);return queue;}@Beanpublic DirectExchange logDirectExchange() {//true,false跟logback.xml对应return new DirectExchange("log.exchange.direct", false, false);}/*** 根据路由键绑定队列到交换器上** @return*/@Beanpublic Binding logDirectBinding() {return BindingBuilder.bind(logDirectQueue()).to(logDirectExchange()).with("logDirectQueue");}@Beanpublic RabbitAdmin rabbitAdmin(ConnectionFactory defaultConnectionFactory){return new RabbitAdmin(defaultConnectionFactory);}}

测试客户端

package com.xx.pyt.confg;
import java.io.IOException;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
import org.springframework.amqp.core.Message;import com.rabbitmq.client.Channel;///**
//* @author 作者 srp
//* @version 创建时间:2023-12-1 16:45:44
//* 
//*/
@Componentpublic class DirectConsumer {protected final Logger log = LoggerFactory.getLogger(this.getClass());@RabbitListener(bindings = @QueueBinding(value = @Queue(value = "logDirectQueue", durable = "false"),exchange = @Exchange(name = "log.exchange.direct", durable = "false", type = "direct"),key ="logDirectQueue"))@RabbitHandlerpublic void handleMessage(String msg, Channel channel, Message message)  throws IOException {try {// 处理消息逻辑processMessage(msg);// 手动ack确认channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);} catch (Exception e) {// 手动nack拒绝,并要求重新投递channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);log.error(e.getMessage(), e);}}private void processMessage(String message) {// 模拟处理消息过程log.info("Processing message: " + message);}}

此外,如果要对日志进行链路标记,可以是用MDC

package com.xxm.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;import org.slf4j.MDC;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Component;import com.ylkh.admin.entity.MyUser;
import com.ylkh.security.dto.JwtUserDto;import cn.hutool.core.lang.UUID;
import lombok.extern.slf4j.Slf4j;/**
* @author 作者 srp
* @version 创建时间:2022年1月4日 下午12:52:43
* 
*/
@Slf4j
@Component
@WebFilter(urlPatterns = "/**",filterName = "tlFilter")
public class TraceLogLocalFilter implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {log.debug("链路过滤器初始化");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request = (HttpServletRequest) servletRequest;if(SecurityContextHolder.getContext().getAuthentication()!=null&&!"anonymousUser".equals(SecurityContextHolder.getContext().getAuthentication().getPrincipal())) {//log.info(""+SecurityContextHolder.getContext().getAuthentication().getPrincipal());JwtUserDto jwtUserDto = (JwtUserDto) SecurityContextHolder.getContext().getAuthentication().getPrincipal();MyUser myUser = jwtUserDto.getMyUser();MDC.put("user", myUser.getUserName());} String logtrackId = UUID.randomUUID(true).toString();if(!request.getRequestURI().contains(".css")&&!request.getRequestURI().contains(".js")&&!request.getRequestURI().contains(".html"))//添加MDC日志{ MDC.put("logTrackId",logtrackId);MDC.put("requestUri", request.getRequestURI());}try {filterChain.doFilter(servletRequest, servletResponse);}finally{//移除MDC日志MDC.remove(logtrackId);}//    log.info("过滤器执行完成");}@Overridepublic void destroy() {log.warn("过滤器销毁");}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/202777.shtml

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

相关文章

封装请求头内容格式

// 请求头-内容类型 export const ContentType { JSON: application/json;charsetUTF-8, FORM: application/x-www-form-urlencoded;charsetUTF-8, UPLOAD: multipart/form-data, STREAM: application/octet-stream;charsetUTF-8 } /** * description: 文件上传 * param {*}…

java多人聊天

服务端 package 多人聊天;import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.PrintStream; import java.net.ServerSocket; import java.net.Socket; import java.util.ArrayList;…

在windows下编译libiconv库

libiconv是一个基于GNU协议的开源库,主要用于解决多语言编码处理转换等应用问题。在linux系统使用比较方便,但是windows下使用需要进行源码编译。这里我是使用libiconv的1.15版本源码和VS2019默认工具集配置进行编译。 首先需要用VS2019创建一个空项目,根目录为libiconv。 在…

Nero刻录光盘软件-极好用

目录 一、下载Nero 二、软件安装 三、刻录数据 前言 刻录之前准备一张新的光盘&#xff0c;之前一旦使用过&#xff0c;就无法刻录&#xff0c;一定要新的光盘。 一、下载Nero nero官网下载地址&#xff1a;Nero下载 csdn免费下载地址&#xff1a;https://download.csdn.…

springboot引入swagger2

1&#xff0c;pom文件里引入swagger-ui依赖 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.7.0</version></dependency><dependency><groupId>io.spring…

迈向成功:解读新能源汽车企业竞争优势策略

尽管受汽车“缺芯”、疫情等因素的制约&#xff0c; 新能源汽车 的销量表现仍非常亮眼。我国新能源汽车行业从起初的政策驱动&#xff0c;逐步进入“成本技术”驱动阶段&#xff1b;动力电池为核心环节&#xff0c;呈现“一超多强”格局&#xff0c;整车厂行业格局远未形成。新…

TCP实现一对一聊天

一&#xff0c;创建类 二&#xff0c;类 1.ChatSocketServer类 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintWriter; import java.net.ServerSocket; import java.net.Socket; import java.util.Sca…

若依框架 前台自己获取登录用户信息

这个方法其实只能获取到用户名称&#xff0c;获取不到用户id&#xff0c;不知道官方文档写了但是没有是个什么意思 const userid this.$store.state.user.userId;const username this.$store.state.user.name 1.获取用户id 在src包下找到store&#xff0c;modules下的user…

visionOS空间计算实战开发教程Day 11 标题动画

本文我们要在visionOS内实现一个标题输出的动画效果。主要讲​​ViewModifier​​​协议&#xff0c;修饰符&#xff08;modifier&#xff09;应用于视图或另一个视图修饰符&#xff0c;生成原值的另一个版本。在希望创建一个可应用于不同视图的修饰符时可实现​​ViewModifier…

docker基本管理和docker相关概念

docker是开源的的应用容器引擎&#xff0c;基于go语言开发的&#xff0c;运行在linux系统当中的开源的轻量级的"虚拟机。 docker的容器技术可以在一台主机上轻松的为任何应用创建一个轻量级的&#xff0c;可以移植的&#xff0c;自给自足的容器 docker的宿主机是linux系…

[Unity数据管理]自定义菜单创建Unity内部数据表(ScriptableObject)

Unity 在开发的时候如果数据量比较大&#xff0c;或者一部分数据需要存在云端&#xff0c;那么就需要一些数据库 轻量型到大型的包括&#xff1a; 数组-内存存储读取 列表-内存存储读取 List<T> tList new List<T>(); XML-硬盘存储读取 JSON-硬盘存储读取 …

YoloV5改进策略:UniRepLKNet,大核卷积的最新成果,轻量高效的首选(全网首发)

摘要 将UniRepLKNet应用到YoloV5的改进中,经过测试,涨点明显,运算量也有下降! 论文:《UniRepLKNet:用于音频、视频、点云、时间序列和图像识别的通用感知大内核ConvNet》 https://arxiv.org/abs/2311.15599 大核卷积神经网络(ConvNets)最近受到了广泛的研究关注,但存…

pycharm使用Anaconda中的虚拟环境【我的入门困惑二】

Anaconda的作用 Anaconda的存在&#xff0c;使得一台电脑上可以存在多个不同版本的python和相应的包&#xff0c;这解决了多个项目运行时&#xff0c;所需要的python和包版本不同的问题。 本文内容 今天就来简单说说如何在pycharm使用Anaconda中的虚拟环境。 详细介绍 首先…

RESTful设计规范

文章目录 前言一、RESTful API 设计规范二、基本设计方法1、资源的命名2、资源的版本3、确定的URL4、选择HTTP方法5、选择合适的状态码 三、RESTful 和 SOAP的区别总结 前言 RESTful风格是由Roy Fielding在2000年提出。它主要用于构建基于Web的应用程序&#xff0c;强调使用HT…

慎用!3个容易被打的Python恶搞脚本

Python 无限恶搞朋友电脑&#xff0c;别提有多爽了&#xff0c;哈哈&#xff0c;打造自己的壁纸修改器&#xff0c;电脑无限锁屏&#xff0c; 无线弹窗&#xff0c;都在这里&#xff01;&#xff01;&#xff01; 1、修改电脑桌面壁纸 工具使用 开发环境&#xff1a;python3…

设计原则 | 依赖转置原则

一、依赖转置原则&#xff08;DIP&#xff1a;Dependence Inversion Principle&#xff09; 1、原理 高层模块不应该依赖低层模块&#xff0c;二者都应该依赖于抽象抽象不应该依赖于细节&#xff0c;细节应该依赖于抽象 2、层次化 Booch曾经说过&#xff1a;所有结构良好的面…

【408】计算机学科专业基础 - 计算机组成原理

一、计算机系统概述 【复习提示】 本章是组成原理的概述&#xff0c;考查时易针对有关概念或性能指标出选择题&#xff0c;也可能综合后续章节的内容出有关性能分析的综合题。掌握本章的基本概念&#xff0c;是学好后续章节的基础。部分知识点在初学时理解不深刻也无须担忧&am…

网店一键搬家要用到的API接口

什么是“一键搬家”&#xff1f; 我们需要了解一下什么是“一键搬家”。简单来说&#xff0c;一键搬家就是将一个网店的所有数据&#xff08;包括商品、订单、客户等&#xff09;迁移到另一个网店的过程&#xff0c;这样就可以实现网店的“搬家”。 item_get-获得淘宝商品详情…

计算机操作系统3

1.虚拟机 VM 两类虚拟机的对比&#xff1a; 2.进程 进程的特征&#xff1a; 进程状态的转换&#xff08;五大状态&#xff09; 3.进程控制原语的作用 4.线程 ​​​​​线程的属性 实现方式 5.调度算法的评价指标