簡體   English   中英

如何在Web API中顯示文件中的所有日志

[英]How to show all logs in a file in web api

我已經使用Log4net創建了一個API通過Web API跟蹤我已經創建了一個日志文件。 但是在此文件中,僅顯示一些成功的日志。 但是我想顯示所有可能的事件,即我的日志中所有帶有line number stack trace 以下是我所做的

創建了API跟蹤器類

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());

以下是我的日志文件內容

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

我創建了一個異常/錯誤,但是它沒有顯示在我的日志文件中。 如何顯示行號在其中的所有堆棧跟蹤?

任何幫助將不勝感激。

您需要更改WriteLog方法。

在此方法中,使用了TraceRecord類,您可以從此類記錄錯誤。

查看我對這種方法的實現:

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);
    }
}

看到錯誤日志后:

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()

正如@Alexander I.所說,您必須使用不同的日志方法,例如Info(),Warn(),Error()等。

這是有關log4Net的一些有用信息的進一步鏈接:

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

對於ASP.NET Web API中的執行處理/跟蹤,您還可以使用ExceptionFilter( https://docs.microsoft.com/de-de/aspnet/web-api/overview/error-handling/web-api-global-錯誤處理 )。

異常堆棧中的行號來自PDB文件。 查看您的發行版的構建配置。 [項目屬性| Build]-> Advanced按鈕->調試信息下拉菜單

完整或僅PDB就足夠了。

如果您希望每條日志消息都有堆棧跟蹤,則可以在模式布局中使用%stacktrace甚至%stacktracedetail

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

有關更多信息,請參閱文檔

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM