从.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 ";
            ));

其他两个格式化程序也有类似的方法:AddSystemdConsoleAddJsonConsole

可以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 返回值发生了变化

Azure Devops - 在 Nuget 包中从 .NET Core 3.1 迁移到 .NET 5 的兼容性问题

从 .NET Core 2.1 迁移到 v3.1 后出现“被 CORS 阻止”错误