【问题标题】:How can I set up log4net in dot net core to log all unhandled exceptions?如何在 dot net core 中设置 log4net 以记录所有未处理的异常?
【发布时间】:2020-09-30 13:04:26
【问题描述】:

我正在使用此处建议的实现将 log4net 添加到当前的 dot net core 项目 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 相同的方法不起作用。 错误与上面提到的相同。

【问题讨论】:

  • 这能回答你的问题吗? log4net log all unhandled application errors
  • 谢谢,但与 .net 框架相比,在 Dot net Core 中的工作方式似乎不同,我们在 dot net core 中没有 Application_Error 错误。我正在考虑...
  • 您是否尝试过调试过滤器以检查它是否被执行?
  • 你是对的。它没有被执行。但这会在 UI 中返回到我的页面:{ type: "https://tools.ietf.org/html/rfc7231#section-6.5.4", title: "Not Found", status: 404, traceId: "|a704a3ee-4d17438a72465c63." } 显示我们确实有一个错误......我想我知道为什么,检查并会更新。
  • 404 响应不是未处理的异常,是状态代码页,不会引发异常。检查这个答案:stackoverflow.com/questions/56731883/…

标签: c# exception logging .net-core unhandled


【解决方案1】:

要在 .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());
    });
}

【讨论】:

  • 谢谢!我尝试通过 _logger.LogError(Context.Exception, null); 进行日志记录不知道我做错了什么。 _logger 是从 Microsoft.Extensions.Logging 导入的 ILogger 类型的变量,
  • 这种方法还需要通过`services.AddMvc(o => { o.Filters.Add(new LogFilter(Logger)); }); `(Startup.cs中的Logger,在同一个类中也定义为:public ILogger Logger { get; })。我是不是太复杂了?
  • @Sami 不要添加类作为评论,它不可读。如果您想澄清某些问题,请对您的问题进行编辑。此外,您告诉您已尝试记录,但没有告诉您是否有问题以及发生的情况是什么问题。
猜你喜欢
  • 2018-11-02
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-26
  • 2020-11-26
相关资源
最近更新 更多