2010-04-06 84 views

回答

10

他们可以,但如果一个应用程序被写入该文件的其他应用程序将最有可能的经验,如果它需要写入日志以及由于第一应用将举行打开文件写入错误。最好为您的应用程序提供专用的日志记录源 - 如果您需要共享日志,请使用数据库,因为它旨在处理并发写入。

这是那些东西,将工作非常好你的机器上,当你正在开发的,因为你不可能创造足够的并发写入日志文件,以发现任何问题之一。一旦你的应用程序开始经历更多的负载,这个问题就会开始显现,并且在这一点上它可能会以奇怪的方式表现出来。我肯定会尝试另一种解决方案。

10

这取决于FileAppenderLockingModel。如果它是ExclusiveLock,则另一个进程无法打开该文件进行写入。替代方案是MinimalLock,但它不是为此目的。它旨在允许其他进程移动或删除文件。

+0

有没有人有经验分享这种方法? – SandRock 2012-01-16 11:02:51

17

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

其他选项包括RemoteLogger,那就是你有一个简单的服务器设置为接收和其他进程发送记录的日志记录事件。同样,您可以登录到SQL数据库。我写了一个简单的附加日志给Redis;您需要一个简单的应用程序才能从Redis中读取并记录到文件中。这些方法的问题是它们都引入了一个失败点。当某些工作不正常时,往往需要记录最多的时间,然后可能无法使用。

所以我的解决办法是通过使每个进程日志到它自己的文件完全避免问题。配置变化很容易实现。在你(Rolling)FileAppender配置,使用:

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

进程ID将成为文件名的一部分。是的,这意味着您现在有几个日志文件需要梳理,但像Graylog,Splunk或Logscape这样的日志文件聚合器可以提供帮助。

1

或者您可以使用Mutex锁定公共资源,因此可以同步访问来自不同进程的通用日志文件。

0

是的,这是可能的,如上所述,但我现在已经对这种情况做了一些压力测试。

的设置是相当简单:

  1. Web项目1成立了一个页面,记录在 URL的单个条目+按钮 是衬托出1000个请求到同一页面,用一个计数器(由日志声明拾取)。
  2. Web项目2在相同的日志文件中设置相同。

当两个按钮被同时点击时,日志条目将散布在整个日志中。 但是,这是一个很大的GOTCHA,根据伴随的请求计数器来判断,显然存在竞争条件。 几乎每次一个Web项目成功记录其条目时,另一个都会失败(该条目被跳过)。

因此,对于这种常见日志,体面的流量,你基本上不能保证哪些日志语句实际上最终在日志中。 结论是总是有项目特定的日志文件,看来。

测试是使用默认的“MinimalLock”完成的。 我用“ExclusiveLock”重新测试了测试,结果发现第一个配置记录器的Web项目“获胜”,基本上锁定了所有其他请求记录。所以很明显,这是一个不好的做法。

相关问题