65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (17投票s)

2007年1月26日

CPOL

4分钟阅读

viewsIcon

101843

downloadIcon

1341

一篇关于如何为 ASP.NET 应用程序创建实时 log4net 彩色控制台查看器的文章。

AspLog4netColorConsole.jpg

引言

我即将部署一个新的 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 SDKPatternLayout 类。请注意,上面的布局 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 - 初始创建。
© . All rights reserved.