public override void OnActionExecuted(HttpActionExecutedContext context) { base.OnActionExecuted(context); var stopwatch = (Stopwatch)context.Request.Properties[StopwatchKey]; var apiAccessEvent = new ApiAccessEvent(context.Request, context.Response, stopwatch.ElapsedMilliseconds); var statusCode = context.Response?.StatusCode; var isSuccess = context.Response != null && context.Response.IsSuccessStatusCode; var isWarning = !isSuccess && statusCode.HasValue && statusCode != HttpStatusCode.InternalServerError; if (isSuccess) { Log.Debug("Api successful access: {@ApiAccess}", apiAccessEvent); } else { var exception = GetHandledException(context); if (isWarning) { Log.Warning(exception, "Api unsuccessful access: {@ApiAccess}", apiAccessEvent); } else { Log.Error(exception, "Api error: {@ApiAccess}", apiAccessEvent); } } }
public async Task Invoke(HttpContext httpContext, ILogger <ApiAccessLoggingMiddleware> logger) { try { var start = Stopwatch.GetTimestamp(); await requestDelegate(httpContext); var elapsed = GetElapsedMilliseconds(start, Stopwatch.GetTimestamp()); var apiAccessEvent = new ApiAccessEvent(httpContext.Request, httpContext.Response, elapsed); var statusCode = httpContext.Response?.StatusCode; var level = LogLevel.Warning; if (statusCode == null || statusCode > 499) { level = LogLevel.Error; } else if (statusCode >= 200 && statusCode <= 299) { level = LogLevel.Debug; } Exception exception; switch (level) { case LogLevel.Error: exception = GetHandledException(httpContext); logger.LogError(exception, "Api error: {@ApiAccess}", apiAccessEvent); break; case LogLevel.Warning: exception = GetHandledException(httpContext); logger.LogWarning(exception, "Api unsuccessful access: {@ApiAccess}", apiAccessEvent); break; case LogLevel.Debug: logger.LogDebug("Api successful access: {@ApiAccess}", apiAccessEvent); break; } } catch (Exception e) { Console.WriteLine(e); throw; } }