使用NLog创建日志文件并同时写入其中的内容

3

我有一个使用NLog创建日志文件的应用程序。我还有另一个叫做“日志查看器”的应用程序,它可以打开和读取上述的日志文件。但是这里有一些问题。当日志查看器在读取日志文件时,第一个应用程序正在写入其中,一些日志行可能无法在日志查看器中看到。 例如,如果第一个应用程序每毫秒写入一个日志,日志查看器无法跟踪新的日志行并且会错过其中一些。你知道吗?我需要一个在线日志查看器,可以追踪任何新的日志行。我不想在每个方法调用时读取文件中的所有文本,我只需要读取其中的新日志行。


你必须锁定文件。在读取之前完成写入操作。 - Sam Leach
或者您可以使用在 .net 4.0 中引入的 System.Collections.Concurrent.BlockingCollection<T>,以异步方式执行这两个操作。 - Imad Nabil Alnatsheh
3个回答

3

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

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


3
唯一能够知道日志行是否为新的方法是了解您上次读取文件时所在的位置(例如,“int lastposition = 0;”)。您需要从该位置开始读取,直到文件末尾。 “文件末尾”的位置与文件长度相同。当已读取文件块时,您可以在查看器中显示所读内容,并将最后一个位置保存到变量lastposition中,在下次查看器读取时需要从该位置开始。
但是,如果查看器无法打开文件......那就是另一回事了。

任何代码都将非常感激,因为这是一个常见的问题,您的解决方案可以帮助像我这样的人。 - rahularyansharma

1

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

如何设置NLog数据库目标。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接