Kyl*_*yle 5 json jsnlog serilog asp.net-core
我有一个使用 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
Run Code Online (Sandbox Code Playgroud)
当 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
Run Code Online (Sandbox Code Playgroud)
我不确定问题是否出在 Serilog 或 JSNLog 上,但如果有任何帮助,我们将不胜感激。
我制作了一个非常简单的示例应用程序来复制这一点。使用默认的.NET Core Web应用程序
在 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?}");
});
}
Run Code Online (Sandbox Code Playgroud)
在我的前端:
<script src="~/lib/jsnlog.js/jsnlog.min.js"></script>
<script>
JL().fatal({ testMessage: "this is an error" });
JL().fatal("this works");
</script>
Run Code Online (Sandbox Code Playgroud)
我有类似的问题。我查看了 JSNLog,问题似乎在于对日志消息中的对象进行反序列化时创建的 JSON .NET 对象的日志记录。
我做了以下解决方法:
Install-Package Destructurama.JsonNet
)然后我更改了记录器配置以包含解构:
Log.Logger = new LoggerConfiguration()
.Destructure.JsonNetTypes()
.WriteTo.Console()
.CreateLogger();
Run Code Online (Sandbox Code Playgroud)然后我创建了一个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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
并将日志更改为以下格式{@logMessage}
注意:LogMessageHelpers.DeserializeIfPossible 可以在 JSONLog GitHub存储库中找到
然后我更改了 JSNLog 配置以接受CustomLoggingAdapter
如下所示:
app.UseJSNLog(new CustomLoggingAdapter(loggerFactory), jsnlogConfiguration);
Run Code Online (Sandbox Code Playgroud)并出现日志消息。
如果有帮助请告诉我
归档时间: |
|
查看次数: |
1766 次 |
最近记录: |