Console.ForegroundColor / BackgroundColor 未反映在 Docker 日志中
Console.ForegroundColor / BackgroundColor not reflected in Docker log
我有一段日志写成:
Console.ForegroundColor = ConsoleColor.Blue;
Console.BackgroundColor = ConsoleColor.Black;
Console.WriteLine("------------------------------------------");
Console.WriteLine("Kestrel server running on ...");
...
Windows命令行(正确):
Linux/Docker 登录命令行:
我通常只是假设 docker 日志不能被着色,但是,正如黑色背景上的黄色 "warn" 所证明的那样,似乎肯定有一种方法可以使日志着色,并且似乎 dotnetcore 日志记录正在使用不同的方法来显示日志记录标签(这就是它们被正确着色的原因)。
我如何才能在 docker 日志中以正确的颜色向控制台写入行?
TLDR:可以说,您看到的两种行为都是错误。
颜色实际上是通过将 ANSI 转义序列发送到 "terminal"(或您的应用程序将输出发送到的任何地方)来实现的。这些 ANSI 转义序列只应在正在写入的 "terminal" 可以理解它们时发出。
根据您启动容器的方式以及您的编排器是什么,您可能有也可能没有可以理解 ANSI 转义序列的 terminal/log。例如,运行使用 docker run
在 docker 下安装容器不会将终端附加到进程。 运行 docker run -t
会的。所以docker run -t
应该给你全彩。
ASP.NET 核心行为是一个错误
ASP.NET Core 编写 ANSI 颜色代码时完全不知道它们要去哪里。它可能是纯文本日志。或者它可能是一个花哨的终端。
如果你 运行 你的 ASP.NET kubernetes 中的核心容器,例如,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 中的错误将被修复,您应该在未来的某个时候获得一致的体验。
post 跟进 ,以防对其他人有用:
从 .dotnet 5 开始,SimpleConsoleFormatterOptions, taking the value of Default
, Disabled
or Enabled
(from the LoggerColorBehavior enum)
上有一个 ColorBehavior 选项
Default
将自动检测控制台是否正在重定向,如果是则关闭颜色(这导致颜色无法在 Docker 为我撰写时显示),但是 Enabled
将始终输出 ANSI 颜色代码,Disabled
将禁用它们。
如果您像这样使用 loggingBuilder.AddConsole()
行来设置您的记录器:
builder.Host.ConfigureLogging((_, loggingBuilder) =>
{
loggingBuilder.AddConsole();
});
然后可以在您的设置中配置此设置,如下所示。更多信息位于 this link.
{
"Logging": {
"Console": {
"FormatterName": "simple",
"FormatterOptions": {
"ColorBehavior": "Enabled",
}
}
}
}
我有一段日志写成:
Console.ForegroundColor = ConsoleColor.Blue;
Console.BackgroundColor = ConsoleColor.Black;
Console.WriteLine("------------------------------------------");
Console.WriteLine("Kestrel server running on ...");
...
Windows命令行(正确):
Linux/Docker 登录命令行:
我通常只是假设 docker 日志不能被着色,但是,正如黑色背景上的黄色 "warn" 所证明的那样,似乎肯定有一种方法可以使日志着色,并且似乎 dotnetcore 日志记录正在使用不同的方法来显示日志记录标签(这就是它们被正确着色的原因)。
我如何才能在 docker 日志中以正确的颜色向控制台写入行?
TLDR:可以说,您看到的两种行为都是错误。
颜色实际上是通过将 ANSI 转义序列发送到 "terminal"(或您的应用程序将输出发送到的任何地方)来实现的。这些 ANSI 转义序列只应在正在写入的 "terminal" 可以理解它们时发出。
根据您启动容器的方式以及您的编排器是什么,您可能有也可能没有可以理解 ANSI 转义序列的 terminal/log。例如,运行使用 docker run
在 docker 下安装容器不会将终端附加到进程。 运行 docker run -t
会的。所以docker run -t
应该给你全彩。
ASP.NET 核心行为是一个错误
ASP.NET Core 编写 ANSI 颜色代码时完全不知道它们要去哪里。它可能是纯文本日志。或者它可能是一个花哨的终端。
如果你 运行 你的 ASP.NET kubernetes 中的核心容器,例如,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 中的错误将被修复,您应该在未来的某个时候获得一致的体验。
post 跟进
从 .dotnet 5 开始,SimpleConsoleFormatterOptions, taking the value of Default
, Disabled
or Enabled
(from the LoggerColorBehavior enum)
Default
将自动检测控制台是否正在重定向,如果是则关闭颜色(这导致颜色无法在 Docker 为我撰写时显示),但是 Enabled
将始终输出 ANSI 颜色代码,Disabled
将禁用它们。
如果您像这样使用 loggingBuilder.AddConsole()
行来设置您的记录器:
builder.Host.ConfigureLogging((_, loggingBuilder) =>
{
loggingBuilder.AddConsole();
});
然后可以在您的设置中配置此设置,如下所示。更多信息位于 this link.
{
"Logging": {
"Console": {
"FormatterName": "simple",
"FormatterOptions": {
"ColorBehavior": "Enabled",
}
}
}
}