C# 如何下载从log4Net生成的日志文件
我正在ASP.NETMVC4应用程序中使用log4net,并试图从log4net下载生成的日志文件 我想下载带有FileResult的日志文件,如: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
[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跟踪程序?在我关闭附加器之后