Skip to content

Commit fc06513

Browse files
authored
Merge pull request #189 from AlanLiu90/Branch_FixConsole
Fix thread safe issue about console output
2 parents 395235e + 3f0bfed commit fc06513

File tree

2 files changed

+13
-22
lines changed

2 files changed

+13
-22
lines changed

src/ZLogger/AsyncStreamLineMessageWriter.cs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,8 @@ public sealed class AsyncStreamLineMessageWriter : IAsyncLogProcessor, IAsyncDis
1717
readonly Channel<IZLoggerEntry> channel;
1818
readonly Task writeLoop;
1919
readonly ZLoggerOptions options;
20-
readonly Func<LogLevel, bool>? levelFilter;
21-
22-
public AsyncStreamLineMessageWriter(Stream stream, ZLoggerOptions options)
23-
: this(stream, options, null)
24-
{
25-
}
2620

27-
// handling `Func<LogLevel, bool>? levelFilter` correctly is very context dependent.
28-
// so only allows internal provider.
29-
internal AsyncStreamLineMessageWriter(Stream stream, ZLoggerOptions options, Func<LogLevel, bool>? levelFilter = null)
21+
public AsyncStreamLineMessageWriter(Stream stream, ZLoggerOptions options)
3022
{
3123
this.newLine = Encoding.UTF8.GetBytes(Environment.NewLine);
3224
if (newLine.Length == 1)
@@ -46,7 +38,6 @@ internal AsyncStreamLineMessageWriter(Stream stream, ZLoggerOptions options, Fun
4638

4739
this.options = options;
4840
this.stream = stream;
49-
this.levelFilter = levelFilter;
5041

5142
channel = this.options.FullMode switch
5243
{
@@ -121,7 +112,6 @@ async Task WriteLoop()
121112
var writer = new StreamBufferWriter(stream);
122113
var formatter = options.CreateFormatter();
123114
var withLineBreak = formatter.WithLineBreak;
124-
var requireFilterCheck = levelFilter != null;
125115
var reader = channel.Reader;
126116

127117
while (await reader.WaitToReadAsync().ConfigureAwait(false))
@@ -130,10 +120,6 @@ async Task WriteLoop()
130120
{
131121
while (reader.TryRead(out var value))
132122
{
133-
if (requireFilterCheck && levelFilter!.Invoke(value.LogInfo.LogLevel) == false)
134-
{
135-
continue;
136-
}
137123
try
138124
{
139125
value.FormatUtf8(writer, formatter);

src/ZLogger/Providers/ZLoggerConsoleLoggerProvider.cs

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ public ZLoggerConsoleLoggerProvider(ZLoggerConsoleOptions options)
2727
{
2828
var logToStandardErrorThreshold = options.LogToStandardErrorThreshold;
2929
processor = new DualAsyncLogProcessor(
30-
new AsyncStreamLineMessageWriter(Console.OpenStandardOutput(), this.options, level => level < logToStandardErrorThreshold),
31-
new AsyncStreamLineMessageWriter(Console.OpenStandardError(), this.options, level => level >= logToStandardErrorThreshold));
30+
new AsyncStreamLineMessageWriter(Console.OpenStandardOutput(), this.options),
31+
new AsyncStreamLineMessageWriter(Console.OpenStandardError(), this.options),
32+
level => level < logToStandardErrorThreshold);
3233
}
3334
}
3435

@@ -52,14 +53,18 @@ public void SetScopeProvider(IExternalScopeProvider scopeProvider)
5253
this.scopeProvider = scopeProvider;
5354
}
5455

55-
sealed class DualAsyncLogProcessor(AsyncStreamLineMessageWriter processor1, AsyncStreamLineMessageWriter processor2) : IAsyncLogProcessor
56+
sealed class DualAsyncLogProcessor(AsyncStreamLineMessageWriter processor1, AsyncStreamLineMessageWriter processor2, Func<LogLevel, bool> levelFilter) : IAsyncLogProcessor
5657
{
5758
public void Post(IZLoggerEntry log)
5859
{
59-
// Post two entry is dangerous for log-state reference count cache.
60-
// However filtered reader-loop does not call Return so ok to post multiple.
61-
processor1.Post(log);
62-
processor2.Post(log);
60+
if (levelFilter(log.LogInfo.LogLevel))
61+
{
62+
processor1.Post(log);
63+
}
64+
else
65+
{
66+
processor2.Post(log);
67+
}
6368
}
6469

6570
public async ValueTask DisposeAsync()

0 commit comments

Comments
 (0)