【问题标题】:Log4Net: When is the file handle acquired and released?Log4Net:文件句柄什么时候获取和释放?
【发布时间】:2013-01-15 20:59:05
【问题描述】:

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

this.GetLogger().Info("...");
this.GetLogger().Error("....");

每次调用是否真的打开文件、写入字符串并关闭它?每次?或者还有其他事情发生吗?我想知道文件资源何时被使用。它是如何工作的?

【问题讨论】:

    标签: log4net log4net-configuration log4net-appender


    【解决方案1】:

    文档:

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

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

    您可以轻松检查日志记录在您的特定实例中的行为 - 每当打开文件时,布局的 Header 值将写入文件,每当文件关闭时,布局的 Footer 值将被写入。

    但是请注意,这是默认行为。 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 锁定模型,它在每个日志记录操作之前获取锁,并在之后立即释放它。但请记住,这可能很耗时。不过,如果你需要它,你可以使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多