我有一 block 日志写为:
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 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
控制台行为是一个错误
这将避免输出中出现垃圾。所以不会造成伤害。
但正如您所看到的,即使您(大概?我不确定)运行连接到终端的应用程序,您的日志中也看不到任何颜色。
你能做什么?
您现在真的需要颜色吗?
如果是这样,您可以手动发出 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/