zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android BitmapUtils工具类
    Android 获取网络类型
    Android 打开文件或文件夹777权限
    Android 获取颜色RGB值
    Android常用数据类型转换
    本周总结
    利用Volley框架实现简单的Android与servlet信息交互
    response.getWriter().write("")中文乱码问题
    软件工程开课博客
    java读取中文文本文件乱码问题
  • 原文地址:https://www.cnblogs.com/hpp3501/p/5960463.html
Copyright © 2011-2022 走看看