我在Windows 2008 R2机器上设置了Confluence 3.5站点。它使用Tomcat 6,我已经将它配置为使用log4j对特定空间进行访问日志记录。日志记录工作正常,但现在我想在.NET中编写Windows服务,以便每天对日志数据进行一些特定的解析。在我的服务中,我使用File.ReadAllText读取整个文件(文件本身不大,也不是XML)。但是当它试图这样做时,我得到一个IO异常,说该文件正被另一个进程使用。
我已经尝试了各种各样的事情来解决这个问题,但到目前为止我似乎无法从代码中读取日志文件。我可以使用Windows资源管理器登录服务器并复制它。但如果我尝试在服务中这样做,我会得到同样的错误。我已经浏览了网络上的方法来读取日志文件,或者可能更改记录器以使文件没有独占打开,但我还没有找到任何东西。我不确定它是首先打开文件的Confluence,Tomcat还是log4j。
有关如何使用自定义程序读取访问日志的任何建议吗?
答案 0 :(得分:2)
由于性能原因,记录器可能会对文件进行锁定(例如,因此不必经常打开文件)。要确认这一点,请使用Unlocker和Process Explorer登录服务器并检查文件上是否有任何打开的句柄。
您应该能够配置记录器,使其不能保持锁定。我之前没有使用过log4j,但请查看手册/网站 - 你可以做些什么。
答案 1 :(得分:1)
您可以使用FileStream(String, FileMode, FileAccess, FileShare)在C#中打开FileShare.ReadWrite。
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是没有FileShare参数的FileStream构造函数的默认值。 (see remarks)