首页 > 解决方案 > Console.ForegroundColor / BackgroundColor 未反映在 Docker 日志中

问题描述

我有一块日志写成:

Console.ForegroundColor = ConsoleColor.Blue;
Console.BackgroundColor = ConsoleColor.Black;
Console.WriteLine("------------------------------------------");
Console.WriteLine("Kestrel server running on ...");
...

Windows 命令行(正确):

在此处输入图像描述

Linux/Docker 日志命令行:

在此处输入图像描述

我通常只是假设 docker 日志不能被着色,但是,正如黑色背景上的黄色“警告”所示,似乎肯定有一种方法可以给日志着色,而且似乎 dotnetcore 日志记录使用的是不同的显示日志记录标签的方法(这就是它们正确着色的原因)。

如何在 docker 日志中以正确的颜色将行写入控制台?

标签: dockerlogging.net-coreconsole

解决方案


TLDR:可以说,您看到的两种行为都是错误。

颜色实际上是通过将 ANSI 转义序列发送到“终端”(或您的应用程序将输出发送到的任何地方)来实现的。这些 ANSI 转义序列只应在被写入的“终端”可以理解它们时发出。

根据您启动容器的方式和编排器是什么,您可能有也可能没有可以理解 ANSI 转义序列的终端/日志。例如,在 docker using 下运行容器docker run不会将终端附加到进程。跑步docker run -t意志。所以docker run -t应该给你完整的颜色。

ASP.NET Core 行为是一个错误

ASP.NET Core 编写 ANSI 颜色代码时不知道它们的去向。它可能是纯文本日志。或者它可能是一个花哨的终端。

例如,如果您在 kubernetes 中运行 ASP.NET Core 容器,您的日志中会出现垃圾而不是 color

�[40m�[1m�[33mwarn�[39m�[22m�[49m: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/opt/app-root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
�[40m�[1m�[33mwarn�[39m�[22m�[49m: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {2c2776a6-be46-4719-9275-b7baed6ebc3f} may be persisted to storage in unencrypted form.
�[40m�[32minfo�[39m�[22m�[49m: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:8080
�[40m�[32minfo�[39m�[22m�[49m: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
�[40m�[32minfo�[39m�[22m�[49m: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
�[40m�[32minfo�[39m�[22m�[49m: Microsoft.Hosting.Lifetime[0]
      Content root path: /opt/app-root/app

控制台行为是一个错误

另一方面,Console一旦检测到输出被重定向并且可能不会转到终端,它就会禁用颜色

这将避免输出中的垃圾。所以不会造成伤害。

但是正如您所看到的,即使您(大概?我不确定)运行附加到终端的应用程序,您的日志中也没有颜色。

你能做什么?

你现在真的需要颜色吗?

如果是这样,您可以手动发出 ANSI 转义序列。在此处查看 ASP.NET Core 实现

从长远来看,这可能不是一个好主意。.NET Core 中的错误将得到修复,您应该在将来的某个时候获得一致的体验。


推荐阅读