首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Serilog / JSNLog .NET核心日志记录空JSON

Serilog / JSNLog .NET核心日志记录空JSON
EN

Stack Overflow用户
提问于 2017-08-17 15:02:53
回答 1查看 1.5K关注 0票数 4

我有一个使用Serilog和JSNLog进行客户端日志记录的JSNLog核心项目。如果我将一个JSON对象从客户机传递到服务器,并使用Serilog对其进行记录,则日志记录的JSON对象是空的。

非常奇怪的问题是,如果我附加了调试器,那么JSON就会记录得很好。

例如:

在调试时,我得到:

代码语言:javascript
复制
[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我得到:

代码语言:javascript
复制
[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应用程序

依赖关系如下所示:

在Startup.cs中:

代码语言:javascript
复制
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?}");
            });
}

在我的前端:

代码语言:javascript
复制
<script src="~/lib/jsnlog.js/jsnlog.min.js"></script>
    <script>
            JL().fatal({ testMessage: "this is an error" });
            JL().fatal("this works");
        </script>
EN

回答 1

Stack Overflow用户

发布于 2018-01-24 22:43:14

我也有过类似的问题。我看了一下JSNLog,问题似乎是在从日志消息中对对象进行反序列化时创建的JSNLog对象的日志记录。

我做了以下解决办法:

  1. 我安装了Nuget软件包Destructurama.JsonNet (Install-Package Destructurama.JsonNet)
  2. 然后,我更改了Logger配置,以包括析构: Log.Logger =新的LoggerConfiguration() .Destructure.JsonNetTypes() .WriteTo.Console() .CreateLogger();
  3. 然后我创建了一个CustomLoggingAdapter类,如下所示: 公共类_loggerFactory.CreateLogger(finalLogData.FinalLogger);CustomLoggingAdapter: ILoggingAdapter {私有ILoggerFactory _loggerFactory;public CustomLoggingAdapter(ILoggerFactory loggerFactory) { _loggerFactory = loggerFactory;} public void (FinalLogData finalLogData) { ILogger logger = LogMessageHelpers.DeserializeIfPossible(finalLogData.FinalMessage);Object message =LogMessageHelpers.DeserializeIfPossible(finalLogData.FinalMessage);switch (finalLogData.FinalLevel) { case Level.TRACE: logger.LogTrace("{@logMessage}",message);Level.DEBUG: logger.LogDebug("{@logMessage}",message);Level.INFO: logger.LogInformation("{@logMessage}",message);logger.LogInformation;case Level.WARN: logger.LogWarning(“{@logMessage},message”);logger.LogWarning;case Level.ERROR: logger.LogError("{@logMessage}",message);案例Level.FATAL: logger.LogCritical("{@logMessage}",消息);断开;} 并将日志更改为具有以下格式的{@logMessage}

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

  1. 然后,我将JSNLog配置更改为接受CustomLoggingAdapter,如下所示: App.UseJSNLog(新CustomLoggingAdapter(loggerFactory),jsnlogConfiguration);

日志信息出现了。

如果这有帮助,请告诉我。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45738682

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档