程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> ActiveMQ消息隊列和SignalR之日志實時監控及警報小實例,activemqsignalr

ActiveMQ消息隊列和SignalR之日志實時監控及警報小實例,activemqsignalr

編輯:關於.NET

ActiveMQ消息隊列和SignalR之日志實時監控及警報小實例,activemqsignalr


主要技術:

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved