2015-01-14 36 views
1

我在ASP.NET MVC 4应用程序中使用log4net,并试图从log4Net下载生成的日志文件。如何从log4Net下载生成的日志文件

我心目中下载日志文件以FileResult,如:

[Authorize(Roles = "Admin")] 
public FileResult DownloadUserInterfaceLog() 
{ 
    // Get the path of the log file 
    string path = (LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0] as FileAppender).File; 
    // Get the file 
    byte[] fileBytes = System.IO.File.ReadAllBytes(path); 
    string fileName = "Log.txt"; 
    // Return the expected file 
    return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Octet, fileName); 
} 

我的问题是,当我打电话System.IO.File.ReadAllBytes(path);我得到一个异常,导致日志文件已经由另一个进程使用。

我已经把<lockingModel value="log4net.Appender.FileAppender+MinimalLock" /> (which should release the file after any modification) in my Web.Config没有成功。

Web.Config中开始log4net的配置:

<log4net> 
    <appender name="Appender-root" type="log4net.Appender.RollingFileAppender"> 
     <lockingModel value="log4net.Appender.FileAppender+MinimalLock" /> 
     <file value="Path..." /> 
     <appendToFile value="true" /> 

回答

2

Here是关于类似问题的文章。

File.ReadAllBytes()函数被写入,使得它使用像 呼叫以下实例化一个FileStream:

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read) 

注意,文件共享被指定为已读。这意味着如果您有另一段代码同时写入同一文件,即使其他代码通过将共享模式指定为“ReadWrite”创建了 FileStream,您的 也会收到错误:

FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.ReadWrite) 

解决办法是写自己的自定义ReadAllBytes:

public static byte[] ReadAllBytes(String path) 
{ 
    byte[] bytes; 
    using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) 
    { 
     int index = 0; 
     long fileLength = fs.Length; 
     if (fileLength > Int32.MaxValue) 
      throw new IOException(“File too long”); 
     int count = (int)fileLength; 
     bytes = new byte[count]; 
     while (count > 0) 
     { 
      int n = fs.Read(bytes, index, count); 
      if (n == 0) 
       throw new InvalidOperationException(“End of file reached before expected”); 
      index += n; 
      count -= n; 
     } 
    } 
return bytes; 
} 
2

您需要访问该文件前,关闭追加程序:

((FileAppender)LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0]).Close() 
+0

似乎工作!非常感谢 !! 你知道吗,我该如何重建log4net tracer? (在我关闭Appender之后) –