RabbitMQ 通过记日志来看routingkey

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("发布成功!");

}

对于consumber而言,这里根据控制台传入的级别创建不同的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();

            }

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

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

还有它们的绑定关系

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

时间: 2024-10-16 18:30:36

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

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

原文地址:Logback 整合 RabbitMQ 实现统一日志输出 博客地址:http://www.extlight.com 一.前言 公司项目做了集群实现请求分流,由于线上或多或少会出现请求失败或系统异常,为了查看失败请求的日志信息,我们得将所有服务的日志文件都打开来进行问题的定位分析,操作起来非常麻烦.因此,我们开发组决定设计一套日志查看系统来解决上述问题. 二.实现思路 默认的,应用服务日志信息会保存在本地服务器的目录中,为了方便查看日志我们应该把多台服务器日志统一输出到一个日志文件中.

RabbitMQ的数据日志存放以及数据迁移

一.rabbitMQ的数据和日志的存储位置 当我们安装rabbitMQ时,系统RabbitMQ默认读取的配置文件路径在%AppData%\RabbitMQ中,我们可以从以下脚本文件中可以看出: 想找到这个存储位置,一般我们就可以先去该文件路径查看有没有最近的日志和数据,那为什么要看有没有最近日期的呢? 答:因为日志和数据的位置是可以人为改变的,如果日志和数据的最新日期已经停留在很久之前并且队列一直都是在使用的,那么99%的可能都是因为存储位置改变了. 那么是如何改变的呢? 我们可以参考这篇文章:

方便记日志的魔术常量

__LINE__     文件中的当前行号. __FILE__     文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名.自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径. __DIR__      文件所在的目录.如果用在被包括文件中,则返回被包括的文件所在的目录.它等价于dirname(__FILE__).除非是根目录,否则目录中名不包括末尾的斜杠.(PHP 5.3.0中新增)

Nginx tcp限制并发、IP、记日志

L:114 Syntax: limit_conn_zone key zone=name:size;//类似http limit_conn 需要开个共享内存  zone=name(共享内存名称):size(共享内存大小): Default: — Context: stream limit_conn_zone $binary_remote_addr zone=addr:10m; server { ... limit_conn addr 1; } Syntax: limit_conn_log_leve

一个简单的java程序,用于RabbitMQ日志监控

RabbitMQ的所有日志,都会发给topic类型的exchange "amq.rabbitmq.log"  routingKey 有 debug,info,waring,error.  如果接收所有类型日志,可以用 # package logs; import java.io.IOException; import java.util.concurrent.TimeoutException; import com.rabbitmq.client.Channel; import com

记处理线上记录垃圾日志 The view &#39;Error&#39; or its master was not found

最近监控线上日志,网站是ASP.NET MVC 开发的,发现不少错误日志都记录同样的内容: The view 'Error' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/Search/Error.aspx ~/Views/Search/Error.ascx ~/Views/Shared/Er

RabbitMQ学习记录1

前言 我是在解决分布式事务的一致性问题时了解到RabbitMQ的,当时主要是要基于RabbitMQ来实现我们分布式系统之间对有事务可靠性要求的系统间通信的.关于分布式事务一致性问题及其常见的解决方案,可以看我另一篇博客.提到RabbitMQ,不难想到的几个关键字:消息中间件.消息队列.而消息队列不由让我想到,当时在大学学习操作系统这门课,消息队列不难想到生产者消费者模式.(PS:操作系统这门课程真的很好也很重要,其中的一些思想在我工作的很长一段一时间内给了我很大帮助和启发,给我提供了许多解决问题

Python并发编程-RabbitMq消息队列

消息中间件 --->就是消息队列 异步方式:不需要立马得到结果,需要排队 同步方式:需要实时获得数据,坚决不能排队 subprocess 的Q也提供不同进程之间的沟通 应用场景: 买票,抢购 堡垒机批量发送文件 Centos6.x系统编译安装RabbitMQ 一.系统环境 [[email protected] ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [[email protected] ~]# uname -r 2.6.32-

JAVA日志库

一.常用日志Jar关系 2015第30周四Java日志组件 接口:将所有日志实现适配到了一起,用统一的接口调用. 实现:目前主流的日志实现 旧日志到slf4j的适配器:如果使用了slf4j,但是只想用一种实现,想把log4j的日志体系也从logback输出,这个是很有用的. slf4j到实现的适配器:如果想制定slf4j的具体实现,需要这些包. slf4J与旧日志框架的关系 slf4j等于commons-logging,是各种日志实现的通用入口,会根据classpath中存在下面哪一个Jar来决