Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 读取NLog创建的日志文件并同时写入_C#_.net_Logging_Nlog - Fatal编程技术网

C# 读取NLog创建的日志文件并同时写入

C# 读取NLog创建的日志文件并同时写入,c#,.net,logging,nlog,C#,.net,Logging,Nlog,我有一个将日志写入NLog创建的文件的应用程序。 我还有另一个应用程序叫做日志查看器。它可以打开并读取上述日志文件。但这里有一些问题。当日志查看器正在读取日志文件,并且第一个应用程序正在写入日志文件时,一些日志行在日志查看器中看不到。 例如,如果第一个应用程序每毫秒写入一次日志,日志查看器就无法跟踪新的日志行,并且会遗漏其中的一些行,您知道吗?我需要一个在线日志查看器,可以跟踪任何新的日志行。我不想每次方法调用都读取文件中的所有文本,我只需要读取其中的新日志行唯一可以知道日志行是新的方法是知道上

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

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


但是,如果查看器无法打开该文件,那就另当别论了。

让两个应用程序共享同一个日志可能会有问题。最简单的解决方案可能是让查看器复制原始日志文件,并查看其自己的专用副本。您可以偶尔检查实际日志文件是否有更新并创建新的cop相应地,我也会这样做


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

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


您必须锁定文件。在读取之前完成写入。或者您可以使用.net 4.0中引入的
System.Collections.Concurrent.BlockingCollection
异步执行这两个操作。任何代码都会被真正引用?因为这是常见的问题,您的解决方案对我这样的人都有很大帮助。