docker - Console.ForegroundColor/BackgroundColor 未反射(reflect)在 Docker 日志中

标签 docker logging .net-core console

我有一 block 日志写为:

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

Windows 命令行(正确):

enter image description here

Linux/Docker 日志命令行:

enter image description here

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

如何将行写入控制台并在 Docker 日志中显示正确的颜色?

最佳答案

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

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

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

ASP.NET Core 行为是一个错误

ASP.NET Core 编写 ANSI 颜色代码,但不了解它们的去向。它可能是纯文本日志。或者它可能是一个奇特的终端。

如果您在 kubernetes 中运行 ASP.NET Core 容器,例如 you get garbage in your logs instead of colour :

�[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 disables colours as soon as it detects that the output is being redirected and may not go to a terminal .

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

但正如您所看到的,即使您(大概?我不确定)运行连接到终端的应用程序,您的日志中也看不到任何颜色。

你能做什么?

您现在真的需要颜色吗?

如果是这样,您可以手动发出 ANSI 转义序列。 Take a look at the ASP.NET Core implementation here .

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

关于docker - Console.ForegroundColor/BackgroundColor 未反射(reflect)在 Docker 日志中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62312944/

相关文章:

docker - 如何从特权容器访问 docker 主机文件系统

docker - 为什么我必须删除 docker 容器?

java - 是否可以在命令行上配置 logback 记录器级别?

c# - 动态链接库,解决方案无法加载程序集

docker - 构建参数未解决

java - 在 Docker 中运行 Selenium 找不到 geckodrvier.exe

java - 防止 Tomcat 日志记录转到 stderr?

python - 从 python 日志记录中捕获 "Out of memory error"

c# - asp.net core razor pages 支持删除和放置请求

visual-studio - 通过 visual studio 2017 中的 postbuild 事件构建 .net 核心项目