Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用NLog的ASP.NET Web API 2.1中的全局异常处理?_C#_Asp.net_Asp.net Web Api_Error Handling_Nlog - Fatal编程技术网

C# 使用NLog的ASP.NET Web API 2.1中的全局异常处理?

C# 使用NLog的ASP.NET Web API 2.1中的全局异常处理?,c#,asp.net,asp.net-web-api,error-handling,nlog,C#,Asp.net,Asp.net Web Api,Error Handling,Nlog,ASP.NET Web API 2.1包含一个新功能。我发现了一个演示如何将异常记录到ELMAH的工具。但是我使用日志将错误记录到数据库表中。是否可以对NLog使用Web API全局错误处理?如果是这样,请提供一个示例。实际上非常简单,您可以手动实现IEExceptionLogger,也可以从基类ExceptionLogger继承 public class NLogExceptionLogger : ExceptionLogger { private static readonly Lo

ASP.NET Web API 2.1包含一个新功能。我发现了一个演示如何将异常记录到ELMAH的工具。但是我使用日志将错误记录到数据库表中。是否可以对NLog使用Web API全局错误处理?如果是这样,请提供一个示例。

实际上非常简单,您可以手动实现
IEExceptionLogger
,也可以从基类
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()); 

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

另一个可能很方便的包,它允许您使用ITraceWriter接口将NLog输出到日志。ITraceWriter的一个很酷的地方是“所有跟踪都可以关联到导致代码运行的单个请求(请参见)

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