设为首页 收藏本站
查看: 1168|回复: 0

[经验分享] RabbitMQ六:通过routingkey模拟日志

[复制链接]

尚未签到

发表于 2017-12-9 15:30:45 | 显示全部楼层 |阅读模式
序言
  本章文章进入深入了解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中(有没有像传菜员,他只负责从大厨那获取菜,然后送给每个包间的客户。。。)。
DSC0000.png

  而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,(好比传菜员是不是,需要电子菜单,准确的把菜送到包间。。。。。)
  下面有一张关系图,p(发布者)  --->  x(exchange)  bindding(绑定关系也就是我们的routingkey) 红色代表着queue
DSC0001.png

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


干货(代码)

发布者 代码



        /// <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, true, false, false, null);
//进行绑定
channel.QueueBind(logname, "LogExchange", logname, 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();
}
  效果图
DSC0003.png DSC0004.png


消费者代码



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级别");
}
}
效果图
DSC0005.png DSC0006.png DSC0007.png

DSC0008.png


总结
  上面文章有学习远友 编程梦 的文章,以上内容仅仅是个人理解和学习,如果有不对的地方或者描述的地方,欢迎拍砖扶正。。。。。。
  没想到,我已经写第六篇了,代码入门很简单,但是有些东西,自己去敲理解更深刻。。。
  我中间那个小小循环,我之前就想复杂了,还是朋友的推荐,哈哈哈哈,还是实践出真谛。。。
  这篇文我昨天在家按照编程梦的思想,敲一遍,一直不能执行成功,后来发现问题,解决了。。。
  本篇文章在路上,想怎么把这运用更灵活,期待你博客比我更好,更灵活,哈哈哈。。。
  刚刚学着写,大神请教,少喷,拍砖扶正。。。。。。。。。。。。


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

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-422446-1-1.html 上篇帖子: RabbitMQ十:重要方法简述(参数) 下篇帖子: 安装,配置 SMTP 服务器
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表