摘要

昨天吃饭的时候,突然想起来一个好玩的事,如果能有个页面可以实时的监控网站或者其他类型的程序的日志,其实也不错。当然,网上也有很多成熟的类似的监控系统。就想着如果通过.net该如何实现?所以就在想,通过系统内部将消息推送到前端,.net中可以通过pull或者push的方式,pull通常的做法就是ajax方式不停的请求一个接口,这种方式,不太理想。然后就在想如何通过服务端想客户端推送消息。之前看到过SignalR方面的文章可以实现push的功能,signalr也是第一次接触,在这个网站http://www.asp.net/signalr看了一些文章。就自己动手做了这样的日志监控的demo。

一个简单的例子

先上一段代码,如下:

该类是一个监控日志文件是否变化的一个单例类。其中维护一个日志队列。

    public class FileSystemWatcherSingle{public FileSystemWatcher wather;private static FileSystemWatcherSingle _instance;private static readonly object _objLock = new object();public Queue<Log> MyQueue;private string _watherFolderPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log");private FileSystemWatcherSingle(){if (MyQueue == null){MyQueue = new Queue<Log>();}if (wather == null){wather = new FileSystemWatcher();if (!Directory.Exists(_watherFolderPath)){Directory.CreateDirectory(_watherFolderPath);}wather.Path = _watherFolderPath;wather.EnableRaisingEvents = true;}}public static FileSystemWatcherSingle CreateInstance(){if (_instance == null){lock (_objLock){if (_instance == null){_instance = new FileSystemWatcherSingle();}}}return _instance;}}

写日志的操作

在写入文件之前,将当前的日志加入到日志队列里面。

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;namespace Wolfy.LogMonitor.Models
{public class LogHelper{public static void WriteLog(Log log){string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Log");if (!Directory.Exists(dir)){Directory.CreateDirectory(dir);}string _watherFilePath = Path.Combine(dir, DateTime.Now.ToString("yyyy-MM-dd") + ".log");if (!File.Exists(_watherFilePath)){File.Create(_watherFilePath);}FileSystemWatcherSingle wather = FileSystemWatcherSingle.CreateInstance();wather.MyQueue.Enqueue(log);File.AppendAllText(_watherFilePath, string.Format("{0} {1}\r\n{2}", log.Type.ToString(), log.Dt, log.Content));            }}
}

LogHub类

需要安装SignalR,在安装完成时,有个Readme文件,根据里面的提示,需要添加StartUp类,添加对应的owin程序集。

using Microsoft.Owin;
using Owin;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Wolfy.LogMonitor.App_Start;
[assembly: OwinStartup(typeof(Startup))]
namespace Wolfy.LogMonitor.App_Start
{public class Startup{public void Configuration(IAppBuilder app){app.MapSignalR();}}
}

LogHub继承Hub类,并在这里想所有客户端推送消息。并在这里面面为文件监控类FileSystemWatcher注册创建和Change事件。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Hubs;
using System.Timers;
using Newtonsoft.Json;namespace Wolfy.LogMonitor.Models
{[HubName("logHub")]public class LogHub : Hub{private FileSystemWatcherSingle fileWather;public void Send(string name, string message){// Call the addNewMessageToPage method to update clients.Clients.All.addNewMessageToPage(name, message);}public LogHub(){fileWather = FileSystemWatcherSingle.CreateInstance();fileWather.wather.Changed += wather_Changed;fileWather.wather.Created += wather_Created;}void wather_Created(object sender, System.IO.FileSystemEventArgs e){this.Send("system", "创建文件:" + e.Name);}void wather_Changed(object sender, System.IO.FileSystemEventArgs e){while (fileWather.MyQueue != null && fileWather.MyQueue.Count > 0){Log log = fileWather.MyQueue.Dequeue();if (log != null){this.Send(log.Type.ToString(), JsonConvert.SerializeObject(log));}}}}
}

前端

home:log展示的页面。根据日志类型为该条日志显示不同的颜色。

@{ViewBag.Title = "Home";
}<div id="container">
</div><script>$(function () {// Reference the auto-generated proxy for the hub.var log = $.connection.logHub;console.log(log);// Create a function that the hub can call back to display messages.log.client.addNewMessageToPage = function (name, message) {console.log(name);console.log(message);// Add the message to the page.if (name === "Info") {                $('#container').append('<p style="color:green;">' + message + '</p>');} else {$('#container').append('<p style="color:red;">' + message + '</p>');}};// Start the connection.$.connection.hub.start().done();});</script>

LogController

Test页面是一个测试页面,通过不停的刷新写入随机类型的日志。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Wolfy.LogMonitor.Models;namespace Wolfy.LogMonitor.Controllers
{public class LogController : Controller{// GET: Logpublic ActionResult Home(){return View();}public ActionResult Test(){LogType[] logtypes = { LogType.Info, LogType.Error };Random r = new Random();int index = r.Next(0, 2);LogHelper.WriteLog(new Log { Content = "这是一次日志", Dt = DateTime.Now, Type = logtypes[index] });return View();}}
}

好了,到现在基本上大功告成。测试一下。

通过不停的刷新test页面,你会发现home页面上会相应的动态展示这次操作的日志。

总结

昨天突然有这个想法,今天就折腾了一上午,将这个想法用代码实现了一下。这里没有signalr的相关介绍,感兴趣的话,可以看下面的参考资料中的内容。

参考资料

http://www.asp.net/signalr

[Asp.net]SignalR实现实时日志监控相关推荐

  1. 大数据实时案例--实时日志监控告警系统

    本次介绍使用Flume+kafka+storm+mysql的实时日志监控告警系统,代码部分比较多,会放在一个下载的连接里面,可以免费下载. 需求 在软件开发中国,上线运行时经常会出现一些报错,但是我们 ...

  2. 基于ELK搭建网站实时日志监控平台

    基于ELK搭建网站实时日志监控平台 1 为什么要用到ELK 早在传统的单体应用时代,查看日志大都通过SSH客户端登服务器去看,使用较多的命令就是 less 或者 tail.如果服务部署了好几台,就要分 ...

  3. 实时日志监控系统-全览

    大数据处理,大致可以分为两大模块: 离线数据处理:比如说电商.运营商出现的大批量的日志,可以由flume.sqoop或者其他路径,导入到HDFS中,然后经过数据清洗,使用Hive进行分析和处理,对于优 ...

  4. python 实时日志监控_python动态监控日志内容的示例

    #!/usr/bin/python # encoding=utf-8 # Filename: monitorLog.py import os import signal import subproce ...

  5. python 实时日志监控_python监控nginx实时日志并实现钉钉报警

    # !/usr/bin/python # --*coding:utf-8 -*- ''' auth:kilig desc:监控Nginx后端服务响应的状态,一旦响应时间超过2ms,累计次数超过1次,将 ...

  6. GoAccess实时日志监控

    在服务其中安装号goaccess后,执行 goaccess demo_pic.access.log -o /root/nginx/demo_report/demo_pic_access_report. ...

  7. asp.net core结合NLog搭建ELK实时日志分析平台

    0.整体架构 整体架构目录:ASP.NET Core分布式项目实战-目录 一.介绍ELK 1.说明(此篇ELK采用rpm的方式安装在服务器上)-牛刀小试 承接上一篇文章的内容准备部署ELK来展示asp ...

  8. ASP.NET Core之跨平台的实时性能监控(2.健康检查)

    前言 上篇我们讲了<如何使用App Metrics 做一个简单的APM监控>,最后提到过健康检查这个东西. 这篇主要就是讲解健康检查的内容. 没看过上篇的,请移步:ASP.NET Core ...

  9. C# ASP.NET MVC 之 SignalR 学习 实时数据推送显示 配合 Echarts 推送实时图表

    本文主要是我在刚开始学习 SignalR 的技术总结,网上找的学习方法和例子大多只是翻译了官方给的一个例子,并没有给出其他一些经典情况的示例,所以才有了本文总结,我在实现推送简单的数据后,就想到了如何 ...

最新文章

  1. 1055 The World‘s Richest (25 分)【难度: 一般 / 知识点: 多关键字排序】
  2. MySQL 行转列的方法
  3. Android开发之Android Studio 3.6新特性之获取控件id的高级方式ViewBinding
  4. 我想谈谈关于Android面试那些事,一篇文章帮你解答
  5. java发送post请求json格式_Linux QT 4G发送HTTP POST请求发送JSON格式的数据
  6. php空间搭建tcshare,新秀网 - 宝塔面板搭建天翼云盘目录列表TCShare
  7. Linux修改MySQL数据库密码
  8. 部署企业的网络安全方案
  9. 第一弹app v2.30.0
  10. AI语音技术的架构(学习心得)
  11. 数据结构应用题大题笔记
  12. Kinect 2.0 安装体验
  13. yolo极大抑制_Pytorch从0开始实现YOLO V3指南 part4——置信度阈值和非极大值抑制...
  14. 『Batch Normalization』Batch Normalization一文吃透
  15. Linux 2.6下Driver开发的34个变化[转贴]
  16. 23-25-35岁北漂者的未来该如何规划?~转
  17. Golang学习(二十四)家庭记账项目
  18. 深信服虚拟服务器断断续续的,深信服防火墙AF做双机时虚拟MAC问题的处理办法...
  19. java图片管理系统_基于Java Web技术的图片管理系统的设计与实现.doc
  20. C# 未找到类型“***”上的构造函数异常原因

热门文章

  1. C++实现插值查找(附完整源码)
  2. QT实现自定义3D材质
  3. 美国不要求计算机背景的学校,美国哪些院校计算机专业不需要CS背景
  4. 「Apollo」class DescriptorBase(metaclass=DescriptorMetaclass)
  5. 3.商品可视化展示与文本处理
  6. Tomcat原理详解和各种集群的实现(转自:http://harisxiong.blog.51cto.com/7513022/1304746)
  7. 2.Cocos2dx 3.2中的重力系统Box2D
  8. 1高并发服务器:多进程服务器
  9. 基于.NET的WebService的实现
  10. Kettle使用_25 改变文件编码压缩与邮件