从.NET应用程序中读取Confluence日志文件
我在Windows 2008 R2框上设置了Confluence 3.5站点。它使用Tomcat 6,我已经配置它使用log4j来访问特定空间的日志记录。日志记录工作正常,但现在我想在.NET中编写Windows服务来每天对日志数据进行一些特定的分析。在我的服务中,我使用File.ReadAllText读取整个文件(文件本身并不大,也不是XML)。但是当它试图这样做时,我得到一个IO异常,表明该文件正在被另一个进程使用。从.NET应用程序中读取Confluence日志文件
我试过各种东西来解决这个问题,但到目前为止我似乎无法从代码中读取日志文件。我可以登录到服务器并使用Windows资源管理器复制它。但是如果我尝试在服务中这样做,我会得到同样的错误。我已经浏览了Web的各种方式来阅读日志文件,或者可能更改记录器以使文件独占打开,但我没有找到任何东西。我不确定它是否是Confluence,Tomcat或者首先打开文件的log4j。
有关如何使用自定义程序从访问日志中读取的任何建议?
由于性能方面的原因,记录器可能会锁定文件(例如,因此它不必经常打开文件)。要确认这一点,请登录服务器并使用Unlocker和Process Explorer检查文件上是否有打开的句柄。
您应该能够配置记录器,使其不锁定锁定。我之前没有使用过log4j,但是查看手册/网站 - 会有些事情可以做。
您可以在C#中使用FileShare.ReadWrite打开FileStream(String, FileMode, FileAccess, FileShare)。
FileStream logFileStream = new FileStream("C:\path\to\file.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite);
StreamReader logFileReader = new StreamReader(logFileStream);
这应该防止你的文件流试图锁定该文件,并且不应抛出异常。
如果你只是使用CTOR没有文件共享枚举参数流每股股价在默认情况下,文件仅适用于阅读:
FileShare.Read是为那些的FileStream构造函数没有一个文件共享参数的默认。 (see remarks)