• 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 文章,请原谅博主成为一个无耻的文档搬运工!
    • 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。
  • 相关阅读:
    可分离卷积详解及计算量 Basic Introduction to Separable Convolutions
    全面解读Group Normalization,对比BN,LN,IN
    高斯混合模型(GMM)及MATLAB代码
    VLAD算法浅析, BOF、FV比较
    MATLAB 可以画的各种类型的图总结
    检测算法简介及其原理——fast R-CNN,faster R-CNN,YOLO,SSD,YOLOv2,YOLOv3
    深度学习图像配准 Image Registration: From SIFT to Deep Learning
    在IIS7里配置 ISAPI,运行dll程序,总提示下载dll
    iis7下配置php出现404.17错误的解决办法
    C# Acrobat打开pdf出错,提示Acrobat.AcroPDDocClass不能强制转换为Acrobat.CAcroPDDoc,使用com组件{9B4CD3E7-4981-101B-9CA8-9240CE2738AE},HRESULT: 0x80004002
  • 原文地址:https://www.cnblogs.com/lrzr/p/7341115.html
Copyright © 2020-2023  润新知