从.NET Core 3.1(Docker)迁移后,.NET 6 应用程序日志为 JSON 格式 [重复]
Posted
技术标签:
【中文标题】从.NET Core 3.1(Docker)迁移后,.NET 6 应用程序日志为 JSON 格式 [重复]【英文标题】:.NET 6 Application Logs are in JSON format after migration from .NET Core 3.1 (Docker) [duplicate] 【发布时间】:2022-01-22 03:04:48 【问题描述】:我最近将我的 .NET Core REST API 从 3.1 更新到 6.0。 当我在没有 Docker 的情况下在开发或发布配置中本地运行应用程序时,日志的格式一如既往:
当应用程序作为 Docker 容器运行时,日志会转换为 JSON。这只是在迁移到 .Net 6 之后才出现的。
如何在 Docker 环境中恢复标准日志记录格式?
【问题讨论】:
自链接答案以来发生了很多变化。格式化程序类型可以通过配置或代码进行更改。每个预定义的格式化程序都有内置方法。 【参考方案1】:更改是在 .NET 5 而不是 6 中进行的。在 .NET Core 3.1 中,控制台日志格式已修复。在具有 3 个预定义格式化程序的 .NET 5 this is now customizable 中:Simple(旧的)、Systemd 和 Json(默认)。可以创建自定义格式化程序。
正如文档所示,可以通过使用 AddSimpleConsole
方法而不是 AddConsole
来使用 Simple 格式化程序:
using ILoggerFactory loggerFactory =
LoggerFactory.Create(builder =>
builder.AddSimpleConsole(options =>
options.IncludeScopes = true;
options.SingleLine = true;
options.TimestampFormat = "hh:mm:ss ";
));
其他两个格式化程序也有类似的方法:AddSystemdConsole
和 AddJsonConsole
。
可以set the formatter through configuration:
"Logging":
"LogLevel":
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,
"Console":
"LogLevel":
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
,
"FormatterName": "json",
"FormatterOptions":
"SingleLine": true,
"IncludeScopes": true,
"TimestampFormat": "HH:mm:ss ",
"UseUtcTimestamp": true,
"JsonWriterOptions":
"Indented": true
,
"AllowedHosts": "*"
最后可以通过继承ConsoleFormatter
并覆盖Write
方法来创建一个全新的格式化程序:
public sealed class CustomFormatter : ConsoleFormatter, IDisposable
...
public override void Write<TState>(
in LogEntry<TState> logEntry,
IExternalScopeProvider scopeProvider,
TextWriter textWriter)
string? message =
logEntry.Formatter?.Invoke(
logEntry.State, logEntry.Exception);
if (message is null)
return;
CustomLogicGoesHere(textWriter);
textWriter.WriteLine(message);
...
【讨论】:
以上是关于从.NET Core 3.1(Docker)迁移后,.NET 6 应用程序日志为 JSON 格式 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 .NET Core 2.2 迁移到 3.1 后,EF Core 随机抓取 API 请求上的用户表
从 Body 迁移 .NET Core 2.2 到 3.1 集成测试始终为空
迁移到 .net core 3.1 后 EF OrderBy 出现问题
为啥从 .net core 3.1 迁移到 .net 5 时 JSON 返回值发生了变化