实时日志流:使用SignalR和NLog

在许多情况下,可能需要在线访问日志。例如,有一个Web服务,它启动了一个长时间运行的后台进程。这个进程在执行过程中会生成日志事件。与其处理进度报告,决定扩展日志系统,将日志发送到浏览器。

SignalR是一个用于ASP.NET的框架,它允许轻松开发实时Web应用程序。SignalR支持WebSockets,但如果WebSockets不受支持,它也会回退到其他兼容技术。对来说,重要的是它允许服务器将内容推送到连接的客户端/浏览器。

NLog是一个.NET的日志平台。它支持数十个日志目标(文件、事件日志、数据库、电子邮件等)。此外,任何开发人员都可以编写自定义目标。它也与Log4Net部分兼容。

本示例使用了实现日志流的最简单方式,使用SignalR。

服务器部分

通过SignalR2.0添加日志是一个简单的过程。唯一的要求是.NET 4.5。将代码更改为使用SignalR 1.0将允许您使用.NET 4.0。附加代码使用Web Forms,但SignalR和NLog可以与MVC一起使用,无论是作为网站还是应用程序。

首先,您需要添加SignalR和NLog NuGet包。这是一个简单且自动的步骤。然后,您需要添加SignalR Startup类。这设置了SignalR管道所需的所有配置。

public class SignalRStartup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } }

SignalR使用所谓的HUB为客户端提供服务。日志是一个单向过程,因此只需要将数据从服务器传输到客户端,而不是相反。为了更容易调试,有一个Hello方法,稍后可以更改为实现(取消)订阅特定日志级别。

public class SignalRTargetHub : Hub { public void Hello() { this.Clients.Caller.logEvent( DateTime.UtcNow.ToLongTimeString(), "info", "SignalR connected" ); } static IHubContext signalRHub; public static void Send(string longdate, string logLevel, String message) { if (signalRHub == null) { signalRHub = GlobalHost.ConnectionManager.GetHubContext(); } if (signalRHub != null) { signalRHub.Clients.All.logEvent(longdate, logLevel, message); } } }

NLog支持MethodCallTarget。这允许从日志系统返回数据到代码。这个目标可以调用任何静态方法,带有任意数量的参数。在例子中,被调用的方法是SignalRTargetHub.Send(longdate, logLevel, message)。不能简单地创建SignalRTargetHub的新实例,但必须在ConnectionManager中找到一个上下文。那个上下文可以用来向连接的客户端发送数据。如果找到了上下文,调用所有连接客户端上的javascript logEvent函数。

Hello方法仅用于更容易的调试。一旦客户端连接,浏览器调用Hello方法,服务器响应(调用调用者的javascript方法)字符串"SignalR connected"。这不是必需的,但可以稍后扩展并用于客户端注册。

客户端部分

唯一剩下的部分是客户端/浏览器的代码。SignalR自动生成用于访问HUB方法的javascript对象。这个自动生成的javascript可以从/signalr/hubs下载。

注意logEvent函数定义。这将从服务器调用,每当ASP.NET调用方法signalRHub.Clients.All.logEvent。

测试它

将向global.asax添加错误处理方法。这个方法将记录所有应用程序错误(例如,请求不存在的网页)。

void Application_Error(object sender, EventArgs e) { Exception lastException = Server.GetLastError(); NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); logger.Fatal( "Request: '{0}'\n Exception:{1}", HttpContext.Current.Request.Url, lastException ); }

现在可以加载Log.aspx网页,并发送第二个请求到某个随机页面。在第一行,将看到Hello方法的响应 - "SignalR connected"。

将SignalR NuGet包添加到您的项目(Microsoft.AspNet.SignalR)

添加NLogNuGet包

添加SignalRStartup.cs

添加SignalRTargetHub.cs

更新您的web.config(nlog和configSections)

添加Log.aspx页面

添加global.asax

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485