简体   繁体   中英

How to show all logs in a file in web api

I have created an API .Via Web API Tracing using Log4net I have created a log file. But in this file, only some logs are shown which are successful. But I want to show all possible events ie all stack trace in my log with line number . Below is what I have done

Created an API Tracer Class

namespace ActualWebService
{
 public class MyAPITracer : ITraceWriter
 {
    private static readonly ILog log = LogManager.GetLogger(typeof(MyAPITracer));
    public void Trace(HttpRequestMessage request, string category, TraceLevel level, Action<TraceRecord> traceAction)
    {
        TraceRecord rec = new TraceRecord(request,category,level);

        traceAction(rec);

        WriteLog(rec);


    }

    private void WriteLog(TraceRecord  rec)
    {
        string strLog = string.Format("{0};{1};{3}", rec.Category,rec.Operator,rec.Operation,rec.Message);
        log.Info(strLog);

    }
}
}

Web.config

<configuration>
    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,Log4net" />        
    // other.....
   </configSections>
    <log4net>
        <root>
            <appender-ref ref="RollingFileAppender" />
        </root>
        <appender name="RollingFileAppender" type="log4net.Appender.RollingFileAppender">
            <param name="File" value="E:\MyLog\LogFile.txt" />
            <param name="AppendToFile" value="false" />
            <rollingStyle value="Composite" />
            <datePattern value="yyyyMMdd" />
            <CountDirection value="1" />
            <staticLogFileName value="true" />
            <maxSizeRollBackups value="10" />
            <maximumFileSize value="5MB" />
            <layout type="log4net.Layout.PatternLayout">
                <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %meesage%newline" />
            </layout>
        </appender>
        <logger name="ApiLog">
            <level value="ALL" />
        </logger>
    </log4net>
</configuration>

WebApiConfig.cs

log4net.Config.XmlConfigurator.Configure();

config.Services.Replace(typeof(System.Web.Http.Tracing.ITraceWriter), new MyAPITracer());

Below is my log file contents

2018-07-07 14:23:05,593 [1] INFO  ActualWebService.MyAPITracer - 
System.Web.Http.Controllers;WebHostHttpControllerTypeResolver;eesage
2018-07-07 14:23:05,614 [1] INFO  ActualWebService.MyAPITracer - 
System.Web.Http.Controllers;WebHostHttpControllerTypeResolver;eesage
2018-07-07 14:23:22,793 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Request;;http://localhost:14909/api/meters/GetByMsn/002997001022/ 
2018-07-06T11:10:43eesage
2018-07-07 14:23:22,793 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.MessageHandlers;PassiveAuthenticationMessageHandler;eesage
2018-07-07 14:23:22,803 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Controllers;DefaultHttpControllerSelector;Route='controller:meters,action:GetByMsn,msn:002997001022,dt:2018-07-06T11:10:43'eesage
2018-07-07 14:23:22,806 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Controllers;DefaultHttpControllerSelector;Meterseesage
2018-07-07 14:23:22,807 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Controllers;HttpControllerDescriptor;eesage
2018-07-07 14:23:22,808 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Controllers;DefaultHttpControllerActivator;eesage
2018-07-07 14:23:23,145 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Controllers;DefaultHttpControllerActivator;ActualWebService.Controllers.MetersControllereesage
2018-07-07 14:23:23,146 [8] INFO  ActualWebService.MyAPITracer - System.Web.Http.Controllers;HttpControllerDescriptor;ActualWebService.Controllers.MetersControllereesage

I created an exception/error but it is not shown in my log file. How can I show all of my stack trace in it with the line number?

Any help would be highly appreciated.

You need to change WriteLog method.

In this method class TraceRecord is used and you can log error from the this class.

Review my implementation of this method:

private void WriteLog(TraceRecord rec)
{
    if (rec.Exception == null)
    {
        string infoLog = string.Format("{0};{1};{3}", rec.Category, rec.Operator, rec.Operation, rec.Message);
        log.Info(infoLog);
    }
    else
    {
        string errorLog = string.Format("{0};{1};{3}", rec.Category, rec.Operator, rec.Operation, rec.Message);
        log.Error(errorLog, rec.Exception);
    }
}

After you can see Error log:

2018-07-09 14:23:44,561 [11] ERROR TestErrorLogging.MyAPITracer - System.Web.Http.Controllers;TestController;eesage
System.Exception: Test Exception
   в TestErrorLogging.Controllers.TestController.Get() в C:\Users\Александр\Desktop\TestErrorLogging\TestErrorLogging\Controllers\TestController.cs:строка 15
   в lambda_method(Closure , Object , Object[] )
   в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass10.<GetExecutor>b__9(Object instance, Object[] methodParameters)
   в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
   в System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__0.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__2.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Tracing.Tracers.HttpControllerTracer.<ExecuteAsyncCore>d__5.MoveNext()
--- Конец трассировка стека из предыдущего расположения, где возникло исключение ---
   в System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
   в System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   в System.Web.Http.Tracing.ITraceWriterExtensions.<TraceBeginEndAsyncCore>d__18`1.MoveNext()

As @Alexander I. says, you have to use the different log methods like Info(), Warn(), Error(), etc.

Here is a further link with some useful information about log4Net:

https://stackify.com/log4net-guide-dotnet-logging/

For execption handling/tracing in asp.net web api you could also use an ExceptionFilter ( https://docs.microsoft.com/de-de/aspnet/web-api/overview/error-handling/web-api-global-error-handling ).

The line numbers in your exceptions stacks are coming from the PDB files. Look at your build configuration of your release. [ Project Properties | Build ] -> Advanced button - > Debugging information dropdown

Full or PDB-only should suffice.

If you want the stack trace for every log message, you could use %stacktrace or even %stacktracedetail in your pattern layout:

<layout type="log4net.Layout.PatternLayout">
    <param name="ConversionPattern" value="%date [%thread] %-5level %logger - %message%newline%stacktrace%newline" />
</layout>

See the docs for more info.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM