13

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

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

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

如何解决此问题并从并行实例中记录信息?当我使用“MinimalLock”选项时,性能下降又会怎样?

谢谢。希望得到您的帮助。

4

6 回答 6

20

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

<appender name="MyRollingFileAppender" type="log4net.Appender.RollingFileAppender">
  <file type="log4net.Util.PatternString">
    <conversionPattern value="log_%processid.log" />
  </file>
<!-- ... -->
于 2010-10-11T16:12:34.563 回答
4

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

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

于 2009-12-01T15:20:19.583 回答
1

您可以创建一个自定义附加程序,打开要写入的文件,然后关闭它。如果它遇到锁定的文件,它可能会暂停并重试几次。

在自定义附加程序中,您还可以以允许多个写入者的共享写入模式打开文件,但这不会阻止日志行合并在一起。

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

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

于 2009-11-28T19:22:41.573 回答
0

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

于 2009-11-28T16:36:18.993 回答
0

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

于 2009-11-28T19:26:36.777 回答
0

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

log4net.Appender.FileAppender+InterProcessLock
于 2015-12-10T08:04:32.013 回答