asp.net API 实时日志查看功能

< ![CDATA[

有时候些mvc  api .当 参数传进来后。进行的那些操作。一般写log。比较麻烦。不方便

现在介绍下,实时显示 log的一个方法

首先 ,需要一个object   SignalR   自行 去git下载。

vs的packing搜不到。

这个其实就是  websocket 

 

思路就是 :

1--路由进入配置。

 public static class WebApiConfig
    {
        public static void Register(HttpConfiguration config)
        {
            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );
           //
            config.Services.Replace(typeof(ITraceWriter), new DynamicTrace());
        }
    }

2.新建一个虚拟类 ,相当于枢纽,广播日志到客户端

  [HubName("trace")]
    public class TraceHub : Hub
    {}

3.新建一个允许任何类继承的 signalrbase

   public abstract class SignalRBase<T> where T : IHub
    {
        private Lazy<IHubContext> hub = new Lazy<IHubContext>(() => GlobalHost.ConnectionManager.GetHubContext<T>());

        protected IHubContext Hub
        {
            get { return hub.Value; }
        }
    }

4.记录当时的时间,访问的方法,等。实现类。

   public class DynamicTrace : SignalRBase<TraceHub>, ITraceWriter
    {
        public void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction)
        {
            if (level != TraceLevel.Off)
            {
                TraceRecord record = new TraceRecord(request, category, level);
                traceAction(record);
                Log(record);
            }
        }

        private void Log(TraceRecord record)
        {
            var message = new StringBuilder();

            message.AppendMessage(record.Level.ToString().ToUpper());
            message.AppendMessage(DateTime.Now.ToString());

            if (record.Request != null)
                message.AppendMessage(record.Request.Method.ToString(), notEmpty).AppendMessage(record.Request.RequestUri.ToString(), notEmpty);

            message.AppendMessage(record.Category, notEmpty).AppendMessage(record.Operator, notEmpty)
                .AppendMessage(record.Operation).AppendMessage(record.Message, notEmpty);

            if (record.Exception != null)
                message.AppendMessage(record.Exception.GetBaseException().Message, notEmpty);

            Hub.Clients.All.logMessage(message.ToString());
        }

        Func<string, bool> notEmpty = (text) => !string.IsNullOrWhiteSpace(text);
    }

5. 记录日志的方法方法,字符串拼加

  public static StringBuilder AppendMessage(this StringBuilder sb, string text, Func<string, bool> predicate = null)
        {
            if (predicate != null)
            {
                if (predicate(text))
                {
                    sb.Append(" ");
                    sb.Append(text);
                }
            }
            else
            {
                sb.Append(" ");
                sb.Append(text);
            }

            return sb;
        }

利用signalr 广播。实时把api访问的log广播给客户端。

SignalR  本来就是一个websocket   封装

 

然后,这些日志 将在 页面上输出

所以最后新建一个HTML,连接我们刚才建的广播中心。接收日志

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
</head>
<body>
    <ul id="messages"></ul>
    <script type="text/javascript" src="Scripts/jquery-1.7.1.js"></script>
    <script type="text/javascript" src="Scripts/jquery.signalR-1.0.0-alpha2.js"></script>
    <script type="text/javascript" src="signalr/hubs"></script>
    <script type="text/javascript">
$(function () {
hub = $.connection.trace;
hub.client.logMessage = function (data) {
$('#messages').prepend('<li>' + data + '</li>');
};
$.connection.hub.start();
});
    </script>
</body> 

看下图:

asp.net API 实时日志查看功能_第1张图片

 

左边的我请求了个api 。地址。右边我新建的html 实时的接收广播 打印出来。

不擅长写blog。。将就看看吧。

 

可以参考一下文章

http://www.cnblogs.com/kesalin/archive/2012/11/09/signalr_push.html  (在 Asp.NET MVC 中使用 SignalR 实现推送功能)

 

 

 

]]>

你可能感兴趣的:(asp.net)