Skip to main content
 首页 » 编程设计

c#之如何在 web api 中显示文件中的所有日志

2024年02月04日30lovecherry

我已经创建了一个API。通过Web API Tracing using Log4net我创建了一个日志文件。但是在这个文件中,只显示了一些成功的日志。但我想在我的日志中显示所有可能的事件,即所有 stack trace 和 line number。以下是我所做的

创建了一个 API Tracer 类

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