Skip to content

Commit 0c12fae

Browse files
authored
Merge pull request #32 from dotnet-campus/t/walterlv/out-encoding
当 WinExe 输出时,避免控制台日志输出乱码
2 parents 9c37917 + 59ee26e commit 0c12fae

File tree

1 file changed

+36
-3
lines changed

1 file changed

+36
-3
lines changed

src/dotnetCampus.Logger/Writers/ConsoleLogger.cs

+36-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.IO;
3+
using System.Text;
34
using dotnetCampus.Logging.Writers.Helpers;
45
using C = dotnetCampus.Logging.Writers.ConsoleLoggerHelpers.ConsoleColors;
56
using B = dotnetCampus.Logging.Writers.ConsoleLoggerHelpers.ConsoleColors.Background;
@@ -16,9 +17,11 @@ public class ConsoleLogger : ILogger
1617
/// <summary>
1718
/// 控制台光标控制是否启用。目前可容纳的错误次数为 3 次,当降低到 0 次时,将不再尝试移动光标。
1819
/// </summary>
19-
private int _isCursorMovementEnabled = 3;
20+
private int _isCursorMovementEnabled;
2021

2122
private readonly RepeatLoggerDetector _repeat;
23+
private static bool _isConsoleOutput;
24+
private static readonly TextWriter Out = GetStandardOutputWriter();
2225

2326
/// <summary>
2427
/// 创建一个 <see cref="ConsoleLogger"/> 的新实例。
@@ -35,6 +38,9 @@ internal ConsoleLogger(ICoreLogWriter coreWriter, TagFilterManager? tagManager)
3538
_repeat = new RepeatLoggerDetector(ClearAndMoveToLastLine);
3639
CoreWriter = coreWriter;
3740
TagManager = tagManager;
41+
_isConsoleOutput = Out == Console.Out;
42+
// 如果输出流是自己创建的,则不支持光标移动。
43+
_isCursorMovementEnabled = _isConsoleOutput ? 3 : 0;
3844
}
3945

4046
/// <summary>
@@ -105,7 +111,14 @@ private void LogCore(LogLevel logLevel, Exception? exception, string message, Fu
105111
{
106112
if (_repeat.RepeatOrResetLastLog(logLevel, message, exception) is var count and > 1)
107113
{
108-
ConsoleMultilineMessage($"上述日志已重复 {count} 次", formatter, true);
114+
if (_isConsoleOutput)
115+
{
116+
ConsoleMultilineMessage($"上述日志已重复 {count} 次", formatter, true);
117+
}
118+
else
119+
{
120+
ConsoleMultilineMessage(message, m => $"{formatter(m)}{F.BrightBlack} (重复 {count} 次){Reset}", true);
121+
}
109122
}
110123
else if (exception is null)
111124
{
@@ -157,7 +170,7 @@ internal static void SafeWriteLine(string? message)
157170
{
158171
try
159172
{
160-
Console.WriteLine(message);
173+
Out.WriteLine(message);
161174
}
162175
catch (IOException)
163176
{
@@ -198,6 +211,26 @@ private void ClearAndMoveToLastLine(int repeatCount)
198211
}
199212
}
200213

214+
/// <summary>
215+
/// 获取标准输出的写入流。<br/>
216+
/// 如果当前在控制台中输出,则使用控制台的输出流;否则创建一个 UTF-8 编码的标准输出流。
217+
/// </summary>
218+
/// <returns>文本写入流。</returns>
219+
private static TextWriter GetStandardOutputWriter()
220+
{
221+
if (Console.OutputEncoding.CodePage is not 0)
222+
{
223+
return Console.Out;
224+
}
225+
226+
var standardOutput = Console.OpenStandardOutput();
227+
var writer = new StreamWriter(standardOutput, Encoding.UTF8)
228+
{
229+
AutoFlush = true,
230+
};
231+
return writer;
232+
}
233+
201234
private const string Reset = C.Reset;
202235
private const string TraceText = F.Magenta;
203236
private const string DebugText = F.White;

0 commit comments

Comments
 (0)