你的位置:首页 > ASP.net教程

[ASP.net教程]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