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

使用 C# 介绍 log4net 日志库 - 第 2 部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.52/5 (36投票s)

2004 年 9 月 12 日

3分钟阅读

viewsIcon

253324

downloadIcon

2588

一篇介绍 log4net 库更基本用法的文章。

引言

在我的上一篇文章中,我讨论了 log4net 日志包的基础知识。我概述了该库提供的 5 个日志级别,以及可用于将数据输出到日志的不同类型的 appender 的示例。在本文中,我想介绍一些关于如何有效使用 log4net 的信息。

为不同的模块指定不同的日志级别

有时在您的应用程序中,您希望从某些区域获得更多的日志信息,而从其他区域获得更少的日志信息。 Log4net 通过允许为不同的 logger 使用不同的日志级别来促进这一点。 LogTest3 和 LogTest4 中显示了一个示例。

using log4net;
using log4net.Config;

public class LogTest3
{
    private static readonly ILog logger = 
            LogManager.GetLogger(typeof(LogTest3));
    
    static LogTest3()
    {
        DOMConfigurator.Configure();
    }

    static void Main(string[] args)
    {
        LogTest3 log3 = new LogTest3();
        log3.DoLogging();
        LogTest4 log4 = new LogTest4();
        log4.DoLogging();
    }
    
    public void DoLogging()
    {
        logger.Debug("Here is a debug log from LogTest3.");
        logger.Info("... and an Info log from LogTest3.");
    }
}

public class LogTest4
{
    private static readonly ILog logger = 
            LogManager.GetLogger(typeof(LogTest4));
    
    static LogTest4()
    {
        DOMConfigurator.Configure();
    }

    public void DoLogging()
    {
        logger.Debug("Here is a debug log from LogTest4.");
        logger.Info("... and an Info log from LogTest4.");
    }

}

LogTest3 的配置文件具有以下相关的行

<root>
    <level value="FATAL" />
    <appender-ref ref="ConsoleAppender" />
</root>

<logger name="LogTest3">
    <level value="DEBUG" />
</logger>

<logger name="LogTest4">
    <level value="INFO" />
</logger>
</pre>

在这个 XML 片段中,我们可以看到根日志级别被设置为“FATAL”。这意味着只记录 FATAL 错误消息。但是,我们可以看到 LogTest3 和 LogTest4 覆盖了“DEBUG”和“INFO”级别。当我们运行此应用程序时,我们将看到 LogTest3 记录 DEBUG 级别以上的所有内容,而 LogTest4 记录 INFO 级别以上的所有内容。

2004-09-12 21:45:51,546 [1060] DEBUG LogTest3 - Here is a debug log from LogTest3.
2004-09-12 21:45:51,546 [1060] INFO  LogTest3 - ... and an Info log from LogTest3.
2004-09-12 21:45:51,546 [1060] INFO  LogTest4 - ... and an Info log from LogTest4.

使用这种为应用程序的不同部分指定不同日志级别的技术可以为您提供极大的灵活性。

我应该记录还是不记录?

一般来说,您拥有的日志记录越多,您就越灵活,并且越容易发现程序出了什么问题。别误会我,日志记录并不能替代彻底调试您的程序,但总有您部署应用程序并且想要确切知道发生什么情况的情况。

有时,日志记录的成本可能很高,尤其是在应用程序的性能至关重要时(想象一下将每个 DEBUG 语句记录到数据库中)。 显然,这里要做的第一件事是降低日志级别,以便仅生成相关信息(例如,警告及以上)。 这是一个良好的开端,但是如果构建日志消息的成本很高(例如,您有一个昂贵的 .ToString() 方法)怎么办?

logger.Debug("Expensive object value="+ExpensiveObject.ToString());

ILog 接口(所有 logger 都已实现)提供了一组方法,使您能够检查是否正在使用特定的日志级别。 这些方法如下所示

bool IsDebugEnabled();
bool IsInfoEnabled();
bool IsWarnEnabled();
bool IsErrorEnabled();
bool IsFatalEnabled();

使用这些函数,我们现在可以更改昂贵对象的日志记录代码为

if (logger.IsDebugEnabled())
{
    logger.Debug("Expensive object value="+ExpensiveObject.ToString());
}

完全删除日志记录

如果您对您的应用程序完全满意,并且希望完全关闭日志记录,您可以通过将任何/所有 appender 的日志记录阈值设置为“OFF”来实现,如下所示

<appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender" >
    <threshold value="OFF" />
    <layout type="log4net.Layout.PatternLayout">
        <param name="Header" value="[Header]\r\n" />
        <param name="Footer" value="[Footer]\r\n" />
        <param name="ConversionPattern" value="%d [%t] %-5p %c - %m%n" />
    </layout>
</appender>

阈值也可以设置为 DEBUG、WARN、INFO 等之一,以设置指定 appender 的阈值,而与正在使用的 logger 无关。

就是这样

这就是使用 log4net 进行日志记录的简要介绍的结尾。 我希望您喜欢这些文章,并且希望我让您相信日志记录是值得的并且很有趣!

© . All rights reserved.