Serilog / JSNLog .NET Core 日志记录空的 JSON

5
我有一个使用Serilog和JSNLog进行客户端日志记录的.NET Core项目。如果我从客户端传递JSON对象到服务器并使用Serilog记录它,那么记录的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

当我按下Ctrl+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 Core 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>
1个回答

4

我遇到了类似的问题。我看了一下JSNLog,看起来问题出在记录从日志消息反序列化出来的JSON .NET对象时。

我采取了以下解决方法:

  1. I installed the Nuget package Destructurama.JsonNet (Install-Package Destructurama.JsonNet)
  2. Then I changed the Logger configuration to include the destructuring:

    Log.Logger = new LoggerConfiguration()
            .Destructure.JsonNetTypes()
            .WriteTo.Console()
            .CreateLogger();
    
  3. I then created a CustomLoggingAdapter class like this:

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

    and changed the log to have the following format {@logMessage}

注意:LogMessageHelpers.DeserializeIfPossible可在JSONLogGitHub存储库中找到。

  1. Then I changed the JSNLog configuration to take in my CustomLoggingAdapter like this:

     app.UseJSNLog(new CustomLoggingAdapter(loggerFactory), jsnlogConfiguration);
    

日志信息已出现。

如果有帮助,请告诉我。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接