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

来源:http://www.cnblogs.com/hpp3501/archive/2016/10/14/5960463.html
-Advertisement-
Play Games

主要技術: log4net-生成日誌。 ActiveMQ-生成日誌的時候發送消息,並實時監控日誌。 SignalR-將ActiveMQ監控的日誌實時顯示到瀏覽器上,而不用刷新瀏覽器。 小實例介紹: 左側命名為系統一,右側命名為系統二 系統一是生成日誌的小工具,系統二根據生成的日誌實時顯示數據,如果E ...


主要技術:

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 嵌套執行的makefile中, 變數和 變數不管是否 都要傳遞到下層的Makefile中,特別是 ,它包含了make的參數信息 使用 來定義命令包 在makefile中,依賴關係可能會需要包含一系列的頭文件,可以使用 來讓它自動生成依賴關係,如果把標準庫的依賴關係也包括進來,需要使用 makefil ...
  • 用來測試文件類型 列出辨識結果時,但不顯示文件名稱 如果文件是符號鏈接,那麼直接解讀其指向的文件 :如果文件是壓縮文件,嘗試去解讀壓縮文件的內容 ...
  • shell腳本有兩種執行方式,一種是直接執行,一種是使用 或 命令執行 直接執行 直接執行shell腳本,bash會在當前bash下新建一個子bash進程用來執行shell腳本,此時腳本里定義的變數,並不會傳會到父bash進程中 source或.執行 使用 來執行一個shell腳本表示使用當前bas ...
  • ppa,即Personal Package Archives(個人軟體包檔案)是Ubuntu Launchpad網站提供的Synaptic服務(是Debian和Ubuntu Linux操作系統的包管理工具apt的圖形化前端),允許個人用戶上傳軟體源代碼,通過Launchpad進行編譯併發布為2進位軟 ...
  • 今天要分享的是使用c#獲取伺服器CPU、RAM、TCP、磁碟使用情況。在asp.net mvc 程式中,加入一個小監控的功能,獲取伺服器上得一些數據:CPU、RAM、TCP、磁碟使用數據。 ...
  • c# .Net :Excel NPOI導入導出操作教程之讀取Excel文件信息及輸出 ...
  • 上一章中筆者對C#一些獨有的語法點進行講解,相信也可以看C#的一些神奇之處。那麼本章主要是放在多線程這方面的知識。不管是C#還是JAVA在開發過程或多或少都會用到關於多線程的編程。當然筆者不可能把多線程的知識點講的很全面。筆者這裡只是講一些筆者常用到的。如果有興趣的朋友,筆者希望主動性去查找一下資料 ...
  • 將bin的只讀屬性去掉,就OK。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...