我在我的项目中使用log4net,但有一个问题。 该程序的主要功能需要很长时间,我使用日志记录来保存有关它的信息。我使用 FileAppender 将日志保存到文件。

我的应用程序位于共享(本地)文件夹中,并且可能有多个应用程序实例从一个路径运行。在这种情况下,我只能从第一个程序记录信息,我的应用程序的其他实例无法记录信息,因为日志文件被锁定

当我使用" log4net.Appender.FileAppender + MinimalLock" 选项时,会出现信息丢失的情况。并非所有来自两个实例的日志都保存到文件中。

如何从并行实例中解决此问题和日志信息?当我使用“MinimalLock”时,性能下降呢?选项?

感谢。希望得到你的帮助。

有帮助吗?

解决方案

只需在日志文件名中包含应用程序的进程ID即可。然后,您应用的不同实例将登录到不同的文件。这是一个例子:

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->

其他提示

我认为这是典型的情况,需要集中式日志记录解决方案。我宁愿将日志语句异步地泵送到某个远程服务,而不是担心文件和遭受性能瓶颈,而这些远程服务将负责存储和处理日志。看看这个名为 logFaces 的日志聚合器,它的设计目的是将应用程序与管理它们分开日志。它应该与标准的log4net UDP appender一起使用,并将按应用程序,主机,线程等对您的日志数据进行分区。同时让您在真正需要时随时创建日志文件。

披露:我是该产品的作者。

也许您从每个实例登录到不同的文件?否则,您可能需要设置专用于日志记录的单独进程。程序的每个实例都会在那里发送它的日志消息,它会将它附加到文件中。这可以使用SocketAppender完成。此外,我发现使用RollingFileAppender将日志输出分解为chucks更容易处理。

您可以创建一个自定义appender,打开要写入的文件,然后将其关闭。如果它遇到锁定的文件,它可能会暂停并重试少量。

在自定义appender中,您还可以在共享写入模式下打开文件,这将允许多个编写器,但这不会阻止多条日志行合并在一起。

如果您没有编写大量数据,上面列出的打开/关闭机制可能是您的最佳选择。请注意,由于文件的不断打开和关闭,如果您记录大量数据,可能会看到明显的性能影响。

一种更复杂的机制,但可以提供高性能的日志记录路径:编写一个通过TCP或UDP接收日志行的日志服务。该服务将负责缓冲数据并将其写入磁盘。我们过去曾使用过这种方法(不是通过Log4Net,而是作为一般解决方案)来提高日志写入效率。

绝对考虑为每个进程创建不同的日志文件,可能使用时间戳生成唯一的文件名。

使用InterProcessLock代替MinimalLock可以减少多个进程访问单个日志文件时的数据丢失。

log4net.Appender.FileAppender+InterProcessLock
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top