C# 如何下载从log4Net生成的日志文件

C# 如何下载从log4Net生成的日志文件,c#,asp.net-mvc,logging,log4net,C#,Asp.net Mvc,Logging,Log4net,我正在ASP.NETMVC4应用程序中使用log4net,并试图从log4net下载生成的日志文件 我想下载带有FileResult的日志文件,如: [Authorize(Roles = "Admin")] public FileResult DownloadUserInterfaceLog() { // Get the path of the log file string path = (LogManager.GetCurrentLoggers()[0].Logger.Rep

我正在ASP.NETMVC4应用程序中使用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.ReadAllBytespath时;我得到一个异常,因为日志文件已被另一个进程使用

我已经把它放在了我的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" />

在访问文件之前,您需要关闭Appender:

((FileAppender)LogManager.GetCurrentLoggers()[0].Logger.Repository.GetAppenders()[0]).Close()
这是一篇关于类似问题的文章

File.ReadAllBytes函数的编写方式是使用如下调用 要实例化文件流,请执行以下操作:

FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)
请注意,FileShare被指定为Read。这意味着如果你有 另一段代码同时写入同一个文件,您 即使另一段代码创建了 FileStream,将共享模式指定为“ReadWrite”,如下所示:

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;
}

似乎有用!非常感谢你!!您还知道,如何重新启动log4net跟踪程序?在我关闭附加器之后