Log4Net:何时获取并释放文件句柄?

Bri*_*ian 3 log4net log4net-configuration log4net-appender

我是一个Log4Net新手,试图基本/安全地了解它是如何工作的.如果我将Logger配置为FileAppender,并且我有多个语句,如下所示,一个接一个:

this.GetLogger().Info("...");
this.GetLogger().Error("....");
Run Code Online (Sandbox Code Playgroud)

每个调用是否实际打开文件,写入字符串并关闭它?每次?或者还有其他什么吗?我想知道何时使用文件资源.它是如何工作的?

ili*_*ias 8

文档:

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

换句话说:它会尽可能早地打开文件,因此每当您尝试登录时都不会产生额外的开销.如果失败,每次尝试记录任何内容时,它都会尝试打开文件.

您可以轻松检查日志记录在特定实例中的行为方式 - 无论何时打开文件,布局的Header值都将写入文件,每当关闭时,将写入布局的页脚值.

但请注意,这是默认行为.默认情况下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>
Run Code Online (Sandbox Code Playgroud)

获取每个日志记录操作的锁定显然比默认的"一次获取,一次释放"模型更耗时.但是,这样做有正当理由 - 例如,如果需要在执行长时间运行的应用程序期间轮换日志文件.

  • 默认情况下,是。处理日志实例后,将释放文件。但是,您可以更改锁定模型。默认的锁定模型`FileAppender.ExclusiveLock`确实执行了我上面描述的操作-尽快获取一个锁,仅在调用CloseFile时释放它,这通常是可以使用的。但是,它也是一个FileAppender.MinimalLock锁定模型,该模型在每次记录操作之前获取锁定,并在之后立即释放该锁定。但是请记住,这可能很耗时。不过,如果需要,可以使用它。 (2认同)