【问题标题】:Running Log4Net appenders on separate thread在单独的线程上运行 Log4Net 附加程序
【发布时间】:2010-06-25 15:55:07
【问题描述】:

目前,我有自己的日志系统,其中日志本质上是一个队列,有一个单独的线程监听该队列并执行所有实际的写入操作。系统处理了大量的日志消息,文件在几分钟内很容易超过 10 MB 大小,因此在调用线程中进行实际日志记录是不可行的。

如果 log4net 已经支持这种消息传递架构,或者其他类似的功能在线程环境中工作,我无法在网上找到显示线程如何在 log4net 中工作的资源。是否有任何预先存在的功能可以帮助我?

如果不创建 log4net 包装器,这可能吗?

【问题讨论】:

    标签: c# multithreading log4net


    【解决方案1】:

    如果您的日志数据依赖于特定顺序,您可能需要重新考虑线程方法 - 线程可能会干扰该顺序并最终导致日志条目不按顺序发布。

    可以尝试使用 MSMQ(或其他一些队列技术)将日志消息快速发布到其他进程,然后将物理写入存储。这将保证消息按照发送的顺序显示。

    【讨论】:

    • MSMQ 非常重量级,尤其是在这方面。一个内存队列就足够了。
    • 内存队列是我的记录器当前实现的方式。我想我必须将它扩展到 log4net 并包装它。或者创建我自己的 appender。
    • 由于他使用的是队列,所以记录的顺序会和插入的顺序一致,所以不会有问题。
    【解决方案2】:

    这不是一个坏主意。诀窍是将条目排队并在单个队列中处理它们。看看http://www.drdobbs.com/visualstudio/225700095 就是一个很好的例子。

    【讨论】:

      【解决方案3】:

      您可以随时查看 log4net 的源代码来解决这些问题。它是开源的。

      【讨论】:

      • 在庞大的类库中深入挖掘有点困难。但是,搜索新 Thread 不会返回任何有用的信息,搜索 ThreadPool 会显示一个附加程序,它“有点”对我的目的有用,但远未达到目标。猜猜我必须制作自己的附加程序。 :(
      【解决方案4】:

      如果你使用 .NET Framework 4,你可以使用 BlockingCollection 来保持日志序列

      【讨论】:

        【解决方案5】:

        我已经成功使用了ParallelForwardingAppenderAsyncForwardingAppender 附加程序。这些附加程序可从以下存储库中获得:

        https://github.com/cjbhaines/Log4Net.Async

        ParallelForwardingAppender 利用 BlockingCollection 和任务并行库的其他方面来实现无损消息队列。

        AsyncForwardingAppender 在后台线程上利用环形缓冲区和 10 毫秒的轮询周期来优先考虑应用程序性能而不是日志保真度。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-10-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多