RoutingKey

每个项目都需要记录日志,日志则一般会分为多种级别,常见的是

Info、debug、warn、Error

对于前三种日志,在项目运行中会产生大量的消息,但是一般多数情况下是不会用到的即时性不高,而error则不同,对于error级别的消息需要迅速通知开发人员去修改项目中的错误

使用RabbitMq应该怎么设计? 可以分析一下

首先我们需要一个exchange,对于即时性不高的日志速度慢一些是没有关系的,所以可以把它们放到一个队列中,而针对error级别即时性较高的需要放到一个单独的队列中。在之前我们是在消息生产者中去声明exchange、queue以及它们的绑定关系,这显然是不对的。

对于消息发布者而言它只负责把消息发布出去,甚至它也不知道消息是发到哪个queue,消息通过exchange到达queue,exchange的职责非常简单,就是一边接收发布者的消息一边把这些消息推到queue中。

而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,下面有一张关系图,p(发布者)  --->  x(exchange)  bindding(绑定关系也就是我们的routingkey) 红色代表着queue

在第一个例子中我们并没有声明exchange而是使用是默认的,在发布的时候routingkey则是使用的队列名,事实上如果没有指定routingkey队列的名称就是routingkey

//声明队列
channel.QueueDeclare("firstTest", true, false, false, null);
//发布消息
var msg = Encoding.UTF8.GetBytes("Hello RabbitMQ");
channel.BasicPublish(string.Empty, routingKey: "firstTest", basicProperties: null, body: msg);

这时可以继续回到我们日志记录了,info、warn、debug 我希望放到Log_else队列中,它们的routingkey分别是info、warn、debug,errror级别的日志我希望放到Log_error队列中,它的routingkey是error。这时可以去编写代码了

在发布者中的代码中我把声明exchange、queue与它们的绑定关系移除掉了,放到了consumber中,,方便演示这里的日志级别只有info、debug、error。下面分别生成了对应的消息

//创建返回一个新的频道
using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{
//发布一百个消息
for (var i = 0; i < 100; i++)
{
//对i进行求余来决定日志的级别
var routingkey = i % 2 == 0 ? "info" : i % 3 == 0 ? "debug" : "error";
var msg = Encoding.UTF8.GetBytes($"{i} :{routingkey}Message");
channel.BasicPublish("LogExchange", routingKey: routingkey, basicProperties: null, body: msg);
} Console.Write("发布成功!"); }

对于consumer而言,这里根据控制台传入的级别创建不同的queue与它们与exchange的关系

            bool flag = true;
string level = "";
while (flag)
{
Console.WriteLine("请指定要接收的消息级别");
level = Console.ReadLine();
if (level == "info" || level == "error" || level == "debug")
flag = false;
else
Console.Write("仅支持info、debug与error级别");
} using (var channel = RabbitMqHelper.GetConnection().CreateModel())
{ //声明交换机 direct模式
channel.ExchangeDeclare("LogExchange", "direct", true, false, null);
//根据声明使用的队列
var queueName = level == "info" ? "Log_else" : level == "debug" ? "Log_else" : "Log_error";
channel.QueueDeclare(queueName, true, false, false, null);
//进行绑定
channel.QueueBind(queueName, "LogExchange", level, null); //创建consumbers
var consumer = new EventingBasicConsumer(channel); consumer.Received += (sender, e) =>
{
var msg = Encoding.UTF8.GetString(e.Body); Console.WriteLine(msg);
}; //进行消费
channel.BasicConsume(queueName, true, consumer); Console.ReadKey(); }

运行了三个consumer,指定三个消息级别

打开Web工具,可以看到已经有了log_else与log_error两种queue。

还有它们的绑定关系

运行消息发布者,这时候就可以看到三个consumer已经在消费了,error的consumer只消费了log_error队列中的消息、其它两个consumer消费的是log_else中的消息

RabbitMQ 通过记日志来看routingkey的更多相关文章

  1. Logback 整合 RabbitMQ 实现统一日志输出

    原文地址:Logback 整合 RabbitMQ 实现统一日志输出 博客地址:http://www.extlight.com 一.前言 公司项目做了集群实现请求分流,由于线上或多或少会出现请求失败或系 ...

  2. 十八、.net core(.NET 6)搭建ElasticSearch(ES)系列之使用Logstash通过Rabbitmq接收Serilog日志到ES

    使用Logstash通过Rabbitmq接收Serilog日志到ES 首先,要部署logstash 为了与前面的ElasticSearch版本保持一致,此处Logstash下载的版本也是7.13.1, ...

  3. ExceptionLess新玩法 — 记日志

    ExceptionLess 之前也有介绍过这个框架,其实网上也有很多的资料,无论是部署还是一些详细的高级玩法都讲的很清楚也很棒,博主也学习了一些他们的博文,因为很多的东西比如本地部署别人已经写了,我再 ...

  4. C#采用rabbitMQ搭建分布式日志系统

    网上对于java有很多开源的组件可以搭建分布式日志系统,我参考一些组件自己开发一套简单的分布式日志系 全部使用采用.NET进行开发,所用技术:MVC.EF.RabbitMq.MySql.Autofac ...

  5. RabbitMQ通过Exchange.topic 对routingkey 进行正则表达式匹配

    消费者: static void Main(string[] args) { ConnectionFactory factory = new ConnectionFactory() { HostNam ...

  6. windows版本rabbitmq安装及日志level设置

    1.DirectX Repair 安装缺失的C++组件,不安装缺失的组件会造成第二部安装erl文件夹缺少bin文件夹2.安装otp_win64_23.1 1.配置 ERLANG_HOME:地址为Erl ...

  7. SYSLOG审记日志的配置。

    前言 syslog是UNIX系统中提供的一种日志记录方法(RFC3164),syslog本身是一个服务器,程序中凡是使用syslog记录的信息都会发送到该服务器,服务器根据配置决定此信息是否记录,是记 ...

  8. 通过日志来看Spring跨库更新操作的事务

    场景介绍: 一个项目俩个数据源,连接俩个不同的库 数据源初始化 @Configuration @MapperScan(basePackages = "com.qing.mapper.paym ...

  9. Spring Boot 笔记 (2) - 使用 log4j2 记日志

    日志框架的选用 Spring 使用的默认日志框架是 logback, 默认情况下会采取默认的 autoconfiguration; 即便想对日志的一些配置进行修改也比较方便, 详细可以参考: Spri ...

随机推荐

  1. mac 10.9.4下配置apache

    mac 10.9.x已经自带了apache,可按如下步骤开启: 1.启动 sudo apachectl start 启动后,访问 http://localhost/ 应该能看到"It wor ...

  2. Android RecyclerView 使用完全解析 体验艺术般的控件

    概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了,大家可以通过导入support-v7对其进行使用. 据官方的介绍,该控件用于在有限的窗口中展示大量数据集,其实这样功能的控件我 ...

  3. Java 基础【11】@注解

    1.注解简介 JDK 1.5 中引入的 java.lang.annotation 包提供注解编程支持,可以让类在编译.类加载.运行时被读取,并执行相应的处理. 在 Java EE应用的时候,总是免不了 ...

  4. Android开发遇到的坑(1):Java中List的安全删除问题

    在项目的开发过程中,一定少不了的是对Java集合中的List接触.项目中对List的删掉也是一种常见的操作,看上这个操作也没什么好说的样子,但是在项目开发中也是最容易出错的地方,特别是对于新手.有时候 ...

  5. 20160803 - C:\WINDOWS\system32\config\systemprofile\Desktop 不可用的解决

    问题:某些软件在从注册表读取用户桌面地址时,欠考虑的%USERPROFILE%的情况,例如迅雷打开文件时,会提示: [Window Title]位置不可用 [Content]C:\WINDOWS\sy ...

  6. [NOIP摸你赛]Hzwer的陨石(带权并查集)

    题目描述: 经过不懈的努力,Hzwer召唤了很多陨石.已知Hzwer的地图上共有n个区域,且一开始的时候第i个陨石掉在了第i个区域.有电力喷射背包的ndsf很自豪,他认为搬陨石很容易,所以他将一些区域 ...

  7. [BZOJ1263][SCOI2006]整数划分(数学+高精度)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1263 分析:数学老师上课讲过啦= =,就是尽可能3越多越好.然后就写个高精度就行了.

  8. j-link或者swd调试

    两种 一.JTAG调试(5针), 二.SWD调试(2针), 在JTAG/SWD模式设置库函数 (在文件stm32f10x_gpio.c中): void GPIO_PinRemapConfig(uint ...

  9. 准确率(Accuracy), 精确率(Precision), 召回率(Recall)和F1-Measure

    yu Code 15 Comments  机器学习(ML),自然语言处理(NLP),信息检索(IR)等领域,评估(Evaluation)是一个必要的 工作,而其评价指标往往有如下几点:准确率(Accu ...

  10. Linq的TakeWhile误用

    where(func<>)返回符合条件的元素 与此相对的skipwhile跳过符合条件的,返回剩下的元素 容易误用的takewhile,与where 不一样,只有当所有元素满足条件时,才返 ...