Skip to content

Commit dd38a3b

Browse files
committed
Add smart and lazy caches for log building
1 parent 2d836fe commit dd38a3b

File tree

76 files changed

+4105
-2171
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

76 files changed

+4105
-2171
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using System.Logging.Factories;
2+
using System.Logging.Loggers;
3+
4+
namespace Falko.Examples;
5+
6+
public static class Application
7+
{
8+
private static readonly Logger Logger = LoggerFactory.CreateLoggerOfObject();
9+
10+
static Application()
11+
{
12+
Logger.Info(static () => "Application started");
13+
}
14+
}
Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,29 @@
1-
using System.Logging;
1+
using System.Logging.Builders;
2+
using System.Logging.Factories;
3+
using System.Logging.Interpolators;
4+
using System.Logging.Logs;
5+
using System.Logging.Runtimes;
6+
using System.Logging.Targets;
27

3-
var fileTarget = new LoggerFileTarget(SimpleLogInterpolator.Instance, "falko", "./Logs");
4-
5-
LoggerRuntime.Initialize(fileTarget);
8+
LoggerRuntime.Initialize(new LoggerContextBuilder()
9+
.SetLevel(LogLevel.Trace)
10+
.AddTarget(SimpleLogInterpolator.Instance, new LoggerFileTarget("a", "./Logs"))
11+
.AddTarget(SimpleLogInterpolator.Instance, new LoggerFileTarget("b", "./Logs")));
612

713
var logger = LoggerFactory.CreateLoggerOfType<Program>();
814

9-
logger.Info(static () => "Hello, {0}", static () => Environment.UserName);
10-
logger.Trace(static () => "System is {0}", static () => Environment.OSVersion);
15+
var pi = Math.PI;
16+
17+
// good if inside argument
18+
logger.Info(() => "PI is {0}", () => Math.PI.ToString("F"));
19+
20+
// good for outside argument
21+
logger.Info(() => "PI is {0}", new LogMessageArgument<double>(pi, v => v.ToString("F")));
22+
23+
// bad for outside argument
24+
logger.Info(() => "PI is {0}", () => pi.ToString("F"));
25+
26+
// for errors
27+
logger.Error(new Exception(), () => "Error handled");
1128

1229
LoggerRuntime.Dispose();

Sources/Falko.ZeroLogger.Interpolators.Simple/SimpleLogInterpolator.cs renamed to Sources/Falko.ZeroLogger.Interpolators.Simple/Interpolators/SimpleLogInterpolator.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1+
using System.Logging.Contexts;
12
using System.Text;
23

3-
namespace System.Logging;
4+
namespace System.Logging.Interpolators;
45

56
public sealed class SimpleLogInterpolator : ILogInterpolator
67
{
@@ -13,15 +14,9 @@ public void Interpolate(in LogContext logContext, StringBuilder logBuilder)
1314
AppendBlock(logBuilder, logContext.Time.DateTime.ToShortTimeString());
1415
AppendBlock(logBuilder, logContext.Level.ToString());
1516

16-
var source = logContext.Source.AsSpan();
17+
AppendBlock(logBuilder, logContext.Source);
1718

18-
var dotIndex = source.LastIndexOf('.');
19-
20-
if (dotIndex != -1) source = source[(dotIndex + 1)..];
21-
22-
AppendBlock(logBuilder, new string(source));
23-
24-
logBuilder.Append(logContext.Message);
19+
logBuilder.Append(logContext.Message.GetString());
2520

2621
TryAppendError(logBuilder, logContext.Exception);
2722
}
@@ -33,9 +28,15 @@ private static void TryAppendError(StringBuilder logBuilder, Exception? exceptio
3328
logBuilder.AppendLine();
3429

3530
AppendTrace(logBuilder, "Type", exception.GetType().FullName);
31+
logBuilder.AppendLine();
3632
AppendTrace(logBuilder, "Message", exception.Message);
37-
AppendTrace(logBuilder, "Source", exception.Source);
38-
AppendTrace(logBuilder, "StackTrace", exception.StackTrace);
33+
logBuilder.AppendLine();
34+
AppendTrace(logBuilder, "StackTrace", " ");
35+
if (exception.StackTrace is not null)
36+
{
37+
logBuilder.AppendLine();
38+
logBuilder.Append(exception.StackTrace);
39+
}
3940
}
4041

4142
private static void AppendBlock(StringBuilder logBuilder, string text)
@@ -56,6 +57,5 @@ private static void AppendTrace(StringBuilder logBuilder, string name, string? t
5657
logBuilder.Append(name);
5758
logBuilder.Append(": ");
5859
logBuilder.Append(text);
59-
logBuilder.AppendLine();
6060
}
6161
}

Sources/Falko.ZeroLogger.Targets.File/LoggerFileTarget.cs renamed to Sources/Falko.ZeroLogger.Targets.File/Targets/LoggerFileTarget.cs

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
using System.Globalization;
22
using System.IO.Compression;
3+
using System.Logging.Contexts;
4+
using System.Logging.Debugs;
5+
using System.Logging.Interpolators;
6+
using System.Logging.Utils;
37
using System.Runtime.CompilerServices;
48
using System.Text;
59

@@ -8,7 +12,7 @@
812
// ReSharper disable MemberCanBePrivate.Global
913
#pragma warning disable CS8618 // Non-null value when exiting constructor.
1014

11-
namespace System.Logging;
15+
namespace System.Logging.Targets;
1216

1317
public sealed class LoggerFileTarget : LoggerTarget
1418
{
@@ -45,8 +49,7 @@ public sealed class LoggerFileTarget : LoggerTarget
4549

4650
private DateTime _lastWritingBufferClearTime;
4751

48-
public LoggerFileTarget(ILogInterpolator logInterpolator, string logFilePrefix, string logsAndArchivesDirectoryPath)
49-
: base(logInterpolator)
52+
public LoggerFileTarget(string logFilePrefix, string logsAndArchivesDirectoryPath)
5053
{
5154
ArgumentException.ThrowIfNullOrEmpty(logFilePrefix);
5255
ArgumentException.ThrowIfNullOrEmpty(logsAndArchivesDirectoryPath);
@@ -119,7 +122,7 @@ public override void Initialize(CancellationToken cancellationToken)
119122
}
120123
}
121124

122-
public override void Publish(in LogContext logContext, CancellationToken cancellationToken)
125+
public override void Publish(in LogContext logContext, ILogInterpolator logInterpolator, CancellationToken cancellationToken)
123126
{
124127
lock (_locker)
125128
{
@@ -132,7 +135,7 @@ public override void Publish(in LogContext logContext, CancellationToken cancell
132135
SplitLogsToArchive();
133136
}
134137

135-
TransferLogToWritingBuffer(logContext);
138+
TransferLogToWritingBuffer(logContext, logInterpolator);
136139

137140
if (IsWritingBufferWritingThresholdReached(logContext.Time.UtcDateTime) is false)
138141
{
@@ -606,13 +609,13 @@ private string BuildArchiveFilePath(DateTime date, int index)
606609

607610
#region Buffers
608611

609-
private void TransferLogToWritingBuffer(in LogContext logContext)
612+
private void TransferLogToWritingBuffer(in LogContext logContext, ILogInterpolator logInterpolator)
610613
{
611614
try
612615
{
613616
_convertingBuffer.Clear();
614617

615-
LogInterpolator.Interpolate(logContext, _convertingBuffer);
618+
logInterpolator.Interpolate(logContext, _convertingBuffer);
616619

617620
_convertingBuffer.Append(FileNewLine);
618621

Sources/Falko.ZeroLogger.Targets.File/Bytes.cs renamed to Sources/Falko.ZeroLogger.Targets.File/Utils/Bytes.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace System.Logging;
1+
namespace System.Logging.Utils;
22

33
internal static class Bytes
44
{
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
using System.Logging.Contexts;
2+
using System.Logging.Interpolators;
3+
using System.Logging.Logs;
4+
using System.Logging.Targets;
5+
6+
namespace System.Logging.Builders;
7+
8+
public ref struct LoggerContextBuilder()
9+
{
10+
private readonly Dictionary<ILogInterpolator, List<LoggerTarget>> _targets = new();
11+
12+
private LogLevel _minimumLevel = LogLevel.Trace;
13+
14+
public LoggerContextBuilder SetLevel(LogLevel minimumLevel)
15+
{
16+
_minimumLevel = minimumLevel;
17+
return this;
18+
}
19+
20+
public LoggerContextBuilder AddTarget(ILogInterpolator interpolator, LoggerTarget target)
21+
{
22+
ArgumentNullException.ThrowIfNull(interpolator, nameof(interpolator));
23+
ArgumentNullException.ThrowIfNull(target, nameof(target));
24+
25+
if (_targets.TryGetValue(interpolator, out var targets))
26+
{
27+
targets.Add(target);
28+
}
29+
else
30+
{
31+
_targets[interpolator] = [target];
32+
}
33+
34+
return this;
35+
}
36+
37+
internal LoggerContext Build(CancellationToken cancellationToken)
38+
{
39+
var targets = new List<LoggerTarget>();
40+
var interpolators = new List<LogInterpolatorSpan>();
41+
42+
foreach (var interpolatorTargets in _targets)
43+
{
44+
targets.AddRange(interpolatorTargets.Value);
45+
46+
interpolators.Add(new LogInterpolatorSpan(interpolatorTargets.Key, interpolatorTargets.Value.Count));
47+
}
48+
49+
return new LoggerContext(_minimumLevel, targets.ToArray(), interpolators.ToArray(), cancellationToken);
50+
}
51+
}
Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,17 @@
1-
namespace System.Logging;
1+
using System.Logging.Logs;
2+
using System.Logging.Providers;
23

3-
public readonly ref struct LogContext(string source, LogLevel level, DateTimeOffset time, string? message)
4+
namespace System.Logging.Contexts;
5+
6+
public readonly ref struct LogContext(string source, LogLevel level, DateTimeOffset time, LogMessageProvider message)
47
{
58
public string Source => source;
69

710
public LogLevel Level => level;
811

912
public DateTimeOffset Time => time;
1013

11-
public string? Message => message;
14+
public LogMessageProvider Message => message;
1215

1316
public Exception? Exception { get; init; }
1417
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using System.Logging.Interpolators;
2+
3+
namespace System.Logging.Contexts;
4+
5+
internal readonly struct LogInterpolatorSpan(ILogInterpolator logInterpolator, int length)
6+
{
7+
public readonly ILogInterpolator Interpolator = logInterpolator;
8+
9+
public readonly int Length = length;
10+
}
Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,23 @@
1-
namespace System.Logging;
1+
using System.Logging.Logs;
2+
using System.Logging.Targets;
3+
4+
namespace System.Logging.Contexts;
25

36
internal readonly struct LoggerContext
47
{
58
public readonly LogLevel MinimumLevel;
69

710
public readonly LoggerTarget[] Targets;
811

12+
public readonly LogInterpolatorSpan[] Interpolators;
13+
914
public readonly CancellationToken CancellationToken;
1015

11-
internal LoggerContext(LogLevel minimumLevel, LoggerTarget[] targets, CancellationToken cancellationToken)
16+
internal LoggerContext(LogLevel minimumLevel, LoggerTarget[] targets, LogInterpolatorSpan[] interpolators, CancellationToken cancellationToken)
1217
{
1318
MinimumLevel = minimumLevel;
1419
Targets = targets;
20+
Interpolators = interpolators;
1521
CancellationToken = cancellationToken;
1622
}
1723
}

Sources/Falko.ZeroLogger/DebugEventLogger.cs renamed to Sources/Falko.ZeroLogger/Debugs/DebugEventLogger.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
namespace System.Logging;
1+
namespace System.Logging.Debugs;
22

33
public static class DebugEventLogger
44
{

0 commit comments

Comments
 (0)