首页 > 解决方案 > 如何在 dot net core 中设置 log4net 以记录所有未处理的异常?

问题描述

我正在使用此处建议的实现将 log4net 添加到当前的点网核心项目,https://thecodebuzz.com/log4net-file-logging-console-logging-asp-net-core/(这是使用 Microsoft.Extensions.Logging .Log4Net.AspNetCore),如何设置 log4net 来记录所有未处理的异常?我还没有想出办法做到这一点。请问有什么指点吗?

后期编辑:

public class LogFilter : ExceptionFilterAttribute
{
    public readonly ILogger _logger;

    public LogFilter(ILogger logger)
    {
        _logger = logger;
    }

    // public Logger Logger { get; set; }
    public override void OnException(ExceptionContext Context)
    {
        //Log what you need here, the exception is in Context.Exception
        _logger.LogError(Context.Exception, null);

        Context.ExceptionHandled = true;
    }
}

我尝试添加这样的 LogFilter 类,并在 Startup.cs 中进行此更改:

services.AddMvc(o =>
{
    o.Filters.Add(new LogFilter(Logger));
});

在 ConfigureServices 方法以及public ILogger Logger { get; }属性中,但我得到的错误是关于 _logger 在我的 LogFilter 类中为空。

稍后更新(旁注):

在控制器中,我可以通过添加一个属性来让 _logger 工作: private readonly ILogger _logger; 并将其传递给构造函数:ILogger<MyController> logger但是在 FilterClass 中遵循与ILogger<ControllerBase> logger构造函数中相同的方法不起作用。错误与上面提到的相同。

标签: c#exceptionlogging.net-coreunhandled

解决方案


要在 .net Core 中记录任何未处理的异常,您必须创建一个异常过滤器,如下所示:

public class LogFilter : ExceptionFilterAttribute
{
    public override void OnException(ExceptionContext Context)
    {
        //Log what you need here, the exception is in Context.Exception

        Context.ExceptionHandled = true;
    }
}

并注册过滤器:

public void ConfigureServices(IServiceCollection Services)
{
    // Add framework services.
    Services.AddMvc(o =>
    {
        o.Filters.Add(new LogFilter());
    });
}

推荐阅读