Log4Net:什么时候获取并释放文件句柄?

Log4Net:什么时候获取并释放文件句柄?,log4net,log4net-configuration,log4net-appender,Log4net,Log4net Configuration,Log4net Appender,我是一名Log4Net新手,试图对其工作原理有一个基本/安全的了解。如果我将记录器配置为FileAppender,并且我有多条如下语句,一条接一条: this.GetLogger().Info("..."); this.GetLogger().Error("...."); 每次调用都会打开文件、写入字符串并关闭它吗?每一次?或者还有其他事情吗?我想知道文件资源何时在使用中。它是如何工作的?文档: 调用ActivateOptions时,此追加器将首先尝试打开文件进行写入。这通常在配置期间进行。如

我是一名Log4Net新手,试图对其工作原理有一个基本/安全的了解。如果我将记录器配置为FileAppender,并且我有多条如下语句,一条接一条:

this.GetLogger().Info("...");
this.GetLogger().Error("....");
每次调用都会打开文件、写入字符串并关闭它吗?每一次?或者还有其他事情吗?我想知道文件资源何时在使用中。它是如何工作的?

文档:

调用ActivateOptions时,此追加器将首先尝试打开文件进行写入。这通常在配置期间进行。如果无法打开文件进行写入,则每次将消息记录到appender时,appender都会尝试再次打开该文件。如果在记录消息时无法打开文件进行写入,则此追加器将丢弃该消息

换句话说:它会尽可能早地打开文件,这样在您尝试登录时就不会产生额外的开销。如果失败,它将在您每次尝试记录任何内容时尝试打开该文件

您可以轻松地检查日志记录在特定实例中的行为-无论何时打开文件,版面的页眉值都将写入文件,无论何时关闭,版面的页脚值都将写入文件

但是,请注意,这是默认行为<默认情况下,code>FileAppender使用
FileAppender.ExclusiveLock
锁定模式。另一个选项是
FileAppender.MinimalLock
锁定模型,它尝试在每次日志记录操作之前获取锁,然后释放锁。您可以按如下方式配置appender以使用它

<appender name="FileAppender" type="log4net.Appender.FileAppender">
    <file value="${TMP}\log-file.txt" />
    <appendToFile value="true" />
    <lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
    <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
    </layout>
</appender>


与默认的“获取一次,释放一次”模型相比,获取每个日志操作的锁显然更耗时。但是,这样做是有正当理由的——例如,如果在执行长时间运行的应用程序时需要旋转日志文件。

这是否意味着,当我调用log4net.Config.XmlConfigurator.Configure()时,它会尝试打开文件进行写入并使其永远打开;文件何时发布?默认情况下,是。当日志实例被释放时,文件被释放。但是,您可以更改锁定模型。默认的锁定模型FileAppender.ExclusiveLock与我前面描述的完全一样—尽快获取锁,仅在调用CloseFile时释放锁,这通常发生在处置时。然而,它也是一个
FileAppender.MinimalLock
锁定模型,它在每次日志记录操作之前获取锁,然后立即释放。不过,请记住,这可能很耗时。如果你需要它,你可以用它。