当前位置: 首页 > 工具软件 > log4net > 使用案例 >

log4net使用与配置文件

汪茂
2023-12-01

什么是log4net?
log4net是一个工具,帮助程序员将日志语句输出到各种输出目标。

如果应用程序出现问题,启用日志记录以便可以找到问题会很有帮助。使用log4net,可以在运行时启用日志记录,而无需修改应用程序二进制文件。log4net 包旨在使日志语句可以保留在生产代码中,而不会产生高性能成本。因此,日志记录(或者更确切地说不是日志记录)的速度至关重要。

同时,日志输出可能非常庞大,以至于很快就会变得势不可挡。log4net的一个显着特征(并且所有log4x库都通用)是分层记录器的概念。使用这些记录器,可以有选择地控制以任意粒度输出哪些日志语句。

log4net在设计时考虑了两个不同的目标:速度和灵活性。这两个要求之间有着密切的平衡。

返回页首

log4net是一个可靠的日志记录系统吗?
不。log4net是不可靠的。这是一个尽力而为和故障停止的日志记录系统。

通过故障停止,我们的意思是log4net不会在运行时引发可能导致应用程序崩溃的意外异常。如果由于任何原因,log4net抛出未捕获的异常(除了可能抛出的ArgumentException和ArgumentNullException),请发送电子邮件到log4net-user@logging.apache.org邮件列表。未捕获的异常将作为需要立即关注的严重 bug 进行处理。

此外,log4net 不会恢复到System.Console.Out或System.Console.错误,当其指定的输出流未打开、不可写或变满时。这可以避免由于日志记录失败而淹没用户的终端来损坏原本正常工作的程序。但是,log4net 将向System.Console.Error和System.Diagnostics.Trace输出一条消息,指示无法执行日志记录。

返回页首

log4net的先决条件是什么?
log4net在许多不同的框架上运行,每个框架都有自己的要求。根据经验,您将需要一个符合 ECMA-335 的 CLI 运行时,例如 Microsoft® .NET 运行时 1.0 (1.0.3705) 或 1.1 (1.1.4322)。

并非所有框架都是平等的,并且某些功能已从某些构建中排除。有关详细信息,请参阅框架支持文档。

返回页首

有没有使用log4net的示例代码?
有一个目录包含log4net\examples中的示例。这些示例按框架进行了细分。

返回页首

log4net有哪些特点?
log4net针对速度进行了优化。
log4net基于命名的记录器层次结构。
log4net是故障停止,但不可靠。
log4net是线程安全的。
log4net不限于一组预定义的设施。
可以在运行时使用配置文件设置日志记录行为。配置文件采用 XML 格式。
log4net旨在从一开始就处理异常。
log4net可以将其输出定向到许多接收器,包括:文件,控制台,NT EventLog甚至电子邮件。
log4net将日志记录分为以下几个级别:调试,信息,警告,错误和致命。
通过实现新的布局类,可以轻松更改日志输出的格式。
日志输出的目标以及写入策略可以通过编写新的追加器类来更改。
log4net支持每个记录器的多个输出追加器。
有关log4net功能的更多信息,请参阅功能概述文档。

返回页首

log4net 线程安全吗?
是的,log4net是线程安全的。

返回页首

日志输出是什么样的?
可以通过多种方式自定义日志输出。此外,可以通过实现自己的ILayout来完全覆盖输出格式

下面是使用PatternLayout和转换模式%时间戳 [%thread] %-5level %logger{2} %ndc - %message%newline 的示例输出

176 [main] INFO examples.Sort - Populating an array of 2 elements in reverse order.
225 [main] INFO examples.SortAlgo - Entered the sort method.
262 [main] DEBUG SortAlgo.OUTER i=1 - Outer loop.
276 [main] DEBUG SortAlgo.SWAP i=1 j=0 - Swapping intArray[0] = 1 and intArray[1] = 0
290 [main] DEBUG SortAlgo.OUTER i=0 - Outer loop.
304 [main] INFO SortAlgo.DUMP - Dump of integer array:
317 [main] INFO SortAlgo.DUMP - Element [0] = 0
331 [main] INFO SortAlgo.DUMP - Element [1] = 1
343 [main] INFO examples.Sort - The next log statement should be an error message.
346 [main] ERROR SortAlgo.DUMP - Tried to dump an uninitialized array.
467 [main] INFO examples.Sort - Exiting main method.
第一个字段是自程序启动以来经过的毫秒数。第二个字段是输出日志语句的线程。第三个字段是日志语句的级别。第四个字段是发出日志请求的记录器名称的最右侧的两个组成部分。第五个字段(位于"-“之前)是嵌套诊断上下文(NDC)。请注意,嵌套的诊断上下文可能为空,如前两个语句所示。”-"后面的文本是语句的消息。

返回页首

什么是记录器?
记录器概念是log4net配置的核心。记录器被组织到一个层次结构中,并让程序员在运行时控制打印或不打印哪些日志记录语句。

记录器是通过配置log4net分配级别的。日志语句将路由到追加器,具体取决于其级别和记录器。

返回页首

为什么我应该将我的扩展捐赠给log4net回到项目中?
与 GNU 公共许可证 (GPL) 相反,Apache 软件许可证不会对您的扩展提出任何声明。通过扩展,我们指的是调用现有log4net代码的全新代码。您可以使用专有的log4net扩展自由地做任何您想做的事情。特别是,您可以选择从不向更广泛的公众发布您的扩展。有关详细信息,请参阅Apache 许可证,版本 2.0。

我们非常小心,不要不必要地更改 log4net 客户端 API,以便较新的 log4net 版本向后兼容以前的版本。我们对内部log4net API的谨慎程度要低得多。因此,如果您的扩展旨在与特定log4net版本的内部版本一起使用,那么当log4net的下一个版本发布时,您可能需要使您的专有扩展适应新版本。因此,您将被迫花费宝贵的资源来跟上log4net的变化。这通常被称为"愚蠢的税收"。通过捐赠代码并使其成为标准发行版的一部分,您可以节省不必要的维护工作。

如果您的扩展有用,那么最终会有人编写一个扩展,提供相同或非常相似的功能。您的开发工作将被浪费。

除非专有的log4net扩展是业务关键型的,否则没有理由不将您的扩展捐赠回项目。

返回页首

<appender name="AdoNetAppender" type="log4net.Appender.AdoNetAppender">
    <bufferSize value="100" />
    <connectionType value="System.Data.SqlClient.SqlConnection, System.Data, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />
    <connectionString value="data source=[database server];initial catalog=[database name];integrated security=false;persist security info=True;User ID=[user];Password=[password]" />
    <commandText value="INSERT INTO Log ([Date],[Thread],[Level],[Logger],[Message],[Exception]) VALUES (@log_date, @thread, @log_level, @logger, @message, @exception)" />
    <parameter>
        <parameterName value="@log_date" />
        <dbType value="DateTime" />
        <layout type="log4net.Layout.RawTimeStampLayout" />
    </parameter>
    <parameter>
        <parameterName value="@thread" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%thread" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@log_level" />
        <dbType value="String" />
        <size value="50" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%level" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@logger" />
        <dbType value="String" />
        <size value="255" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%logger" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@message" />
        <dbType value="String" />
        <size value="4000" />
        <layout type="log4net.Layout.PatternLayout">
            <conversionPattern value="%message" />
        </layout>
    </parameter>
    <parameter>
        <parameterName value="@exception" />
        <dbType value="String" />
        <size value="2000" />
        <layout type="log4net.Layout.ExceptionLayout" />
    </parameter>
</appender>

Apache log4net™ 手册 - 配置
配置
将日志请求插入应用程序代码需要大量的规划和工作。观察表明,大约 4% 的代码专用于日志记录。因此,即使是中等大小的应用程序,其代码中也会嵌入数千个日志记录语句。鉴于它们的数量,管理这些日志语句而不必手动修改它们变得势在必行。

log4net环境是完全可编程的。但是,使用配置文件配置log4net要灵活得多。目前,配置文件是用 XML 编写的。

让我们来看看这是如何在使用log4net的虚构应用程序MyApp的帮助下完成的。

using Com.Foo;

// Import log4net classes.
using log4net;
using log4net.Config;

public class MyApp
{
// Define a static logger variable so that it references the
// Logger instance named “MyApp”.
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

static void Main(string[] args) 
{
    // Set up a simple configuration that logs on the console.
    BasicConfigurator.Configure();

    log.Info("Entering application.");
    Bar bar = new Bar();
    bar.DoIt();
    log.Info("Exiting application.");
}

}
MyApp首先导入 log4net 相关类。然后,它定义一个名为MyApp的静态记录器变量,该变量恰好是该类的完全限定名称。

MyApp使用以下Bar类:

// Import log4net classes.
using log4net;

namespace Com.Foo
{
public class Bar
{
private static readonly ILog log = LogManager.GetLogger(typeof(Bar));

    public void DoIt()
    {
        log.Debug("Did it again!");
    }
}

}
调用BasicConfigurator.Configure()方法创建了一个相当简单的 log4net 设置。此方法是硬连线的,用于向根记录器添加ConsoleAppender。将使用设置为模式"%-4时间戳 [%thread] %-5level %logger %ndc - %message%newline"的PatternLayout对输出进行格式化。

请注意,默认情况下,根记录器分配给Level.DEBUG。

MyApp的输出是:

0 [main] INFO MyApp - Entering application.
36 [main] DEBUG Com.Foo.Bar - Did it again!
51 [main] INFO MyApp - Exiting application.
作为旁注,让我提一下,在log4net中,子记录器仅链接到其现有的祖先。特别是,名为Com.Foo.Bar的记录器直接链接到根记录器,从而绕过了未使用的Com或Com.Foo记录器。这大大提高了性能并减少了log4net的内存占用量。

MyApp类通过调用BasicConfigurator.Configure()方法来配置 log4net。其他类只需要导入log4net命名空间,检索它们要使用的记录器,然后注销。

前面的示例始终输出相同的日志信息。幸运的是,修改MyApp很容易,因此可以在运行时控制日志输出。这是一个稍微修改过的版本。

using Com.Foo;

// Import log4net classes.
using log4net;
using log4net.Config;

public class MyApp
{
private static readonly ILog log = LogManager.GetLogger(typeof(MyApp));

static void Main(string[] args) 
{
    // BasicConfigurator replaced with XmlConfigurator.
    XmlConfigurator.Configure(new System.IO.FileInfo(args[0]));

    log.Info("Entering application.");
    Bar bar = new Bar();
    bar.DoIt();
    log.Info("Exiting application.");
}

}
此版本的MyApp指示XmlConfigurator解析配置文件并相应地设置日志记录。配置文件的路径在命令行上指定。

下面是一个示例配置文件,其结果与前面的基于基本配置器的示例完全相同。

    <!-- A1 uses PatternLayout -->
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%-4timestamp [%thread] %-5level %logger %ndc - %message%newline" />
    </layout>
</appender>

<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
    <level value="DEBUG" />
    <appender-ref ref="A1" />
</root>
假设我们不再有兴趣查看属于Com.Foo包的任何组件的输出。以下配置文件显示了实现此目的的一种可能方法。
    <!-- A1 uses PatternLayout -->
    <layout type="log4net.Layout.PatternLayout">
        <!-- Print the date in ISO 8601 format -->
        <conversionPattern value="%date [%thread] %-5level %logger %ndc - %message%newline" />
    </layout>
</appender>

<!-- Set root logger level to DEBUG and its only appender to A1 -->
<root>
    <level value="DEBUG" />
    <appender-ref ref="A1" />
</root>

<!-- Print only messages of level WARN or above in the package Com.Foo -->
<logger name="Com.Foo">
    <level value="WARN" />
</logger>
使用此文件配置的MyApp的输出如下所示。

2000-09-07 14:07:41,508 [main] INFO MyApp - Entering application.
2000-09-07 14:07:41,529 [main] INFO MyApp - Exiting application.
由于记录器Com.Foo.Bar没有分配的级别,因此它从Com.Foo继承其级别,该级别在配置文件中设置为 WARN。来自 Bar.DoIt方法的日志语句具有 DEBUG 级别,低于记录器级别 WARN。因此,DoIt()方法的日志请求被抑制。

下面是另一个使用多个追加器的配置文件。

<appender name="RollingFile" type="log4net.Appender.RollingFileAppender">
    <file value="example.log" />
    <appendToFile value="true" />
    <maximumFileSize value="100KB" />
    <maxSizeRollBackups value="2" />

    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%level %thread %logger - %message%newline" />
    </layout>
</appender>

<root>
    <level value="DEBUG" />
    <appender-ref ref="Console" />
    <appender-ref ref="RollingFile" />
</root>
使用此配置文件调用增强的MyApp将在控制台上输出以下内容。

INFO [main] (MyApp.cs:16) - Entering application.
DEBUG [main] (Bar.cs:12) - Doing it again!
INFO [main] (MyApp.cs:19) - Exiting application.
此外,由于根记录器已分配了第二个追加器,因此输出也将定向到示例.log文件。此文件在达到 100KB 时将被翻转。发生翻转时,旧版本的example.log会自动移动到example.log.1。

请注意,要获取这些不同的日志记录行为,我们不需要重新编译代码。我们可以很容易地登录到一个电子邮件地址,将所有Com.Foo输出重定向到NT事件记录器,或者将日志记录事件转发到远程log4net服务器,该服务器将根据本地服务器策略进行记录。

有关使用Xml 配置器配置追加器的更多示例,请参阅示例追加器配置文档。

配置属性
可以使用程序集级属性配置 log4net 配置,而不是以编程方式指定。

XmlConfiguratorAttribute
日志4网。Config.XmlConfiguratorAttribute允许使用以下属性配置XmlConfigurator:

配置文件
如果指定,则这是要与XmlConfigurator一起使用的配置文件的文件名。此文件路径相对于应用程序基目录 (AppDomain.CurrentDomain.BaseDirectory)。

此属性不能与ConfigFileExtension属性结合使用。

配置文件扩展
如果指定,则这是配置文件的扩展名。程序集文件名用作附加了此扩展名的基名。例如,如果程序集是从文件TestApp 加载的.exe并且ConfigFileExtension属性设置为log4net,则配置文件名为TestApp.exe.log4net。这等效于将ConfigFile属性设置为TestApp.exe.log4net。

配置文件的路径是使用应用程序基目录 (AppDomain.CurrentDomain.BaseDirectory)、程序集文件名和配置文件扩展名构建的。

此属性不能与ConfigFile属性结合使用。


如果指定此标志并将其设置为true,则框架将监视配置文件,并在每次修改文件时重新加载配置文件。

如果既没有指定ConfigFile或ConfigFileExtension属性,则应用程序配置文件(例如TestApp.exe.config)将用作 log4net 配置文件。

用法示例:

// Configure log4net using the .config file
[assembly: log4net.Config.XmlConfigurator(Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.config in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.

// Configure log4net using the .log4net file
[assembly: log4net.Config.XmlConfigurator(ConfigFileExtension=“log4net”,Watch=true)]
// This will cause log4net to look for a configuration file
// called TestApp.exe.log4net in the application base
// directory (i.e. the directory containing TestApp.exe)
// The config file will be watched for changes.

此属性只能在每个程序集中使用一次。

使用属性可以更清楚地定义从何处加载应用程序配置。但是,值得注意的是,属性纯粹是被动的。它们只是信息。因此,如果使用配置属性,则必须调用 log4net 以允许它读取属性。对LogManager.GetLogger的简单调用将导致读取和处理调用程序集上的属性。因此,必须在应用程序启动期间尽早进行日志记录调用,当然在加载和调用任何外部程序集之前。

应用程序设置
如果使用属性来配置 log4net,则可以使用应用程序配置文件的appSettings部分的两个设置来覆盖程序集属性中给出的值。

带有键"log4net.Config"将覆盖配置文件名(并被视为相对于应用程序的基目录),该设置具有键"log4net"。Config.Watch"确定是否应监视文件的更改。

即使程序集属性

[assembly: log4net.Config.XmlConfigurator(Watch=false)]

会将您的应用程序配置为使用配置文件"TestApp.exe.config",而不是监视它是否有更改,您可以覆盖此文件以使用文件"log4net.config",并通过添加

添加到应用程序的配置文件中。

Configuration Files
Typically the log4net configuration is specified using a file. This file can be read in one of two ways:

Using the .NET System.Configuration API
Reading the file contents directly
.config Files
The System.Configuration API is only available if the configuration data is in the application’s config file; the file named MyApp.exe.config or Web.config. Because the System.Configuration API does not support reloading of the config file the configuration settings cannot be watched using the log4net.Config.XmlConfigurator.ConfigureAndWatch methods. The main advantage of using the System.Configuration APIs to read the configuration data is that it requires less permissions than accessing the configuration file directly.

The only way to configure an application using the System.Configuration APIs is to call the log4net.Config.XmlConfigurator.Configure() method or the log4net.Config.XmlConfigurator.Configure(ILoggerRepository) method.

In order to embed the configuration data in the .config file the section name must be identified to the .NET config file parser using a configSections element. The section must specify the log4net.Config.Log4NetConfigurationSectionHandler that will be used to parse the config section. This type must be fully assembly qualified because it is being loaded by the .NET config file parser not by log4net. The correct assembly name for the log4net assembly must be specified. The following is a simple example configuration file that specifies the correct section handler to use for the log4net section.

<?xml version="1.0" encoding="utf-8" ?>
In the above example the log4net assembly is specified. This assembly must be located where the .NET runtime can find it. For example it could be located in the same directory as the application. If the log4net assembly is stored in the GAC then the fully qualified assembly name must be specified including the culture, version and public key.

使用 .config 文件指定配置时,节名和 XML 元素名必须是log4net。

直接读取文件
XmlConfigurator可以直接读取任何XML文件,并使用它来配置log4net。这包括应用程序的 .config 文件;名为MyApp.exe.config或Web.config 的文件。不直接读取配置文件的唯一原因是,如果应用程序没有足够的权限来读取该文件,则必须使用 .NET 配置 API 加载配置(请参阅上文)。

可以从中读取配置的文件可以使用任何log4net 指定。Config.Xml接受 System.IO.FileInfo对象的 Config.XmlConfigurator 方法。由于可以监视文件系统的文件更改通知,因此 ConfigureAndWatch方法可用于监视配置文件的修改并自动重新配置 log4net。

此外,还有 log4net。Config.XmlConfiguratorTribute可用于指定要从中读取配置的文件。

配置是从文件中的log4net元素读取的。文件中只能指定一个log4net元素,但它可能位于 XML 层次结构中的任何位置。例如,它可能是根元素:

<?xml version="1.0" encoding="utf-8" ?> 或者它可能嵌套在其他元素中: <?xml version="1.0" encoding="utf-8" ?>
上面的示例显示了如何将配置数据嵌入到 .config 文件中,即使 log4net 直接读取该文件。一个重要的注意事项是,如果 .NET 配置文件分析器找到尚未使用configSections元素注册的元素,它将引发异常。因此,在上面的示例中,注册了log4net节名,但指定用于处理该节的类型是System.Configuration.IgnoreSectionHandler。这是一个内置类,指示将采用另一种读取配置部分的方法。

配置语法
log4net 包括一个解析 XML DOM 的配置读取器,即 log4net。Config.XmlConfigurator。本节定义配置器接受的语法。

这是有效 XML 配置的示例。根元素必须。请注意,这并不意味着此元素不能嵌入到另一个 XML 文档中。有关如何在配置文件中嵌入 XmlConfigurator XML 的详细信息,请参阅上面有关配置文件的部分。

element支持以下属性:

属性 描述
调试 可选属性。值必须为true或false。默认值为false。将此属性设置为true可为此配置启用内部 log4net 调试。
更新 可选属性。值必须为"合并"或"覆盖"。默认值为合并。将此属性设置为"覆盖",以在应用此配置之前重置正在配置的存储库的配置。
门槛 可选属性。值必须是在存储库上注册的级别的名称。默认值为ALL。设置此属性以限制在整个存储库中记录的消息,而不考虑记录消息的记录器。
element支持以下子元素:

元素 描述
追加器 允许零个或多个元素。定义追加器。
记录 允许零个或多个元素。定义记录器的配置。
渲染 允许零个或多个元素。定义对象呈现器。
根 可选元素,最多允许一个。定义根记录器的配置。
参数 允许零个或多个元素。存储库特定参数
追加器
追加器只能定义为element的子元素。每个追加器必须具有唯一的名称。必须指定追加器的实现类型。

此示例显示 log4net 类型的追加器。正在定义的 Appender.ConsoleAppender。追加器将被称为ConsoleAppender。

<附加>元素支持以下属性:

属性 描述
名字 必需属性。值必须是此追加器的字符串名称。该名称在此配置文件中定义的所有追加器中必须是唯一的。此名称由记录器的element用于引用追加器。
类型 必需属性。值必须是此追加器的类型名称。如果未在 log4net 程序集中定义追加器,则此类型名称必须完全限定为程序集限定。
element支持以下子元素:

元素 描述
appender-ref 允许零个或多个元素。允许追加器引用其他追加器。并非所有追加器都支持。
滤波器 允许零个或多个元素。定义此追加器使用的筛选器。
布局 可选元素,最多允许一个。定义此追加器使用的布局。
参数 允许零个或多个元素。追加器特定的参数。
有关配置追加器的示例,请参阅示例追加器配置文档。

过滤 器
筛选器元素只能定义为<附加>元素的子元素。

<过滤器>元素支持以下属性:

属性 描述
类型 必需属性。值必须是此筛选器的类型名称。如果未在 log4net 程序集中定义筛选器,则此类型名称必须是完全程序集限定的。
<过滤器>元素支持以下子元素:

元素 描述
参数 允许零个或多个元素。筛选特定参数。
筛选器形成事件必须传递的链。在此过程中的任何筛选器都可以接受事件并停止处理,拒绝事件并停止处理,或者允许事件进入下一个筛选器。如果事件到达筛选器链的末尾而未被拒绝,则将隐式接受该事件并将其记录下来。

此筛选器将拒绝级别低于INFO或高于FATAL 的事件。将记录INFO和FATAL之间的所有事件。

如果我们只想允许消息通过具有特定子字符串(例如"数据库"),那么我们需要指定以下过滤器:

第一个筛选器将在事件的消息文本中查找子字符串"数据库"。如果找到文本,筛选器将接受消息,筛选器处理将停止,将记录该消息。如果未找到子字符串,则事件将传递到下一个要处理的筛选器。如果没有下一个筛选器,则该事件将被隐式接受并被记录。但是,由于我们不希望记录不匹配的事件,因此我们需要使用log4net。Filter.DenyAllFilter将仅拒绝到达它的所有事件。此筛选器仅在筛选器链的末尾有用。

如果我们想允许在消息文本中包含"数据库"或"ldap"的事件,我们可以使用以下过滤器:

布局 布局元素只能定义为<附加>元素的子元素。

<布局>元素支持以下属性:

属性 描述
类型 必需属性。值必须是此布局的类型名称。如果未在 log4net 程序集中定义布局,则此类型名称必须完全限定为程序集限定。
<布局>元素支持以下子元素:

元素 描述
param Zero or more elements allowed. Layout specific parameters.
This example shows how to configure a layout that uses the log4net.Layout.PatternLayout.

Root Logger Only one root logger element may only be defined and it must be a child of element. The root logger is the root of the logger hierarchy. All loggers ultimately inherit from this logger.

An example root logger:

元素不支持任何属性。

元素支持以下子元素:

元素 描述
appender-ref 允许零个或多个元素。允许记录器按名称引用追加器。
水平 可选元素,最多允许一个。定义此记录器的日志记录级别。此记录器将仅接受处于此级别或更高级别的事件。
参数 允许零个或多个元素。记录器特定参数。
伐木
记录器元素只能定义为element的子元素。

示例记录器:

<记录器>元素支持以下属性。

属性 描述
名字 必需属性。值必须是记录器的名称。
可加性 可选属性。值可以是真,也可以是假。默认值为true。将此属性设置为false可防止此记录器继承在父记录器上定义的追加器。
<记录器>元素支持以下子元素:

元素 描述
appender-ref 允许零个或多个元素。允许记录器按名称引用追加器。
水平 可选元素,最多允许一个。定义此记录器的日志记录级别。此记录器将仅接受处于此级别或更高级别的事件。
参数 允许零个或多个元素。记录器特定参数。
渲染器
呈现器元素只能定义为元素的子元素。

一个示例渲染器:

<呈现器>元素支持以下属性。

属性 描述
渲染类 必需属性。值必须是此呈现器的类型名称。如果未在 log4net 程序集中定义类型,则此类型名称必须是完全程序集限定的。这是将负责呈现的类的对象的类型。
渲染类 必需属性。值必须是此呈现器的目标类型的类型名称。如果未在 log4net 程序集中定义类型,则此类型名称必须是完全程序集限定的。这是此呈现器将呈现的类型的名称。
<呈现器>元素不支持任何子元素。

参数
参数元素可以是许多元素的子元素。有关详细信息,请参阅上面的特定元素。

示例参数:

<参数>元素支持以下属性。

属性 描述
名字 必需属性。值必须是要在父对象上设置的参数的名称。
价值 可选属性。必须指定一个值或类型属性。此属性的值是可以转换为参数值的字符串。
类型 可选属性。必须指定一个值或类型属性。此属性的值是要创建并设置为参数值的类型名称。如果未在 log4net 程序集中定义类型,则此类型名称必须是完全程序集限定的。
<参数>元素支持以下子元素:

元素 描述
参数 允许零个或多个元素。参数特定参数。
使用嵌套参数元素的示例参数:

扩展参数 配置参数直接映射到对象上的可写属性。可用的属性取决于所配置对象的实际类型。log4net SDK 文档包含 log4net 程序集中包含的所有组件的 API 参考。

对于第三方组件,请参阅其相关 API 参考,了解可用属性的详细信息。

紧凑参数语法
可以使用参数名称作为元素名称而不是使用param元素和name属替指定所有参数。

例如,参数:

可以写成:
 类似资料: