1

Is there an easy way in C# Web API to enable tracing, but only one entry per request? This entry should contain all the available information about the request - and possibly about the response as well (if at all possible).

Overriding the default trace seems to generate a LOT more of entries than is really helpful, I just want one entry per request.

EDIT:

This is what we've done so far:

  • In WebAPIConfig -> Register, the following line was added:

    config.Services.Replace(typeof(ITraceWriter), new MyAppTraceWriter());

  • The class MyAppTraceWriter has the following members and functions. The _tracer object is a Log4Net object which simply outputs to a txt file:

        public static ILog _tracer;
    
    public void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction)
    {
        _tracer = Logger.GetTracer();
    
        var rec = new TraceRecord(request, category, level);
        traceAction(rec);
        WriteTrace(rec);
    }
    
    protected void WriteTrace(TraceRecord rec)
    {
        var message = string.Format("{0};{1};{2};{3}", rec.Category, rec.Operator, rec.Operation, rec.Message);
    
        System.Diagnostics.Trace.WriteLine(message, rec.Category);
        _tracer.Info(message);
    }
    
    • Executing one HTTP DELETE method on a particular resource results in the following trace. Sorry for the wall of text, but there are 32 entries there. I would like a single entry instead per request, but with as much information as possible about the request, currently logged in user, response etc.

Trace content:

2014-07-16 01:30:24,384 [7] INFO  DevTracer [(null)] - System.Web.Http.Request;;;http://server/api/v1/courses/24744/teachers/0000000711
2014-07-16 01:30:24,386 [7] INFO  DevTracer [(null)] - System.Web.Http.MessageHandlers;CorsMessageHandler;SendAsync;
2014-07-16 01:30:24,397 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;DefaultHttpControllerSelector;SelectController;Route='MS_SubRoutes:System.Web.Http.Routing.IHttpRouteData[]'
2014-07-16 01:30:24,420 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;DefaultHttpControllerSelector;SelectController;Courses
2014-07-16 01:30:24,442 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;HttpControllerDescriptor;CreateController;
2014-07-16 01:30:24,466 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;DefaultHttpControllerActivator;Create;
2014-07-16 01:30:24,520 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;DefaultHttpControllerActivator;Create;API.Controllers.CoursesController
2014-07-16 01:30:24,544 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;HttpControllerDescriptor;CreateController;API.Controllers.CoursesController
2014-07-16 01:30:24,548 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;CoursesController;ExecuteAsync;
2014-07-16 01:30:24,559 [7] INFO  DevTracer [(null)] - System.Web.Http.Action;ApiControllerActionSelector;SelectAction;
2014-07-16 01:30:24,581 [7] INFO  DevTracer [(null)] - System.Web.Http.Action;ApiControllerActionSelector;SelectAction;Selected action 'RemoveTeacherFromCourse(Int32 courseInstanceID, String ssn)'
2014-07-16 01:30:24,614 [7] INFO  DevTracer [(null)] - System.Web.Http.ModelBinding;HttpActionBinding;ExecuteBindingAsync;
2014-07-16 01:30:24,620 [7] INFO  DevTracer [(null)] - System.Web.Http.ModelBinding;ModelBinderParameterBinding;ExecuteBindingAsync;Binding parameter 'courseInstanceID'
2014-07-16 01:30:24,664 [7] INFO  DevTracer [(null)] - System.Web.Http.ModelBinding;ModelBinderParameterBinding;ExecuteBindingAsync;Parameter 'courseInstanceID' bound to the value '24744'
2014-07-16 01:30:24,685 [7] INFO  DevTracer [(null)] - System.Web.Http.ModelBinding;ModelBinderParameterBinding;ExecuteBindingAsync;Binding parameter 'ssn'
2014-07-16 01:30:24,689 [7] INFO  DevTracer [(null)] - System.Web.Http.ModelBinding;ModelBinderParameterBinding;ExecuteBindingAsync;Parameter 'ssn' bound to the value '0000000711'
2014-07-16 01:30:24,692 [7] INFO  DevTracer [(null)] - System.Web.Http.ModelBinding;HttpActionBinding;ExecuteBindingAsync;Model state is valid. Values: courseInstanceID=24744, ssn=0000000711
2014-07-16 01:30:24,715 [7] INFO  DevTracer [(null)] - System.Web.Http.Action;ApiControllerActionInvoker;InvokeActionAsync;Action='RemoveTeacherFromCourse(courseInstanceID=24744, ssn=0000000711)'
2014-07-16 01:30:24,718 [7] INFO  DevTracer [(null)] - System.Web.Http.Action;ReflectedHttpActionDescriptor;ExecuteAsync;Invoking action 'RemoveTeacherFromCourse(courseInstanceID=24744, ssn=0000000711)'
2014-07-16 01:30:25,338 [7] INFO  DevTracer [(null)] - System.Web.Http.Action;ReflectedHttpActionDescriptor;ExecuteAsync;Action returned 'System.Web.Http.Results.OkResult'
2014-07-16 01:30:25,340 [7] INFO  DevTracer [(null)] - System.Web.Http.Action;ApiControllerActionInvoker;InvokeActionAsync;
2014-07-16 01:30:25,341 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;CoursesController;ExecuteAsync;
2014-07-16 01:30:25,371 [7] INFO  DevTracer [(null)] - System.Web.Http.Cors;AttributeBasedPolicyProviderFactory;GetCorsPolicyProvider;CorsRequestContext: 'Origin: http://server, HttpMethod: DELETE, IsPreflight: False, Host: server, AccessControlRequestMethod: null, RequestUri: http://server/api/v1/courses/24744/teachers/0000000711, AccessControlRequestHeaders: {}'
2014-07-16 01:30:25,375 [7] INFO  DevTracer [(null)] - System.Web.Http.Cors;AttributeBasedPolicyProviderFactory;GetCorsPolicyProvider;CorsPolicyProvider selected: 'System.Web.Http.Cors.EnableCorsAttribute'
2014-07-16 01:30:25,377 [7] INFO  DevTracer [(null)] - System.Web.Http.Cors;EnableCorsAttribute;GetCorsPolicyAsync;CorsRequestContext: 'Origin: http://server, HttpMethod: DELETE, IsPreflight: False, Host: server, AccessControlRequestMethod: null, RequestUri: http://server/api/v1/courses/24744/teachers/0000000711, AccessControlRequestHeaders: {}'
2014-07-16 01:30:25,382 [7] INFO  DevTracer [(null)] - System.Web.Http.Cors;EnableCorsAttribute;GetCorsPolicyAsync;CorsPolicy selected: 'AllowAnyHeader: True, AllowAnyMethod: True, AllowAnyOrigin: True, PreflightMaxAge: null, SupportsCredentials: False, Origins: {}, Methods: {}, Headers: {}, ExposedHeaders: {}'
2014-07-16 01:30:25,384 [7] INFO  DevTracer [(null)] - System.Web.Http.Cors;CorsEngine;EvaluatePolicy;
2014-07-16 01:30:25,389 [7] INFO  DevTracer [(null)] - System.Web.Http.Cors;CorsEngine;EvaluatePolicy;CorsResult returned: 'IsValid: True, AllowCredentials: False, PreflightMaxAge: null, AllowOrigin: *, AllowExposedHeaders: {}, AllowHeaders: {}, AllowMethods: {}, ErrorMessages: {}'
2014-07-16 01:30:25,392 [7] INFO  DevTracer [(null)] - System.Web.Http.MessageHandlers;CorsMessageHandler;SendAsync;
2014-07-16 01:30:25,393 [7] INFO  DevTracer [(null)] - System.Web.Http.Request;;;Content-type='none', content-length=unknown
2014-07-16 01:30:25,403 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;CoursesController;Dispose;
2014-07-16 01:30:25,404 [7] INFO  DevTracer [(null)] - System.Web.Http.Controllers;CoursesController;Dispose;
dabs
  • 727
  • 1
  • 7
  • 23
  • 1
    What have you tried that isn't working? This question is far too vague for anyone to provide a good answer. Logging or tracing is pretty simple though, so if you can provide more information about what the issue is someone can certainly help. – Justin Helgerson Jul 16 '14 at 01:55
  • You might find this useful: [Tracing in ASP.NET Web API](http://www.asp.net/web-api/overview/testing-and-debugging/tracing-in-aspnet-web-api). – djikay Jul 16 '14 at 02:43
  • I will edit my question to clarify what I've done so far. – dabs Jul 16 '14 at 09:08
  • Check this article: http://www.strathweb.com/2014/03/per-request-tracing-asp-net-web-api/ – UserControl Nov 18 '14 at 16:46

0 Answers0