RabbitMQ六:通过routingkey模拟日志

序言

本章文章进入深入了解RabbiMQ,平时项目中我们经常用到记录日志,常见的不外乎:Info、debug、warn、Error。

    情境进入:先简单说一下我们需求,我们开发过程中会遇到很多日志记录,每种日志正常我们会放在不同时的文件夹(当然有的也可以合并,具体问题具体分析),现在我们就记录不同的日志,然后根据不同的类型,进行查找日志记录。

100个数内,实现1(Info) 、2(debug)、3(warn)、4(Error)       5(Info) 、6(debug)、7(warn)、8(Error)。。。。。。然后根据不同日志类型去查

备注:(如果有不太懂这几种类型的,我会在单独写一篇,对他们的简单了解,当然网上也有很多,但是我想写出自己的风格,个人如果写一篇,可能印象更深刻,以后不懂,回头看自己内容,秒懂呀,哈哈哈哈)

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

既然记录日志,那我们可以把所有日志放在一个交换机(Exchange),然后把不同的日志类型,当做每一种类型的队列, 首先我们需要一个exchange,在之前我们是在消息生产者中去声明exchange、queue以及它们的绑定关系,这显然   不严谨。  对于消息发布者而言它只负责把消息发布出去,甚至它也不知道消息是发到哪个queue(有没有类似大厨在厨房做饭,具体饭菜是哪一包间,大厨根本不问。。。), 消息通过exchange到达queue,exchange的职责非常简单,就是一边接收发布者的消息一边把这些消息推到queue中(有没有像传菜员,他只负责从大厨那获取菜,然后送给每个包间的客户。。。)。

而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,(好比传菜员是不是,需要电子菜单,准确的把菜送到包间。。。。。)

下面有一张关系图,p(发布者)  --->  x(exchange)  bindding(绑定关系也就是我们的routingkey) 红色代表着queue

下面也算是我们编程的思路,如果你对前几篇文章稍微了解,想必,这一眼就能看出来,好了,废话少说,下面我就直接上干活。。。。。。。。。。

干货(代码)

发布者 代码

        /// <summary>
        /// 日志处理(routingKey实现日志处理)
        /// </summary>
        /// <param name="args"></param>
        /// 需求简述: 100个数内,实现1(Info) 、2(debug)、3(warn)、4(Error) 5(Info) 、6(debug)、7(warn)、8(Error)。。。。。。然后根据不同日志类型去查
        static void Main(string[] args)
        {
            //这里的代码我们就不多说了,看前面的博客
            using (var channel = HelpConnection.GetConnection().CreateModel())
            {
                //声明交换机 direct模式:交换机名称,模式,持久耐用,自动删除,null
                channel.ExchangeDeclare("LogExchange", "direct", true, false, null);
                //先定义包含所有日志类型的数组
                string[] logname = { "info", "debug", "warn", "error" };
                // 创建队列和绑定关系
                for (int i = 0; i < logname.Length; i++)
                {
                    channel.QueueDeclare(logname[i], true, false, false, null);
                    //进行绑定
                    channel.QueueBind(logname[i], "LogExchange", logname[i], null);
                }
                //参数定义
                string msgBody = string.Empty;
                int index = 0;
                string routingkey = string.Empty;
                // 发布
                for (int i = 0; i < 100; i++)
                {
                    routingkey = logname[index++];
                    msgBody = i.ToString() + routingkey;
                    index = index == 4 ? 0 : index;
                    // var routingkey = i % 2 == 0 ? "info" : i % 3 == 0 ? "debug" : "error";
                    var msg = Encoding.UTF8.GetBytes(msgBody);
                    Console.WriteLine(msgBody);
                    channel.BasicPublish("LogExchange", routingKey: routingkey, basicProperties: null, body: msg);
                }
            }
            Console.WriteLine("发布成功!!!");
            Console.ReadKey();
        }

效果图

消费者代码

 static void Main(string[] args)
        {
            bool flag = true;
            string level = "";
            while (flag)
            {
                Console.WriteLine("请指定要接收的消息级别");
                level = Console.ReadLine();
                if (level == "info" || level == "error" || level == "debug")
                {
                    using (var channel = HelpConnection.GetConnection().CreateModel())
                    {
                        //声明交换机 direct模式
                        channel.ExchangeDeclare("LogExchange", "direct", true, false, null);
                        //根据声明使用的队列
                        // var queueName = level == "info" ? "Log_else" : level == "debug" ? "Log_else" : "Log_error";
                        channel.QueueDeclare(level, true, false, false, null);
                        //进行绑定
                        channel.QueueBind(level, "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(level, true, consumer);
                        Console.ReadKey();
                    }
                }
                else
                    Console.Write("仅支持info、debug与error级别");
            }
}

效果图

总结

上面文章有学习远友 编程梦 的文章,以上内容仅仅是个人理解和学习,如果有不对的地方或者描述的地方,欢迎拍砖扶正。。。。。。

没想到,我已经写第六篇了,代码入门很简单,但是有些东西,自己去敲理解更深刻。。。

我中间那个小小循环,我之前就想复杂了,还是朋友的推荐,哈哈哈哈,还是实践出真谛。。。

这篇文我昨天在家按照编程梦的思想,敲一遍,一直不能执行成功,后来发现问题,解决了。。。

本篇文章在路上,想怎么把这运用更灵活,期待你博客比我更好,更灵活,哈哈哈。。。

刚刚学着写,大神请教,少喷,拍砖扶正。。。。。。。。。。。。

  • 博主是利用读书、参考、引用、抄袭、复制和粘贴等多种方式打造成自己的纯镀 24k 文章,请原谅博主成为一个无耻的文档搬运工!
  • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。
时间: 2024-10-12 08:49:28

RabbitMQ六:通过routingkey模拟日志的相关文章

运维学python之爬虫高级篇(六)scrapy模拟登陆

上一篇介绍了如何爬取豆瓣TOP250的相关内容,今天我们来模拟登陆GitHub. 1 环境配置 语言:Python 3.6.1 IDE: Pycharm 浏览器:firefox 抓包工具:fiddler 爬虫框架:Scrapy 1.5.0 操作系统:Windows 10 家庭中文版 2 爬取前分析 分析登陆提交信息分析登陆信息我使用的是fiddler,fiddler的使用方法就不作介绍了,大家可以自行搜索,首先我们打开github的登陆页面,输入用户名密码,提交查看fiddler获取的信息,我这

消息队列_RabbitMQ-0003.深入RabbitMQ节点/配置/管理及日志实时化?

理解节点: 说明: 节点是指Erlang节点,而且节点之间支持相互通信,RabbitMQ应用跑在Erlang节点之上,应用崩溃,Erlang节点会自动尝试重启应用程序,前提是Erlang本身没有崩溃,节点日志默认位于var/log/rabbitmq/[email protected]log 基本管理: 启动节点: rabbitmq-server -detached 关闭节点: rabbitmqctl stop -n [email protected] 说明: rabbitmq-server启动后

RabbitMQ (六) : 订阅者模式之路由模式 ( direct )

路由模式下,生产者发送消息时需要指定一个路由键(routingKey),交换机只会把消息转发给包含该路由键的队列 这里,我们改变一下声明交换机的方式. 我们通过管理后台添加一个交换机. 添加后,生产者和消费者的代码中就不需要再声明交换机了.同样,也可以通过管理后台添加队列,那么代码中也不需要声明队列了. 生产者 public class Producer { private const string ExchangeName = "test_exchange_direct"; publ

ios测试基础六:ios模拟不同网速

iOS模拟不同网络速度,模拟2G 3G网速下,检验手机上运行是否正常,各种loading图标使用是否正常等 前提准备: 1. 电脑 上安装 charles或者fiddler 代理软件: 2. iphone真机或模拟器: 操作步骤: 1.将iphone真机绑定 代理,电脑上打开代理软件,比如charles 2. 在charles菜单 栏上 选择 "Proxy"--"Throttle Setting"; 3. 在打开的弹框中,作如下选择,点击"ok"

Android源代码解析之(六)--&amp;gt;Log日志

转载请标明出处:一片枫叶的专栏 首先说点题外话,对于想学android framework源代码的同学,事实上能够在github中fork一份,详细地址:platform_frameworks_base 这里面基本都是android framework层的源代码了.并且近期发现了一个比較不错的github插件:OctoTree,它 是一个浏览器插件,它能够让你在Github 看代码时,左边栏会出现一个树状结构.就像我们在IDE 一样.当我们看一个项目的结构,或者想看详细的某个文件,这样就会非常方

Android实战简易教程-第五十六枪(模拟美团客户端进度提示框)

用过美团客户端的朋友都知道,美团的加载等待提示很有意思,是一种动画的形式展现给我们,下面我们就对这背后的原理进行了解,然后实现自己的等待动画效果. 首先我们准备两张图片: 这两张图片看起来一模一样啊?细心的朋友会发现唯一不同的就在脚部,OK,我们就利用这两张图片的轮换播放实现动画效果,下面看一下代码: 1.动画文件frame_meituan.xml: <?xml version="1.0" encoding="utf-8"?> <animation

[HTML] websocket的模拟日志监控界面

模拟命令行的界面效果,使用swoole作为websocket的服务,重新做了下html的界面效果 <html> <head> <title>SwLog Montior-菜地</title> </head> <style> @charset "utf-8"; body { background-color:#000; margin:0px; padding:0px; color:rgb(0,198,83); font

ORACLE 非归档模式下REDO日志丢失修复

第一步:全备datafile,controlfile,spfile/pfile 第二步:恢复日志.(原冷备的日志没有用,千万不要用!) SQL> select member from v$logfile;                         /ora/app/oracle/oradata/orcl/redo03.log /ora/app/oracle/oradata/orcl/redo02.log /ora/app/oracle/oradata/orcl/redo01.log SQL

初识RabbitMQ

1.安装 rabbitmq官网:http://www.rabbitmq.com/ 下载地址:https://packagecloud.io/rabbitmq 下载rabbitmq-server 安装脚本文件 # curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | bash 安装rabbitmq # yum install rabbitmq-server -y