【问题标题】:Log4Net and logging from parallel instancesLog4Net 和来自并行实例的日志记录
【发布时间】:2010-12-21 05:41:36
【问题描述】:

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

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

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

如何解决这个问题并记录并行实例的信息?另外,当我使用“MinimalLock”选项时性能下降怎么办?

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

【问题讨论】:

  • 能否将日志写入数据库而不是文件?
  • 使用文件的主要原因是我需要排除所有数据库连接。

标签: logging log4net parallel-processing fileappender


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 如何从运行时指定日志文件名?我认为这只能从配置中获得。文件?
    • 你说得对,我是从臀部开始的......时间戳有效,但是为新进程配置新的日志文件名变得很棘手。答案已修改,谢谢。
    【解决方案4】:

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

    披露:我是这个产品的作者。

    【讨论】:

    • 对于允许多个实例的简单桌面应用程序来说似乎有点矫枉过正。
    【解决方案5】:

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

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

    【讨论】:

    • 请注意:非常小心不要错过type="log4net.Util.PatternString"属性,否则将不起作用!
    • 另外,从stackoverflow.com/a/15544239/368896&lt;file type="log4net.Util.PatternString" value="c:\\testLogs\\TwoProjects-[%processid].txt" /&gt; 也可以工作(即,不需要&lt;conversionPattern ... /&gt;
    • 不会有碰撞吗?用进程启动的时间加上进程id不是更好吗?
    【解决方案6】:

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

    log4net.Appender.FileAppender+InterProcessLock
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-25
      相关资源
      最近更新 更多