Skip to content

Commit 88e36ff

Browse files
committed
add locking-logger-target for improved thread-safe logging
1 parent b879252 commit 88e36ff

File tree

3 files changed

+47
-40
lines changed

3 files changed

+47
-40
lines changed

Sources/Falko.ZeroLogger/Builders/LoggerContextBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public LoggerContextBuilder AddTarget(ILogContextRenderer renderer, LoggerTarget
2626
ArgumentNullException.ThrowIfNull(renderer, nameof(renderer));
2727
ArgumentNullException.ThrowIfNull(target, nameof(target));
2828

29-
if (target.RequiresSynchronization) target = new LockLoggerTarget(target);
29+
if (target.RequiresSynchronization) target = new LockingLoggerTarget(target);
3030

3131
_targetPairs.Add(new KeyValuePair<ILogContextRenderer, LoggerTarget>(renderer, target));
3232

Sources/Falko.ZeroLogger/Targets/LockLoggerTarget.cs

Lines changed: 0 additions & 39 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System.Logging.Contexts;
2+
using System.Logging.Renderers;
3+
4+
namespace System.Logging.Targets;
5+
6+
[method: MethodImpl(MethodImplOptions.AggressiveInlining)]
7+
public sealed class LockingLoggerTarget(LoggerTarget singleThreadLoggerTarget) : LoggerTarget
8+
{
9+
#if NET9_0_OR_GREATER
10+
private readonly Lock _locker = new();
11+
#else
12+
private readonly object _locker = new();
13+
#endif
14+
15+
public override bool RequiresSynchronization => false;
16+
17+
public override void Initialize(CancellationToken cancellationToken)
18+
{
19+
#if NET9_0_OR_GREATER
20+
using var _ = _locker.EnterScope();
21+
singleThreadLoggerTarget.Initialize(cancellationToken);
22+
#else
23+
lock (_locker) singleThreadLoggerTarget.Initialize(cancellationToken);
24+
#endif
25+
}
26+
27+
public override void Publish(in LogContext context, ILogContextRenderer renderer, CancellationToken cancellationToken)
28+
{
29+
#if NET9_0_OR_GREATER
30+
using var _ = _locker.EnterScope();
31+
singleThreadLoggerTarget.Publish(context, renderer, cancellationToken);
32+
#else
33+
lock (_locker) singleThreadLoggerTarget.Publish(context, renderer, cancellationToken);
34+
#endif
35+
}
36+
37+
public override void Dispose(CancellationToken cancellationToken)
38+
{
39+
#if NET9_0_OR_GREATER
40+
using var _ = _locker.EnterScope();
41+
singleThreadLoggerTarget.Dispose(cancellationToken);
42+
#else
43+
lock (_locker) singleThreadLoggerTarget.Dispose(cancellationToken);
44+
#endif
45+
}
46+
}

0 commit comments

Comments
 (0)