【问题标题】:NLog - Allow other processes to read log fileNLog - 允许其他进程读取日志文件
【发布时间】:2019-07-04 14:04:21
【问题描述】:

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

但问题是 NLog 在打开文件进行写入时可能会创建一个排他锁。所以如果桌面进程在文件被锁定时试图读取,就会抛出异常。

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

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

【问题讨论】:

    标签: c# io nlog


    【解决方案1】:

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

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

    ConcurrentWrites,这个设置是默认的true

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

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

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

    参见docs,还有更多设置,如 concurrentWriteAttemptDelay、concurrentWriteAttempts 等。

    最后但同样重要的是,如果您锁定文件的时间过长,是否可以先复制然后由您的应用程序读取?

    【讨论】:

    • 这就是我的想法和希望。但是,我使用默认设置(concurrentWrites=truekeepFileOpen=false)的 NLog 并且仍然得到异常“文件正在被另一个进程使用”。重要的是,其他进程甚至没有尝试写入日志文件,只是尝试读取。
    • 您的程序读取文件或写入文件的程序(使用 NLog)时是否遇到异常?
    • 什么是平台?
    • 单读抛出异常。一篇文章是 Windows 服务。一个读物是 WPF 桌面应用程序。
    • @dotNET 认为在不排除现有作者的情况下,应该由驾驶者阅读有关如何打开文件进行阅读的信息。另请参阅github.com/NLog/NLog/issues/2967 如果文件放置在网络共享上,则可能检查文件共享和 ntfs-permissions。
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 2012-02-17
    • 2016-05-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-20
    • 1970-01-01
    • 2014-04-29
    相关资源
    最近更新 更多