log4net 何时将日志写入或提交到文件?

17

我们使用log4net来记录WinForm应用程序的事件和错误。 客户希望在应用程序运行期间查看日志文件。 但我找不到log4net何时以及如何执行写入(commit)操作。 除了自己创建另一个记录器外,如何满足客户的需求? 有什么帮助吗?谢谢。


我们在Windows Forms应用程序中使用log4net,对此没有任何问题。事件和文件更新之间存在一些延迟,但我们只谈论几秒钟的时间。也许问题出在其他地方? - Sergey Teplyakov
1
是的,也许我们客户的问题是第二种情况。正如Peter所说,我们将通过MemoryAppender来解决这个问题。 非常感谢大家,特别是Peter。你的答案非常有帮助。 - Jollian
4个回答

10
如果您正在使用 FileAppender,则该附加程序继承了 TextWriterAppender,而后者公开了 ImmediateFlush 属性。此属性的默认值为 true,并强制附加程序对每个 Append 操作在底层流上执行 Flush()
根据您对客户“监视”日志文件的设想,一个想法是从应用程序内启用监视。这可以通过除了向文件追加外,使用 MemoryAppender 并从该附加程序中读取事件来完成。

1

当我在SharePoint实例中使用log4net时,我注意到一件事情,那就是根据您的安全配置和配置加载的实现方式,启动应用程序池的用户可能没有权限写入本地文件系统以创建日志文件。

因此,您需要确保使用正确的凭据调用配置,在SharePoint中,它将处于提升的安全上下文中。虽然不完全相关,但这可能是您遇到的问题。


0

查看this SO帖子,了解如何以编程方式刷新log4net日志。Joe的答案虽然略有不准确,但大致相同的代码,因此可能适用于刷新所有缓冲的appender。


-1
你提到了一个日志文件,所以我猜你正在使用FileAppender或其派生类。这将默认缓冲输出。缓冲输出更高效,因此为了满足您的要求,我建议您在查看日志之前提供一些机制来刷新日志,而不是在每次写操作后强制提交。
您可以使用以下代码来实现这一点:
foreach (IAppender appender in LogManager.GetRepository().GetAppenders())
{
    BufferingAppenderSkeleton b = appender as BufferingAppenderSkeleton;
    if (b != null) b.Flush();
}

1
这是不正确的!FileAppender(更具体地说是其基类TextWriterAppender)在每个Append操作后都会刷新!请参见http://logging.apache.org/log4net/release/sdk/log4net.Appender.TextWriterAppender.ImmediateFlush.html因此,您无需执行任何操作,因为最新的日志条目将始终立即写入文件,以便您的客户可以简单地打开该文件。 - gehho
1
@gehho是正确的。FileAppender不会缓冲。内置的具有缓冲功能的附加程序是AdoNet-、BufferingForwarding-、Remoting-和SmtpXXX附加程序。 - Peter Lillevold

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接