在ASP.NET Core中使用log4net将日志存入CSV文件

72 阅读2分钟

要在ASP.NET Core中使用log4net将日志记录到CSV文件,你需要完成以下步骤:

1. 安装必要的NuGet包

首先,通过NuGet安装log4net包:

Install-Package log4net
Install-Package Microsoft.Extensions.Logging.Log4Net.AspNetCore

2. 配置log4net配置文件

创建一个log4net.config文件,配置CSV日志输出:

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="CsvFileAppender" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="Logs/log_%date{yyyyMMdd}.csv" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <conversionPattern value="%date,%level,%logger,%message%newline" />
    </layout>
  </appender>
  
  <root>
    <level value="ALL" />
    <appender-ref ref="CsvFileAppender" />
  </root>
</log4net>

或者使用专门的CSV布局(需要安装log4net.Ext.Json):

<?xml version="1.0" encoding="utf-8" ?>
<log4net>
  <appender name="CsvFileAppender" type="log4net.Appender.FileAppender">
    <file type="log4net.Util.PatternString" value="Logs/log_%date{yyyyMMdd}.csv" />
    <appendToFile value="true" />
    <layout type="log4net.Layout.PatternLayout">
      <header value="Timestamp,Level,Logger,Message,Exception&#xD;&#xA;" />
      <conversionPattern value="%date,%level,%logger,%message,%exception&#xD;&#xA;" />
    </layout>
  </appender>
  
  <root>
    <level value="ALL" />
    <appender-ref ref="CsvFileAppender" />
  </root>
</log4net>

3. 配置Program.cs

Program.cs中配置log4net:

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureLogging(logging =>
        {
            logging.ClearProviders();
            logging.AddLog4Net("log4net.config");
        });

4. 在Startup.cs中注入ILogger

确保在Startup.cs中构造函数接收ILogger<Startup>参数:

public class Startup
{
    private readonly ILogger<Startup> _logger;
​
    public Startup(IConfiguration configuration, ILogger<Startup> logger)
    {
        Configuration = configuration;
        _logger = logger;
    }
​
    public IConfiguration Configuration { get; }
​
    // ...
}

5. 在控制器中使用日志记录

在控制器中注入并使用ILogger:

public class HomeController : Controller
{
    private readonly ILogger<HomeController> _logger;
​
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }
​
    public IActionResult Index()
    {
        _logger.LogInformation("This is an information message");
        _logger.LogError("This is an error message");
        
        return View();
    }
}

6. 确保日志目录存在

在应用程序启动时确保日志目录存在:

public static void Main(string[] args)
{
    // 确保日志目录存在
    var logDirectory = Path.Combine(Directory.GetCurrentDirectory(), "Logs");
    if (!Directory.Exists(logDirectory))
    {
        Directory.CreateDirectory(logDirectory);
    }
    
    CreateHostBuilder(args).Build().Run();
}

7. 配置文件属性

确保log4net.config文件的属性设置为"始终复制"或"如果较新则复制"到输出目录。

自定义CSV格式

如果你想自定义CSV格式,可以创建自定义的log4net布局:

public class CsvLayout : log4net.Layout.LayoutSkeleton
{
    public override void ActivateOptions()
    {
    }
​
    public override void Format(TextWriter writer, log4net.Core.LoggingEvent loggingEvent)
    {
        writer.Write(""{0}",", loggingEvent.TimeStamp.ToString("yyyy-MM-dd HH:mm:ss"));
        writer.Write(""{0}",", loggingEvent.Level);
        writer.Write(""{0}",", loggingEvent.LoggerName);
        writer.Write(""{0}"", loggingEvent.RenderedMessage.Replace(""", """"));
        if (loggingEvent.ExceptionObject != null)
        {
            writer.Write(","{0}"", loggingEvent.ExceptionObject.ToString().Replace(""", """"));
        }
        writer.WriteLine();
    }
}

然后在配置中使用这个自定义布局:

<layout type="YourNamespace.CsvLayout, YourAssembly" />

注意事项

  1. 确保应用程序对日志目录有写入权限
  2. CSV文件可能会变得很大,考虑添加滚动策略
  3. 在生产环境中,可能需要更复杂的日志格式和更多的字段

这样配置后,你的ASP.NET Core应用程序就会将日志以CSV格式写入指定的文件中了。