使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?

Posted

技术标签:

【中文标题】使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?【英文标题】:Global exception handling in ASP.NET Web API 2.1 with NLog? 【发布时间】:2014-11-10 00:23:39 【问题描述】:

ASP.NET Web API 2.1 包含一个新的global error handling 功能。我找到了一个example,它演示了如何将异常记录到 ELMAH 中。但我使用NLog 将错误记录到数据库表中。是否可以在 NLog 中使用 Web API 全局错误处理?如果有,请举个例子。

【问题讨论】:

【参考方案1】:

其实很简单,要么手动实现IExceptionLogger,要么继承基类ExceptionLogger

public class NLogExceptionLogger : ExceptionLogger

    private static readonly Logger Nlog = LogManager.GetCurrentClassLogger();
    public override void Log(ExceptionLoggerContext context)
    
        Nlog.LogException(LogLevel.Error, RequestToString(context.Request), context.Exception);
    

    private static string RequestToString(HttpRequestMessage request)
    
        var message = new StringBuilder();
        if (request.Method != null)
            message.Append(request.Method);

        if (request.RequestUri != null)
            message.Append(" ").Append(request.RequestUri);

        return message.ToString();
    

也将其添加到配置中:

var config = new HttpConfiguration(); 

config.Services.Add(typeof(IExceptionLogger), new NLogExceptionLogger()); 

您可以找到完整的示例解决方案here。

【讨论】:

是否有可能以某种方式使用 ExceptionLoggerContext(可能是 .ExceptionContext.ControllerContext.GetType())来获取特定于控制器的记录器?这将使我们能够(通过 Nlog.config)打开/关闭每个控制器的异常日志记录。上面的记录器是使用 GetCurrentClassLogger 的实例化器,这意味着无法区分每个控制器的日志事件,对吧? 这个异常记录虽然,异常处理不仅仅是记录它。例如,您想向客户端返回一条带有适当友好错误的统一消息。这种模式是否涵盖了这一点? @SonicSoul 此要求与记录器任务无关。只需实现 IHttpActionResult 接口并返回一个不错的 StringContent 消息。 @EmilG 为什么要记录特定于控制器的异常?只需实现全局作用的 ExceptionLogger 类(web api 2.2) @Pascal:控制器特定的异常日志记录对我来说很有用,因为某些控制器比其他控制器更重要。假设我有 AccountController 和 StatisticsController。在这种情况下,来自 AccountController 的异常更重要(并且应该进行特定的异常处理),因为此类异常可能意味着用户无法登录,而 StatisticsController 中发生的异常并不那么重要。【参考方案2】:

其他可能很方便的WebApiContrib.Tracing.NLog 包,允许您使用 ITraceWriter 接口通过 NLog 输出到日志。 ITraceWriter 的一个很酷的地方是“所有跟踪都可以与导致该代码运行的单个请求相关联(请参阅this link)

【讨论】:

以上是关于使用 NLog 在 ASP.NET Web API 2.1 中进行全局异常处理?的主要内容,如果未能解决你的问题,请参考以下文章

为每个 Logger 实例动态设置 Nlog 日志级别 ASP.Net Core 2.x

在 ASP.NET Core 应用程序中使用 NLog

ASP.NET Core 使用NLog打印html格式日志

ASP.NET Core使用NLog记录日志

与 Azure Application Insights、ASP.NET MVC 和 NLog 的活动关联

ASP.NET Core根据环境切换NLog配置