Skip to content

Commit ac0c3ad

Browse files
committed
支持 Windows 控制台主机的着色
1 parent f2f80af commit ac0c3ad

File tree

5 files changed

+69
-7
lines changed

5 files changed

+69
-7
lines changed

samples/LoggerSample.MainApp/Program.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,12 @@ public static void Main(string[] args)
3232
.Build()
3333
.IntoGlobalStaticLog();
3434

35-
Log.Trace($"Trace log");
36-
Log.Debug($"Debug log");
37-
Log.Info($"Info log");
38-
Log.Warn($"Warn log");
39-
Log.Error($"Error log");
40-
Log.Fatal($"Fatal log");
35+
Log.Trace("Trace log");
36+
Log.Debug("Debug log");
37+
Log.Info("Info log");
38+
Log.Warn("Warn log");
39+
Log.Error("Error log");
40+
Log.Fatal("Fatal log");
4141

4242
Run();
4343
Thread.Sleep(5000);
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
GetConsoleMode
2+
SetConsoleMode
3+
GetStdHandle
4+
STD_HANDLE
5+
CONSOLE_MODE

src/dotnetCampus.Logger/Writers/ConsoleLogger.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.IO;
33
using System.Text;
4+
using dotnetCampus.Logging.Writers.ConsoleLoggerHelpers;
45
using dotnetCampus.Logging.Writers.Helpers;
56
using C = dotnetCampus.Logging.Writers.ConsoleLoggerHelpers.ConsoleColors;
67
using B = dotnetCampus.Logging.Writers.ConsoleLoggerHelpers.ConsoleColors.Background;
@@ -41,6 +42,7 @@ internal ConsoleLogger(ICoreLogWriter coreWriter, TagFilterManager? tagManager)
4142
_isConsoleOutput = Out == Console.Out;
4243
// 如果输出流是自己创建的,则不支持光标移动。
4344
_isCursorMovementEnabled = _isConsoleOutput ? 3 : 0;
45+
ConsoleInitializer.Initialize();
4446
}
4547

4648
/// <summary>
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
using System;
2+
using System.Runtime.CompilerServices;
3+
using System.Runtime.InteropServices;
4+
using System.Runtime.Versioning;
5+
using static Windows.Win32.System.Console.CONSOLE_MODE;
6+
using static Windows.Win32.PInvoke;
7+
using static Windows.Win32.System.Console.STD_HANDLE;
8+
9+
namespace dotnetCampus.Logging.Writers.ConsoleLoggerHelpers;
10+
11+
internal static class ConsoleInitializer
12+
{
13+
internal static bool Initialize()
14+
{
15+
#if NET6_0_OR_GREATER
16+
// 最新的 .NET 可以在编译时判断。
17+
if (OperatingSystem.IsWindows())
18+
#elif NETFRAMEWORK
19+
// 更早版本的 .NET Framework 只能运行在 Windows 上。
20+
if (true)
21+
#else
22+
// 运行时判断。
23+
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
24+
#endif
25+
{
26+
return InitWindows();
27+
}
28+
else
29+
{
30+
return true;
31+
}
32+
}
33+
34+
#if NET6_0_OR_GREATER
35+
[SupportedOSPlatform("windows")]
36+
#endif
37+
[MethodImpl(MethodImplOptions.NoInlining)]
38+
private static bool InitWindows()
39+
{
40+
var iStdOut = GetStdHandle_SafeHandle(STD_OUTPUT_HANDLE);
41+
if (!GetConsoleMode(iStdOut, out var outConsoleMode))
42+
{
43+
return false;
44+
}
45+
46+
outConsoleMode |= ENABLE_VIRTUAL_TERMINAL_PROCESSING;
47+
if (!SetConsoleMode(iStdOut, outConsoleMode))
48+
{
49+
return false;
50+
}
51+
52+
return true;
53+
}
54+
}

src/dotnetCampus.Logger/dotnetCampus.Logger.csproj

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@
4141
<!-- Package Reference -->
4242
<ItemGroup>
4343
<PackageReference Include="dotnetCampus.LatestCSharpFeatures" Version="12.0.0" PrivateAssets="all" />
44-
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="All" />
44+
<PackageReference Include="Microsoft.SourceLink.GitHub" Version="1.0.0" PrivateAssets="all" />
45+
<PackageReference Include="Microsoft.Windows.CsWin32" Version="0.3.183" PrivateAssets="all" />
4546
</ItemGroup>
4647

4748
<ItemGroup>

0 commit comments

Comments
 (0)