代码之家  ›  专栏  ›  技术社区  ›  JL. Hans Passant

log4net,2个应用程序可以写入同一个日志文件吗?

  •  19
  • JL. Hans Passant  · 技术社区  · 14 年前

    是否可以使用log4net将两个应用程序写入同一个日志文件?

    5 回复  |  直到 8 年前
        1
  •  10
  •   Andrew Hare    14 年前

    它们可以,但如果一个应用程序正在写入该文件,则另一个应用程序在需要写入日志时很可能会遇到错误,因为第一个应用程序将保留该文件以供写入。最好始终为应用程序提供专用的日志记录源-如果需要共享日志,请使用数据库,因为它是为处理并发写入而设计的。

    这是在开发时在您的机器上非常好地工作的事情之一,因为您不太可能创建足够的并发写入日志文件以注意到任何问题。一旦您的应用程序开始经历更多的负载,问题就会开始显现出来,到那时它可能会以奇怪的方式表现出来。我肯定会尝试另一种解决方案。

        2
  •  18
  •   Jimothy    8 年前

    MinimalLock部分解决了这个问题(正如@mark提到的那样),但是如果使用RollingFileAppender,则会遇到其他问题。当文件滚动时,您可能会发现自己处于一个争用状态,其中一个进程会覆盖另一个进程新创建的日志文件。

    其他选项包括RemoteLogger,其中设置了一个简单的服务器来接收和记录由其他进程发送的日志事件。同样,您可以登录到SQL数据库。我写了一个简单的附加文件,记录到redis;您需要一个简单的应用程序来读取redis并记录到一个文件中。这些方法的问题在于它们都引入了一个故障点。当某个东西不能正常工作时,通常是您最需要日志的时候,然后它们可能就不可用了。

    因此,我的解决方案是通过将每个进程日志保存到自己的文件中来完全避免这个问题。这很容易改变配置。在你 (Rolling)FileAppender 配置,使用:

    <file type="log4net.Util.PatternString" value="c:\mylog-[%processid].txt" />
    

    进程ID成为文件名的一部分。是的,这意味着您现在有几个日志文件需要梳理,但是一个日志文件聚合器(如graylog、splunk或logscape)可以提供帮助。

        3
  •  10
  •   Mark Byers    14 年前

    这取决于 FileAppender LockingModel .如果是的话 ExclusiveLock 然后另一个进程无法打开该文件进行写入。另一种选择是 MinimalLock 但不是为了这个目的。它用于允许另一个进程移动或删除文件。

        4
  •  1
  •   Svilen Varbanov    10 年前

    或者可以使用互斥锁锁定公共资源,从而同步从不同进程访问公共日志文件。

        5
  •  1
  •   Morten Grøtan    8 年前

    是的,正如上面所述,这是可能的,但是我现在已经对这个场景做了一些压力测试。

    设置非常简单:

    1. Web项目1设置为记录单个条目的页面+按钮 它将1000个请求发送到同一页,其中计数器位于 url(由logging语句获取)。
    2. Web项目2针对同一日志文件进行了相同的设置。

    当同时单击两个按钮时,日志条目将散布在整个日志中。 但是,这是一个大问题,从附带的请求计数器来看,很明显存在竞争条件。 几乎每次一个Web项目成功地记录其条目时,另一个都会失败(跳过该条目)。

    所以,对于这个普通日志来说,有了合适的流量,基本上就无法保证哪些日志语句最终会出现在日志中。 其结论似乎是总是有特定于项目的日志文件。

    测试是在默认的“最小锁”下完成的。 我用“exclusivelock”重新进行了测试,结果发现第一个配置日志记录器的Web项目“won”,基本上锁定了所有其他要记录的请求。 所以很明显,这也是一个不可行的选择。