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 文章,请原谅博主成为一个无耻的文档搬运工!
  • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。
原文地址:https://www.cnblogs.com/lrzr/p/7341115.html