主要技術:
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