是否可以使用log4net将2个应用程序写入同一个日志文件?
答案 0 :(得分:18)
MinimalLock部分解决了问题(正如@Mark提到的那样),但如果您使用的是RollingFileAppender,则会遇到其他问题。当文件滚动时,您可能会发现自己处于竞争状态,其中一个进程会覆盖另一个进程的新创建的日志文件。
其他选项包括RemoteLogger,您可以在其中设置一个简单的服务器来接收和记录其他进程发送的日志记录事件。同样,您可以登录到SQL数据库。我写了一个简单的附加内容,记录到Redis;你需要一个简单的应用程序来从Redis读取并记录到文件。这些方法的问题在于它们都引入了一个失败点。当某些东西不能正常工作时,往往需要最多的日志,然后它们可能无法使用。
所以我的解决方案是通过让每个进程记录到自己的文件来完全避免这个问题。这很容易改变配置。在(Rolling)FileAppender
配置中,使用:
<file type="log4net.Util.PatternString" value="c:\mylog-[%processid].txt" />
进程ID成为文件名的一部分。是的,这意味着您现在有几个日志文件要梳理,但是像Graylog,Splunk或Logscape这样的日志文件聚合器可以提供帮助。
答案 1 :(得分:10)
他们可以,但是如果一个应用程序正在编写该文件,那么另一个应用程序很可能会遇到错误,如果它还需要写入日志,因为第一个应用程序将保持文件打开以进行写入。最好为您的应用程序提供专用的日志记录源 - 如果您需要共享日志,请使用数据库,因为它旨在处理并发写入。
这是在开发过程中在您的计算机上运行良好的事情之一,因为您不太可能创建足够的并发写入日志文件以发现任何问题。一旦您的应用程序开始体验更多负载,问题就会开始显现,并且在那时它可能会以奇怪的方式表现出来。我肯定会尝试另一种解决方案。
答案 2 :(得分:10)
取决于FileAppender的LockingModel。如果是ExclusiveLock则另一个进程无法打开文件进行写入。替代方案是MinimalLock,但它不是为了这个目的。它旨在允许其他进程移动或删除文件。
答案 3 :(得分:2)
是的,如上所述,这是可能的,但我现在已经对这种情况进行了一些压力测试。
设置非常简单:
当同时单击两个按钮时,日志条目散布在整个日志中。 但是,这是一个很大的GOTCHA,从随附的请求计数器判断,显然存在竞争条件。 几乎每次一个Web项目成功记录其条目时,另一个都会失败(跳过该条目)。
因此,对于此公共日志具有良好的流量,您基本上无法保证哪些日志语句实际上最终会出现在日志中。 结论是总是有项目特定的日志文件,似乎。
测试是使用默认的“MinimalLock”完成的。 我也用“ExclusiveLock”重新测试了测试,结果发现第一个配置记录器的web项目“赢了”,基本上锁定了所有其他记录请求。 显然,这也是一个禁忌。
答案 4 :(得分:1)
或者您可以使用Mutex锁定公共资源,从而同步对来自不同进程的公共日志文件的访问。