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.