序言
本章文章进入深入了解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 文章,请原谅博主成为一个无耻的文档搬运工!
- 小弟刚迈入博客编写,文中如有不对,欢迎用板砖扶正,希望给你有所帮助。