在许多情况下,可能需要在线访问日志。例如,有一个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