logback整合rabbitmq實現(xiàn)消息記錄日志的配置
更新時間:2023年12月13日 14:31:52 作者:asartear
這篇文章主要介紹了logback整合rabbitmq實現(xiàn)消息記錄日志的配置,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
logback.xml文件配置
<!-- 配置rabbitmq的信息,數(shù)據(jù)取值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文件配置
# rabbitmq rabbitmq: host: 132.33.228.149 username: admin password: admin@2023$ port: 5673 #虛擬host 可以不設置,使用server默認host virtual-host: / connection-timeout: 10000 listener: 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 創(chuàng)建時間:2023-12-1 16:42:41 * */ @Configuration public class RabbitMqLogConfig { @Autowired private RabbitAdmin rabbitAdmin; //強制用此方法生成自己希望的隊列 @Bean public 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; } @Bean public DirectExchange logDirectExchange() { //true,false跟logback.xml對應 return new DirectExchange("log.exchange.direct", false, false); } /** * 根據(jù)路由鍵綁定隊列到交換器上 * * @return */ @Bean public Binding logDirectBinding() { return BindingBuilder.bind(logDirectQueue()).to(logDirectExchange()).with("logDirectQueue"); } @Bean public 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 創(chuàng)建時間:2023-12-1 16:45:44 //* //*/ @Component public 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")) @RabbitHandler public 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 創(chuàng)建時間:2022年1月4日 下午12:52:43 * */ @Slf4j @Component @WebFilter(urlPatterns = "/**",filterName = "tlFilter") public class TraceLogLocalFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.debug("鏈路過濾器初始化"); } @Override public 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("過濾器執(zhí)行完成"); } @Override public void destroy() { log.warn("過濾器銷毀"); } }
到此這篇關于logback整合rabbitmq實現(xiàn)消息記錄日志的文章就介紹到這了,更多相關logback整合rabbitmq內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
關于springboot集成swagger3時spring-plugin-core報錯的問題
這篇文章主要介紹了關于springboot集成swagger3時spring-plugin-core報錯的問題,本文給大家分享解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-09-09Java中的位運算符號解讀(&、|、^、~、<<、>>、>>>)
這篇文章主要介紹了Java中的位運算符號(&、|、^、~、<<、>>、>>>),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-08-08