用于 ASP.NET 的 log4net 实时彩色控制台






4.78/5 (17投票s)
一篇关于如何为 ASP.NET 应用程序创建实时 log4net 彩色控制台查看器的文章。
引言
我即将部署一个新的 ASP.NET Web 应用程序,需要一个良好、稳定的日志记录器。项目开始时我写过一个简单的日志记录器,但它不够简洁、易于管理或配置。我到处看到很多关于 log4net 的引用,于是决定去了解一下。很高兴我这么做了。几个小时后,我就上手了。刚开始有点难,因为有很多种使用方式和大量的文档(这是好事)。找到正确的配置花了一点力气,但非常值得。
如果您刚接触 log4net,您可能想从这里开始:使用 C# 简要介绍 log4net 日志记录库。CodeProject 上还有其他很多关于 log4net 的精彩文章。只需搜索一下,您就能找到很多。
在设置了一些基本的文件和电子邮件日志记录器后,我开始查看 log4net 提供的所有其他日志记录器(也称为 Appenders)。我想拥有一个实时控制台来显示应用程序部署后发生的情况,这将会很棒。UDP 日志记录器似乎很有趣,但我对 log4net 的了解不足以想象如何使用它。所以,我四处搜索,看看是否有人有示例用法。我偶然发现了 Log4NetViewer。它是一个简单的 WinForm 应用程序,接收从 UdpAppender 发送的 log4net 消息。很酷吧?现在,我可以远程监控我的 Web 应用程序了。于是,我设置了它并在开发环境中试用了一段时间。效果很好,但我真的不喜欢它显示日志消息的方式。它使用网格来显示日志。当收到新日志消息时,网格会添加新一行。但问题是,长消息,如异常,很难阅读。您必须滚动单元格,或者复制粘贴消息。更糟糕的是,没有源代码!总之,我暂时搁置了这个问题,转而去处理更重要的任务。
过了一会儿,在我对 log4net 设置进行一些配置更改时,我偶然发现了 ConsoleAppender,甚至更好的是 ColoredConsoleAppender。谁不喜欢颜色?也许我可以在 log4net 控制台窗口中监视我的 Web 应用程序的日志消息?消息将易于阅读,甚至可以进行颜色编码。我开始研究一些示例,并意识到控制台日志记录器无法直接与 ASP.NET 应用程序一起工作。log4net 中实际上没有“控制台”。当您将 ConsoleAppender 添加到 log4net 配置中时,不会有控制台神奇地弹出。控制台需要在与 ASP 应用程序相同的进程或上下文中运行。它不能,但它真的需要吗?
不需要。当然,不需要...
啊哈!我记起了 UdpAppender。我可以创建一个 .NET 控制台应用程序,并使用 System.Net.Sockets.UdpClient
来监听从我的 ASP.NET 应用程序发送的 UDP 日志消息。就像 Log4NetViewer 一样。然后,使用 ColoredConsoleAppender 将它们写入控制台窗口。几个小时后……搞定。
使用代码
控制台应用程序的代码非常简单
' Create a console app and add a reference to log4net.
' Add this global attribute. Generally it should go in the AssemblyInfo.vb file.
<Assembly: log4net.Config.XmlConfigurator(Watch:=True)>
Imports System.Net.Sockets
Imports System.Net
Module UdpLogListener
Private ReadOnly Log As log4net.ILog = _
log4net.LogManager.GetLogger( _
System.Reflection.MethodBase.GetCurrentMethod().DeclaringType)
Sub Main()
' Remember to use the same port in your web/source app.
Dim Port As Integer = 8081
Dim Sender As IPEndPoint
Dim Client As UdpClient
Dim Buffer As Byte()
Dim LogLine As String
Try
Sender = New IPEndPoint(IPAddress.Any, 0)
Client = New UdpClient(Port)
While True
Buffer = Client.Receive(Sender)
LogLine = System.Text.Encoding.Default.GetString(Buffer)
' The color-coded text is written to the console
' when Log.{level method} is called.
' i.e. Log.Info("my info")
' Optional: Replace your placeholders with whatever
' you like. [I]=Info, [D]=Debug, etc.
' More detail about placeholders in the
' UdpAppender config below.
If LogLine.IndexOf("{INFO}") >= 0 Then
Log.Info(LogLine.Replace("{INFO}", "[I] "))
ElseIf LogLine.IndexOf("{DEBUG}") >= 0 Then
Log.Debug(LogLine.Replace("{DEBUG}", "[D] "))
ElseIf LogLine.IndexOf("{ERROR}") >= 0 Then
Log.Error(LogLine.Replace("{ERROR}", "[E] "))
ElseIf LogLine.IndexOf("{WARN}") >= 0 Then
Log.Warn(LogLine.Replace("{WARN}", "[W] "))
Else
' Some other level.
Log.Warn(LogLine)
End If
End While
Catch e As Exception
Console.WriteLine(e)
Console.WriteLine(vbCrLf & _
"Press any key to close...")
Console.ReadLine()
End Try
End Sub
End Module
配置 ColoredConsoleAppender 并设置日志级别的颜色。以下内容应放在您的 App.config 中
<configSections>
<section name="log4net"
type="System.Configuration.IgnoreSectionHandler" />
</configSections>
<log4net>
<appender name="ColoredConsoleAppender"
type="log4net.Appender.ColoredConsoleAppender">
<mapping>
<level value="INFO" />
<foreColor value="White, HighIntensity" />
<backColor value="Green" />
</mapping>
<mapping>
<level value="DEBUG" />
<foreColor value="White, HighIntensity" />
<backColor value="Blue" />
</mapping>
<mapping>
<level value="WARN" />
<foreColor value="Yellow, HighIntensity" />
<backColor value="Purple" />
</mapping>
<mapping>
<level value="ERROR" />
<foreColor value="Yellow, HighIntensity" />
<backColor value="Red" />
</mapping>
<layout
type="log4net.Layout.PatternLayout">
<conversionPattern value="%message%newline" />
</layout>
</appender>
<root>
<level value="ALL" />
<appender-ref ref="ColoredConsoleAppender" />
</root>
</log4net>
最后,在您的 ASP.NET 应用程序中,配置一个源 UdpAppender 以将 UDP 日志消息发送到您的控制台。将以下内容添加到您的 log4net 配置文件中(完整的配置请参见示例应用程序)。配置 log4net 有几种方法。如果您使用其他方法,您只需要下面 <appender...>
部分,以及根元素中的 <appender-ref ref="UdpAppender">
。请记住将 RemotePort
与您的控制台应用程序中的 UdpClient
端口匹配。另外,请注意,您可以根据需要格式化模式布局,甚至添加可以由客户端解析的分隔符和占位符。下面,在主循环中,{%level}
的值在写入屏幕之前被替换。有关 PatternLayout 语法的更多信息,请参见 log4net SDK 的 PatternLayout
类。请注意,上面的布局 conversionPattern
(在控制台的 App.config 中)没有模式格式化。格式化应该在源 UdpAppender 模式布局配置中设置。我确定您也可以使用其他布局类型。有很多种。
<log4net>
<appender name="UdpAppender" type="log4net.Appender.UdpAppender">
<param name="RemoteAddress" value="localhost" />
<param name="RemotePort"
value="8081" />
<layout type="log4net.Layout.PatternLayout"
value="{%level}%date{MM/dd HH:mm:ss} - %message" />
</appender>
<root>
<level value="ALL" />
<appender-ref ref="UdpAppender" />
</root>
</log4net>
关注点
UdpAppender 在桥接远程日志查看器和写入器方面提供了极大的灵活性。就像 Log4NetViewer 一样,可以创建 WinForms 客户端,也可以创建控制台客户端,如本文所示。甚至远程文件日志记录器。您只需要一个 UDP 客户端和 log4net 来广播、捕获和重写日志消息。此外,源 UdpAppender 可以配置为向整个子网广播日志消息。这允许您在多个位置设置多个客户端日志记录器,执行多个操作。
另一方面,UDP 协议仅用于广播,发送者和接收者之间没有验证。因此,不能保证消息会被接收,甚至不会按发送顺序接收。但对我来说没关系,RollingFileAppender 不会漏掉任何东西。
希望您喜欢这篇文章。这是我的第一篇文章,所以我想主题保持简单……我认为。
历史
- 2007-01-26 - 初始创建。