Skip to content

Commit 0037e54

Browse files
authored
Merge pull request #34 from dotnet-campus/t/walterlv/support-windows-console-host
支持 Windows 控制台主机的着色
2 parents 9e1814d + ac0c3ad commit 0037e54

File tree

6 files changed

+124
-55
lines changed

6 files changed

+124
-55
lines changed

samples/LoggerSample.MainApp/Program.cs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public static void Main(string[] args)
2323
.WithLevel(LogLevel.Information)
2424
.WithOptions(new LogOptions
2525
{
26-
LogLevel = LogLevel.Debug,
26+
LogLevel = LogLevel.Trace,
2727
})
2828
.AddConsoleLogger(b => b
2929
.WithThreadSafe(LogWritingThreadMode.ProducerConsumer)
@@ -32,20 +32,27 @@ 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");
41+
3542
Run();
3643
Thread.Sleep(5000);
3744
}
3845

3946
private static void Run()
4047
{
4148
var stopwatch = Stopwatch.StartNew();
42-
Log.Debug($"[TEST] 开始 {stopwatch.ElapsedMilliseconds}ms");
49+
Log.Info($"[TEST] 开始 {stopwatch.ElapsedMilliseconds}ms");
4350
Parallel.For(0, 0x00004000, i =>
4451
{
4552
Thread.Sleep(0);
46-
Log.Debug($"[TEST] {DateTime.Now:HH:mm:ss}");
53+
Log.Info($"[TEST] {DateTime.Now:HH:mm:ss}");
4754
});
48-
Log.Debug($"[TEST] 完成 {stopwatch.ElapsedMilliseconds}ms");
55+
Log.Info($"[TEST] 完成 {stopwatch.ElapsedMilliseconds}ms");
4956
}
5057
}
5158

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: 11 additions & 9 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>
@@ -232,19 +234,19 @@ private static TextWriter GetStandardOutputWriter()
232234
}
233235

234236
private const string Reset = C.Reset;
235-
private const string TraceText = F.Magenta;
236-
private const string DebugText = F.White;
237-
private const string InformationText = F.Green + D.Bold;
237+
private const string TraceText = F.BrightBlack;
238+
private const string DebugText = F.Magenta;
239+
private const string InformationText = F.White;
238240
private const string WarningText = F.Yellow;
239-
private const string ErrorText = F.BrightRed;
240-
private const string CriticalText = F.Red;
241+
private const string ErrorText = F.Red;
242+
private const string CriticalText = $"{B.Red}{F.Black}";
241243

242-
private static string TraceTag => $"{B.Magenta}{F.White}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
243-
private static string DebugTag => $"{B.BrightBlack}{F.White}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
244+
private static string TraceTag => $"{F.BrightBlack}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
245+
private static string DebugTag => $"{F.Magenta}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
244246
private static string InformationTag => $"{B.Green}{F.Black}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
245247
private static string WarningTag => $"{B.Yellow}{F.Black}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
246-
private static string ErrorTag => $"{B.BrightRed}{F.Black}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
247-
private static string CriticalTag => $"{B.Red}{F.Black}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
248+
private static string ErrorTag => $"{B.Red}{F.Black}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
249+
private static string CriticalTag => $"{B.Black}{D.Bold}{F.Red}[{DateTime.Now:HH:mm:ss.fff}]{Reset}";
248250

249251
private static string WarningExceptionTag => $"{B.Yellow}{F.Black} ! {Reset}{WarningText} ";
250252
private static string ErrorExceptionTag => $"{B.BrightRed}{F.Black} X {Reset}{ErrorText} ";

src/dotnetCampus.Logger/Writers/ConsoleLoggerHelpers/ConsoleColors.cs

Lines changed: 41 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -5,28 +5,28 @@
55
/// </summary>
66
internal static class ConsoleColors
77
{
8-
public const string Reset = "\u001b[0m";
8+
public const string Reset = "\e[0m";
99

1010
public static class Foreground
1111
{
1212
#region 4-bit colors
1313

14-
public const string Black = "\u001b[30m";
15-
public const string Red = "\u001b[31m";
16-
public const string Green = "\u001b[32m";
17-
public const string Yellow = "\u001b[33m";
18-
public const string Blue = "\u001b[34m";
19-
public const string Magenta = "\u001b[35m";
20-
public const string Cyan = "\u001b[36m";
21-
public const string White = "\u001b[37m";
22-
public const string BrightBlack = "\u001b[90m";
23-
public const string BrightRed = "\u001b[91m";
24-
public const string BrightGreen = "\u001b[92m";
25-
public const string BrightYellow = "\u001b[93m";
26-
public const string BrightBlue = "\u001b[94m";
27-
public const string BrightMagenta = "\u001b[95m";
28-
public const string BrightCyan = "\u001b[96m";
29-
public const string BrightWhite = "\u001b[97m";
14+
public const string Black = "\e[30m";
15+
public const string Red = "\e[31m";
16+
public const string Green = "\e[32m";
17+
public const string Yellow = "\e[33m";
18+
public const string Blue = "\e[34m";
19+
public const string Magenta = "\e[35m";
20+
public const string Cyan = "\e[36m";
21+
public const string White = "\e[37m";
22+
public const string BrightBlack = "\e[90m";
23+
public const string BrightRed = "\e[91m";
24+
public const string BrightGreen = "\e[92m";
25+
public const string BrightYellow = "\e[93m";
26+
public const string BrightBlue = "\e[94m";
27+
public const string BrightMagenta = "\e[95m";
28+
public const string BrightCyan = "\e[96m";
29+
public const string BrightWhite = "\e[97m";
3030

3131
#endregion
3232
}
@@ -35,35 +35,35 @@ public static class Background
3535
{
3636
#region 4-bit colors
3737

38-
public const string Black = "\u001b[40m";
39-
public const string Red = "\u001b[41m";
40-
public const string Green = "\u001b[42m";
41-
public const string Yellow = "\u001b[43m";
42-
public const string Blue = "\u001b[44m";
43-
public const string Magenta = "\u001b[45m";
44-
public const string Cyan = "\u001b[46m";
45-
public const string White = "\u001b[47m";
46-
public const string BrightBlack = "\u001b[100m";
47-
public const string BrightRed = "\u001b[101m";
48-
public const string BrightGreen = "\u001b[102m";
49-
public const string BrightYellow = "\u001b[103m";
50-
public const string BrightBlue = "\u001b[104m";
51-
public const string BrightMagenta = "\u001b[105m";
52-
public const string BrightCyan = "\u001b[106m";
53-
public const string BrightWhite = "\u001b[107m";
38+
public const string Black = "\e[40m";
39+
public const string Red = "\e[41m";
40+
public const string Green = "\e[42m";
41+
public const string Yellow = "\e[43m";
42+
public const string Blue = "\e[44m";
43+
public const string Magenta = "\e[45m";
44+
public const string Cyan = "\e[46m";
45+
public const string White = "\e[47m";
46+
public const string BrightBlack = "\e[100m";
47+
public const string BrightRed = "\e[101m";
48+
public const string BrightGreen = "\e[102m";
49+
public const string BrightYellow = "\e[103m";
50+
public const string BrightBlue = "\e[104m";
51+
public const string BrightMagenta = "\e[105m";
52+
public const string BrightCyan = "\e[106m";
53+
public const string BrightWhite = "\e[107m";
5454

5555
#endregion
5656
}
5757

5858
public static class Decoration
5959
{
60-
public const string Bold = "\u001b[1m";
61-
public const string Dim = "\u001b[2m";
62-
public const string Italic = "\u001b[3m";
63-
public const string Underline = "\u001b[4m";
64-
public const string Blink = "\u001b[5m";
65-
public const string Reverse = "\u001b[7m";
66-
public const string Hidden = "\u001b[8m";
67-
public const string Strikethrough = "\u001b[9m";
60+
public const string Bold = "\e[1m";
61+
public const string Dim = "\e[2m";
62+
public const string Italic = "\e[3m";
63+
public const string Underline = "\e[4m";
64+
public const string Blink = "\e[5m";
65+
public const string Reverse = "\e[7m";
66+
public const string Hidden = "\e[8m";
67+
public const string Strikethrough = "\e[9m";
6868
}
6969
}
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)