docker - 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 日志中以正确的颜色将行写入控制台?
解决方案
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 中的错误将得到修复,您应该在将来的某个时候获得一致的体验。
推荐阅读
- amazon-web-services - 通过 REST HTTP 使用 SPARQL 查询命名图
- silverstripe - 如何在 SilverStripe 4 中通过命令行运行 BuildTask 任务?
- kedro - 如何在 Kedro 中重现实验或指定节点执行顺序?
- laravel - 有没有办法在不同的域上拥有圣所
- java - 在 Spring Cloud Gateway 配置中解析请求对象主体
- reactjs - 从 localhost:3000 上的 Keycloak 收到 403 Forbidden?
- javascript - 是否可以使用纯 JavaScript 生成视频,就像 html2canvas 可以生成图像一样?
- python - 访问字典中的列表
- flutter - 一些用户在 Flutter 上遇到 socketException
- angular - 星云步进器 NbStepper selectedIndex 不起作用(可能与 Angular 生命周期相关)