【问题标题】:Need advice on server side logging with log4net需要有关使用 log4net 进行服务器端日志记录的建议
【发布时间】:2009-12-10 11:57:31
【问题描述】:

我们正在使用 log4net 进行服务器端日志记录。我们面临的问题是 FileAppender。这是 app.config 文件中的 log4net 部分:

  <log4net xsi:noNamespaceSchemaLocation="http://csharptest.net/downloads/schema/log4net.xsd"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <appender name="MainAppender" type="log4net.Appender.FileAppender">
      <lockingMode type="log4net.Appender.FileAppender+MinimalLock" />
      <file value="${TMP}\Shunra.Infra.Test.Host.log" />
      <appendToFile value="true" />
      <layout type="log4net.Layout.PatternLayout">
        <conversionPattern value="%date [%thread] %-5level %logger - %message%newline" />
      </layout>
    </appender>
    <root>
      <level value="ERROR" />
      <appender-ref ref="MainAppender" />
    </root>
  </log4net>

问题是当多个线程写入日志文件时,log4net 有时无法获取文件的锁,因为同时另一个线程正在记录。问题表现在 log4net 内部处理的第一次机会 IOException 中。

我不确定在这种情况下我们是否正确使用了 log4net,并希望获得有关如何改进其配置的建议。

谢谢。

【问题讨论】:

  • 您能给我们展示一些记录日志的代码吗?
  • 这真的是微不足道的。每当我们希望记录某些内容时,我们只需编写 LogManager.GetLogger(GetType()).Debug(...)

标签: .net log4net


【解决方案1】:

使用 MinimalLock,您可以指示 FileAppender 仅在写入日志消息时获取对日志文件的锁定,并在写入完成后立即释放锁定。这意味着其他进程将有机会在日志刷新之间获取对日志文件的锁定。

您的日志文件位于 TEMP 文件夹(许多进程在其中进行临时工作)这一事实增加了其他进程“篡改”您的日志文件的风险。

我的建议是:

  1. 使用RollingFileAppender。在处理大量日志时,这是一个更具可扩展性的附加程序。
  2. 为您的日志文件创建一个专用文件夹。
  3. 使用默认ExclusiveLock 提高日志性能

【讨论】:

  • 同意问题是 MinimalLock
  • 各位,除了服务器,没有人写日志文件。但是,有多个线程写入同一个日志文件。该错误表明一个线程无法获取锁,因为另一个线程正在写入它。如果我做一个独占锁,那么只有一个线程会写日志文件,永远。这是不想要的。
  • 那么有些不对劲。 log4net 是线程安全的,所以让多个线程进行日志记录应该没问题...
  • @mark - 你找到锁定问题的原因了吗?
【解决方案2】:

我自己也想知道。也许解决这个问题的一种方法是使用MSMQ appender 之类的东西。然后编写某种应用程序将这些消息写入文件系统。还有一个 Async appender example 可能值得调查。

【讨论】:

  • 使用 AdoNetAppender 登录数据库也是一个可行的选择
【解决方案3】:

我们将 log4net 用于我们的多线程应用程序。永远不会导致问题,我们没有 部分。

或者您是否正在使用多个服务器应用程序访问同一个日志文件?

【讨论】:

  • 不,只有一台服务器,其中有多个线程。删除lockingMode元素可以吗?如果两个线程同时写入同一个文件,输出会是什么样子?两个线程的输出会交错成乱码吗?
  • @mark - log4net 在内部处理将日志消息序列化到附加程序中,所以不,它不会是乱码,每条日志消息都会逐行附加到文件中
  • 那么,我可以完全摆脱lockingMode元素吗?
猜你喜欢
  • 1970-01-01
  • 2020-05-21
  • 2016-06-05
  • 1970-01-01
  • 2013-02-25
  • 1970-01-01
  • 1970-01-01
  • 2014-12-27
相关资源
最近更新 更多