首页 > 解决方案 > NLog - 允许其他进程读取日志文件

问题描述

开始使用 NLog。主进程(Windows 服务)每隔几秒就会写入日志文件。我需要允许另一个进程(桌面应用程序)在任意时间读取此文件(桌面应用程序不需要写入权限)。

然而问题是 NLog 在打开文件进行写入时可能会创建一个排他锁。因此,如果桌面进程在文件锁定时尝试读取,则会引发异常。

如何配置 NLog 以允许其他进程对日志文件内容具有只读访问权限,即使主进程已将其打开以进行写入?桌面进程将调用File.ReadAllText(),我希望它对并发操作是安全的。

(我通读了文档,发现 NLog 甚至允许从不同进程并发写入日志文件,因此理论上只读访问应该更容易。虽然我看不到任何解决方案)。

标签: c#ionlog

解决方案


然而问题是 NLog 在打开文件进行写入时可能会创建一个排他锁

不,它默认不锁定。有两个重要的设置:

ConcurrentWrites,此设置是默认设置true

concurrentWrites - 当使用 keepFileOpen = true 时,支持从同一机器主机上的多个进程对同一日志文件的优化并发写入。通过使用一种特殊的技术,它可以让文件从多个进程中保持打开状态。如果只有单个进程(和单个 AppDomain)应用程序正在记录,那么设置为 concurrentWrites = False 会更快。布尔默认值:真。注意:在 UWP 中,此设置应为 false

还有一个 keepFileOpen 设置,默认为 onfalse

keepFileOpen - 指示是否保持日志文件打开,而不是在每个日志记录事件中打开和关闭它。将此属性更改为 true 将大大提高性能,但也会使文件句柄保持锁定状态。启用此选项时考虑设置 openFileCacheTimeout = 30,因为它将允许归档操作并对被删除的日志文件做出反应。布尔默认值:假

请参阅文档,还有更多设置,如 concurrentWriteAttemptDelay、concurrentWriteAttempts 等。

最后但并非最不重要的一点是,如果您锁定文件的时间过长,也许先复制然后由您的应用程序读取?


推荐阅读