ActiveMQ消息队列和SignalR之日志实时监控及警报小实例
主要技术:
log4net-生成日志。
ActiveMQ-生成日志的时候发送消息,并实时监控日志。
SignalR-将ActiveMQ监控的日志实时显示到浏览器上,而不用刷新浏览器。
小实例介绍:
左侧命名为系统一,右侧命名为系统二
系统一是生成日志的小工具,系统二根据生成的日志实时显示数据,如果ERROR级别的日志超过50条则实时显示警报。

系统一主要代码分析:
1.消息队列类-发送消息的方法
public class ActiveMQHelper
{
private IConnectionFactory factory;
/// <summary>
/// 初始化ActiveMQ工厂
/// </summary>
public ActiveMQHelper()
{
try
{
//初始化工厂,这里默认的URL是不需要修改的
factory = new ConnectionFactory("tcp://localhost:61616");
}
catch(Exception ex)
{
new LogHelper(typeof(ActiveMQHelper)).Fatal(string.Format("消息队列服务器初始化失败"),ex);
}
}
/// <summary>
/// 发送消息方法
/// </summary>
/// <param name="msg"></param>
public void CreateConnection(string msg)
{
//通过工厂建立连接
using (IConnection connection = factory.CreateConnection())
{
//通过连接创建Session会话
using (ISession session = connection.CreateSession())
{
//通过会话创建生产者,方法里面new出来的是MQ中的Queue
IMessageProducer prod = session.CreateProducer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("LogsQueue"));
//创建一个发送的消息对象
ITextMessage message = prod.CreateTextMessage();
//给这个对象赋实际的消息
message.Text = msg;
//设置消息对象的属性,这个很重要哦,是Queue的过滤条件,也是P2P消息的唯一指定属性
message.Properties.SetString("filter", "log");
//生产者把消息发送出去,几个枚举参数MsgDeliveryMode是否长链,MsgPriority消息优先级别,发送最小单位,当然还有其他重载
prod.Send(message, MsgDeliveryMode.Persistent, MsgPriority.Normal, TimeSpan.MinValue);
}
}
}
}
2.生成error日志的时候发送一条消息

系统二主要代码分析:
1.页面代码
SignalR简介:浏览器之所以能不刷新而事实加载数据,全靠SignalR的功劳。后台动态生成javascript函数,页面上调用后台生成的函数即可。
下图调用的是后台MyHub.cs类的构造函数,调用方法为var chat = $.connection.myHub,SignalR具体使用请自行搜索相关资料。

2.后台代码 MyHub.cs类:
说明:下面灰色的一行代码就是动态生成的javascript动态函数
Clients.All.addNewMessageToPage(json); //前台页面要调用的函数
public class MyHub : Hub
{
public delegate void DelegateRevMessage(ITextMessage message);
private static string logPath = ConfigHelper.GetAppSetting("logpath");
public MyHub()
{
var index = new Random().Next(1, 100);
//创建连接工厂
IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");
//通过工厂构建连接
Apache.NMS.IConnection connection = factory.CreateConnection();
//这个是连接的客户端名称标识
connection.ClientId = "LogsQueueListener"+index;
//启动连接,监听的话要主动启动连接
connection.Start();
//通过连接创建一个会话
ISession session = connection.CreateSession();
//通过会话创建一个消费者,这里就是Queue这种会话类型的监听参数设置
IMessageConsumer consumer = session.CreateConsumer(new Apache.NMS.ActiveMQ.Commands.ActiveMQQueue("LogsQueue"), "filter='log'");
//注册监听事件
consumer.Listener += new MessageListener(consumer_Listener);
}
void consumer_Listener(IMessage message)
{
ITextMessage msg = (ITextMessage)message;
DelegateRevMessage delegateRev = RevMessage;
IAsyncResult result = delegateRev.BeginInvoke(msg, null, null);
delegateRev.EndInvoke(result);
}
/// <summary>
/// 消息队列实时监控的方法
/// </summary>
/// <param name="message"></param>
public void RevMessage(ITextMessage message)
{
//message.Text : 此值为消息队列中的值
List<LogInfoModel> list = this.Analysis(DateTime.Now);
if (list != null && list.Count > 0)
{
var fatalList = list.Where(x => x.Level.ToLower() == LevelEnum.FATAL.AsString().ToLower()).ToList();
var errorList = list.Where(x => x.Level.ToLower() == LevelEnum.ERROR.AsString().ToLower()).ToList();
/*
* 此处可以根据日志级别及日志数量,处理警报操作。
* 比如if(fatalList.Count>0){//发邮件;//微信提醒;//发短信等} //如果有fatal级别的日志则立马警报;
* 或者if(errorList.Count>50){//发邮件;//微信提醒;//发短信等} //如果error级别的日志超过50条则立马警报;
* **/
var json = new { fatalCount = fatalList.Count, errorCount = errorList.Count };
Clients.All.addNewMessageToPage(json); //前台页面要调用的函数
}
}
/// <summary>
/// 根据日期获取当天的日志列表
/// </summary>
/// <param name="date"></param>
/// <returns></returns>
public List<LogInfoModel> Analysis(DateTime date)
{
var loganalysis = new LogAnalysisBll();
var month = date.Month.ToString();
var day = date.Day.ToString();
month = month.Length == 1 ? "0" + month : month;
day = day.Length == 1 ? "0" + day : day;
//根据日志路径分析日志,获取列表
var list = loganalysis.GetLog(string.Format("{4}{0}\\{1}\\{2}\\{3}.log", date.Year, month, date.Day, date.ToString("yyyyMMdd"), logPath));
return list;
}
}
特别说明:我也是刚开始研究ActiveMQ和SignalR,如果有不妥的地方,还望大神门能多多指导,O(∩_∩)O
ActiveMQ消息队列和SignalR之日志实时监控及警报小实例的更多相关文章
- ActiveMQ 消息队列服务
1 ActiveMQ简介 1.1 ActiveMQ是什么 ActiveMQ是一个消息队列应用服务器(推送服务器).支持JMS规范. 1.1.1 JMS概述 全称:Java Message Serv ...
- ActiveMQ基础教程(四):.net core集成使用ActiveMQ消息队列
接上一篇:ActiveMQ基础教程(三):C#连接使用ActiveMQ消息队列 这里继续说下.net core集成使用ActiveMQ.因为代码比较多,所以放到gitee上:https://gitee ...
- activemq消息队列的使用及应用docker部署常见问题及注意事项
activemq消息队列的使用及应用docker部署常见问题及注意事项 docker用https://hub.docker.com/r/rmohr/activemq/配置在/data/docker/a ...
- JAVA的设计模式之观察者模式----结合ActiveMQ消息队列说明
1----------------------观察者模式------------------------------ 观察者模式:定义对象间一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的 ...
- ActiveMQ消息队列从入门到实践(4)—使用Spring JMS收发消息
Java消息服务(Java Message Service ,JMS)是一个Java标准,定义了使用消息代理的通用API .在JMS出现之前,每个消息代理都有私有的API,这就使得不同代理之间的消息代 ...
- C#实现ActiveMQ消息队列
本文使用C#实现ActiveMQ消息队列功能. 一.首先需要导入两个包,分别是:Apache.NMS 和 Apache.NMS.ActiveMQ 二.创建Winform程序实现生产者功能. 三.Pro ...
- SpringBoot集成ActiveMq消息队列实现即时和延迟处理
原文链接:https://blog.csdn.net/My_harbor/article/details/81328727 一.安装ActiveMq 具体安装步骤:自己谷歌去 二.新建springbo ...
- (四)RabbitMQ消息队列-服务详细配置与日常监控管理
原文:(四)RabbitMQ消息队列-服务详细配置与日常监控管理 RabbitMQ服务管理 启动服务:rabbitmq-server -detached[ /usr/local/rabbitmq/sb ...
- JAVAEE——宜立方商城08:Zookeeper+SolrCloud集群搭建、搜索功能切换到集群版、Activemq消息队列搭建与使用
1. 学习计划 1.solr集群搭建 2.使用solrj管理solr集群 3.把搜索功能切换到集群版 4.添加商品同步索引库. a) Activemq b) 发送消息 c) 接收消息 2. 什么是So ...
随机推荐
- dropdownlist select的用法
<tr> <td></td> <td>@Html.DropDownList("ddlSex",@Mode ...
- 网络请求中的URL中传bool型数据
如果在URL中要拼接bool的数据,OC这边不能使用BOOL型.因为使用NSString的拼接字符串类方法中,会将BOOL型数据转化为0或者1. 解决办法: NSString *overdue_str ...
- 洛谷 P5242 [USACO19FEB]Cow Dating P
这道题很有意思. 不难发现,对于一个区间 \([l, r]\),恰好只有一个奶牛接受邀请的概率为 \[\prod_{i=l}^r(1-p_i) \cdot \sum_{i=l}^r \frac {p_ ...
- 五 RequestMapping的使用
1 设置路径映射为数组,在Controller类中一个方法对应多个映射路径,可以被多个url访问 2 分目录管理,在Controller类上添加Request Mapping注解,url访问必须添加相 ...
- 【剑指Offer面试编程题】题目1513:二进制中1的个数--九度OJ
题目描述: 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 输入: 输入可能包含多个测试样例. 对于每个输入文件,第一行输入一个整数T,代表测试样例的数量.对于每个测试样例输入为一个 ...
- day12-Python运维开发基础(推导式、生成器与生成器函数)
1. 推导式(列表推导式.集合推导式.字典推导式) # ### 推导式 : 通过一行循环判断,遍历出一系列数据的方式是推导式 """ 推导式一共三种: 列表推导式,集合推 ...
- Android加载手机磁盘上的资源---decodeFile方法的使用
一般在写Android程序时,通常会将图片资源放在/res/drawable/文件夹下,读取时,通过R.drawable.imageId即可读取图片内容,但用户在使用时,一般会想要读取存放在存储卡上的 ...
- WebRobot1.8.2网站多功能网络安全渗透检测工具
新版介绍 最新版的Webrobot使用的是插件模式,插件存放在主程序目录下的plugin文件夹里,所有插件的配置文件及字典等其他文件也存放在这个文件夹内.我们需要用到哪个插件,只需要双击它便可打开,需 ...
- 使用EasyUI中Tree
easyui里面的加载tree的两种方式 第一种: 使用EasyUI中Tree 符合EasyUI中Tree的Json格式,我们先看一下,格式是如何的 [{ , "text":&qu ...
- Jmeter插件解释
Jmeter插件解释 1.jp@gc - Actiive Threads Over Time:不同时间活动用户数量展示(图表) 2.jp@gc - AutoStop Listener :自动停止监听 ...