c# - NLog - 允许其他进程读取日志文件
问题描述
开始使用 NLog。主进程(Windows 服务)每隔几秒就会写入日志文件。我需要允许另一个进程(桌面应用程序)在任意时间读取此文件(桌面应用程序不需要写入权限)。
然而问题是 NLog 在打开文件进行写入时可能会创建一个排他锁。因此,如果桌面进程在文件锁定时尝试读取,则会引发异常。
如何配置 NLog 以允许其他进程对日志文件内容具有只读访问权限,即使主进程已将其打开以进行写入?桌面进程将调用File.ReadAllText()
,我希望它对并发操作是安全的。
(我通读了文档,发现 NLog 甚至允许从不同进程并发写入日志文件,因此理论上只读访问应该更容易。虽然我看不到任何解决方案)。
解决方案
然而问题是 NLog 在打开文件进行写入时可能会创建一个排他锁
不,它默认不锁定。有两个重要的设置:
ConcurrentWrites,此设置是默认设置true
:
concurrentWrites - 当使用 keepFileOpen = true 时,支持从同一机器主机上的多个进程对同一日志文件的优化并发写入。通过使用一种特殊的技术,它可以让文件从多个进程中保持打开状态。如果只有单个进程(和单个 AppDomain)应用程序正在记录,那么设置为 concurrentWrites = False 会更快。布尔默认值:真。注意:在 UWP 中,此设置应为 false
还有一个 keepFileOpen 设置,默认为 onfalse
keepFileOpen - 指示是否保持日志文件打开,而不是在每个日志记录事件中打开和关闭它。将此属性更改为 true 将大大提高性能,但也会使文件句柄保持锁定状态。启用此选项时考虑设置 openFileCacheTimeout = 30,因为它将允许归档操作并对被删除的日志文件做出反应。布尔默认值:假
请参阅文档,还有更多设置,如 concurrentWriteAttemptDelay、concurrentWriteAttempts 等。
最后但并非最不重要的一点是,如果您锁定文件的时间过长,也许先复制然后由您的应用程序读取?
推荐阅读
- javascript - 尝试迁移到 Angular 9 时出错:带有 DI 迁移的未修饰类
- c++ - 使用向量将输入从文本文件存储到二维数组中
- javascript - 如何在 React Hooks 中完成 Vue watcher
- flutter - Flutter 无法专注于 Stack Inside 的可见溢出中的 TextField
- algorithm - 当段落包含来自 Elasticsearch 索引的句子时匹配
- html - 如何为 Laravel 转义 html
- javascript - JS - 我不明白为什么这个对象声明不起作用
- python - 有没有一种内置方法可以将无参数函数转换为生成器?
- leaflet - 设置多层地图的活动层
- keras - 如何在 resnet50 中应用三元组损失函数以进行深度排名