1

我在 Windows 2008 R2 机器上设置了 Confluence 3.5 站点。它使用 Tomcat 6,我已将其配置为使用 log4j 对特定空间进行访问日志记录。日志记录工作正常,但现在我想在 .NET 中编写一个 Windows 服务来每天对日志数据进行一些特定的解析。在我的服务中,我使用 File.ReadAllText 读取了整个文件(文件本身不大,也不是 XML)。但是当它尝试这样做时,我得到一个 IO 异常,表明该文件正在被另一个进程使用。

我已经尝试了各种方法来解决这个问题,但到目前为止我似乎无法从代码中读取日志文件。我可以登录到服务器并使用 Windows 资源管理器复制它。但是如果我尝试在服务中这样做,我会得到同样的错误。我在网上查看了读取日志文件的方法,或者可能将记录器更改为不以独占方式打开文件,但我没有找到任何东西。我不确定首先打开文件的是 Confluence、Tomcat 还是 log4j。

关于如何使用自定义程序从访问日志中读取的任何建议?

4

2 回答 2

2

出于性能原因,记录器可能会锁定文件(例如,它不必经常打开文件)。要确认这一点,请登录服务器并使用UnlockerProcess Explorer检查文件上是否有任何打开的句柄。

您应该能够配置记录器,使其不持有锁。我之前没有使用过 log4j,但是请查看手册/网站 - 你可以做一些事情。

于 2011-08-26T21:19:28.510 回答
1

您可以使用 FileShare.ReadWrite在 C# 中打开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);

这应该可以防止您的文件流尝试锁定该文件并且不应该抛出异常。

如果您只使用没有 FileShare Enum 参数的 CTOR,则默认情况下流共享文件仅用于读取:

FileShare.Read 是那些没有 F​​ileShare 参数的 FileStream 构造函数的默认值。(见备注

于 2013-09-04T12:40:01.913 回答