2017-08-17 55 views
2

我有一个使用Serilog和JSNLog进行客户端日志记录的.NET Core项目。如果我将JSON对象从客户端传递到服务器并使用Serilog进行登录,则记录的JSON对象为空。Serilog/JSNLog .NET Core日志空JSON

很奇怪的是,如果我有附加调试器时,JSON记录的罚款。

例如:

在调试,我得到:

[11:00:01 FTL] this works 
[11:00:02 INF] Request finished in 342.1967ms 200 text/plain 
[11:00:02 FTL] "testMessage": "this is an error" 
[11:00:02 INF] Request finished in 374.7837ms 200 text/plain 

当键Crtl + F5,我得到:

[10:59:14 FTL] this works 
[10:59:14 INF] Request finished in 253.3403ms 200 text/plain 
[10:59:15 FTL] [[[]]] 
[10:59:15 INF] Request finished in 267.2553ms 200 text/plain 

我不知道问题是否与Serilog或JSNLog ,但任何帮助将不胜感激。

我已经做了一个非常简单的示例应用程序来复制这个。使用默认的.NET核心的webapp

依赖关系,如下所示: Dependencies

在Startup.cs

public Startup(IHostingEnvironment env) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
       .AddEnvironmentVariables(); 
      Configuration = builder.Build(); 

      Log.Logger = new LoggerConfiguration() 
       .WriteTo.Console().CreateLogger(); 
     } 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
     { 
      loggerFactory.AddSerilog(); 

      if (env.IsDevelopment()) 
      { 
       app.UseDeveloperExceptionPage(); 
       app.UseBrowserLink(); 
      } 
      else 
      { 
       app.UseExceptionHandler("/Home/Error"); 
      } 

      app.UseJSNLog(new LoggingAdapter(loggerFactory)); 

      app.UseStaticFiles(); 

      app.UseMvc(routes => 
      { 
       routes.MapRoute(
        name: "default", 
        template: "{controller=Home}/{action=Index}/{id?}"); 
      }); 
} 

在我的前端:

<script src="~/lib/jsnlog.js/jsnlog.min.js"></script> 
    <script> 
      JL().fatal({ testMessage: "this is an error" }); 
      JL().fatal("this works"); 
     </script> 

回答

0

我有一个类似的问题。我看了一下JSNLog,看起来问题在于记录从日志消息中删除对象时创建的JSON .NET对象。

我做了以下解决方法:

  1. 我安装NuGet包Destructurama.JsonNetInstall-Package Destructurama.JsonNet
  2. 然后,我改变记录仪配置以包括解构:

    Log.Logger = new LoggerConfiguration() 
         .Destructure.JsonNetTypes() 
         .WriteTo.Console() 
         .CreateLogger(); 
    
  3. 然后我创建了这样一个CustomLoggingAdapter类:

    public class CustomLoggingAdapter: ILoggingAdapter 
    { 
        private ILoggerFactory _loggerFactory; 
    
        public CustomLoggingAdapter(ILoggerFactory loggerFactory) 
        { 
         _loggerFactory = loggerFactory; 
        } 
    
        public void Log(FinalLogData finalLogData) 
        { 
         ILogger logger = _loggerFactory.CreateLogger(finalLogData.FinalLogger); 
    
         Object message = LogMessageHelpers.DeserializeIfPossible(finalLogData.FinalMessage); 
    
         switch (finalLogData.FinalLevel) 
         { 
          case Level.TRACE: logger.LogTrace("{@logMessage}", message); break; 
          case Level.DEBUG: logger.LogDebug("{@logMessage}", message); break; 
          case Level.INFO: logger.LogInformation("{@logMessage}", message); break; 
          case Level.WARN: logger.LogWarning("{@logMessage}", message); break; 
          case Level.ERROR: logger.LogError("{@logMessage}", message); break; 
          case Level.FATAL: logger.LogCritical("{@logMessage}", message); break; 
         } 
        } 
    } 
    

    和改变日志以具有以下格式{@logMessage}

注:LogMessageHelpers.DeserializeIfPossible可以在JSONLog GitHub回购找到

  • 然后我改变了JSNLog的配置,在我的CustomLoggingAdapter这样做:

    app.UseJSNLog(new CustomLoggingAdapter(loggerFactory), jsnlogConfiguration); 
    
  • 并且出现日志消息。

    让我知道是否有帮助