【问题标题】:Read a log file created by NLog and write in it simultanously读取 NLog 创建的日志文件并同时写入
【发布时间】:2013-09-03 12:12:00
【问题描述】:

我有一个将日志写入 NLog 创建的文件的应用程序。 我还有另一个名为 Log Viewer 的应用程序。它可以打开和读取上面提到的日志文件。但是这里有一些问题。当日志查看器正在读取日志文件时,第一个应用程序正在写入其中,在日志查看器中无法看到某些日志行。 例如,如果第一个应用程序每毫秒写入一次日志,日志查看器就无法跟踪新的日志行并错过其中一些,你知道吗?我需要一个可以跟踪任何新日志行的在线日志查看器。我不想在每次方法调用时都读取文件中的所有文本,我只需要读取其中的新日志行

【问题讨论】:

  • 您必须锁定文件。在阅读之前完成写作。
  • 或者您可以使用 .net 4.0 中引入的System.Collections.Concurrent.BlockingCollection<T> 异步执行这两个操作。

标签: c# .net logging nlog


【解决方案1】:

您知道日志行是新的唯一方法是知道您上次阅读文件中的哪个位置(例如“int lastposition=0;”。 您需要从该位置读取直到文件结束。 “文件结尾”的位置与文件长度相同。当文件块被读取时;您在查看器中显示您阅读的内容,并将最后一个位置保存到变量 lastposition 中;下次你需要从哪里开始,观众正在阅读。

但如果查看者无法打开文件……那就另当别论了。

【讨论】:

  • 任何代码都会被真正应用?因为这是常见问题,您的解决方案可以帮助像我这样的人。
【解决方案2】:

让两个应用程序共享同一个日志可能会有问题。可能最简单的解决方案是让您的查看器复制原始日志文件,并查看它自己的专用副本。您可以不时检查实际日志文件是否有更新并相应地制作新副本。

同时访问同一个文件需要锁定,如果文件不可写入(可能会阻塞、丢失日志条目或生成异常),则可能会导致应用程序出现问题。

【讨论】:

    【解决方案3】:

    最好的解决方案是为数据库设置一个 NLog 目标。跟踪最后更新的行比跟踪文件位置更容易、更安全。 我不建议共享一个文件活动日志文件,同时读写。

    How to set up NLog Database target.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多