diff --git a/sandbox/Benchmark/Benchmark.csproj b/sandbox/Benchmark/Benchmark.csproj
index c31eeb4..626cbe1 100644
--- a/sandbox/Benchmark/Benchmark.csproj
+++ b/sandbox/Benchmark/Benchmark.csproj
@@ -5,11 +5,11 @@
net8.0
-
+
-
-
+
+
diff --git a/sandbox/Benchmark/Benchmarks/PostLogEntry.cs b/sandbox/Benchmark/Benchmarks/PostLogEntry.cs
index d5f113f..37fc6be 100644
--- a/sandbox/Benchmark/Benchmarks/PostLogEntry.cs
+++ b/sandbox/Benchmark/Benchmarks/PostLogEntry.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.IO;
using System.Runtime.InteropServices;
@@ -78,19 +78,21 @@ public void Post(IZLoggerEntry log)
[Config(typeof(BenchmarkConfig))]
public class PostLogEntry
{
+ const int N = 10_000;
+
static readonly string NullDevicePath = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "NUL" : "/dev/null";
ILogger zLogger = default!;
ILogger msExtConsoleLogger = default!;
+ ILogger serilogAsyncMsExtLogger = default!;
ILogger serilogMsExtLogger = default!;
- ILogger serilogMsExtLoggerDefault = default!;
+ ILogger nLogAsyncMsExtLogger = default!;
ILogger nLogMsExtLogger = default!;
- ILogger nLogMsExtLoggerDefault = default!;
+ Serilog.Core.Logger serilogAsyncLogger = default!;
Serilog.Core.Logger serilogLogger = default!;
- Serilog.Core.Logger serilogLoggerDefault = default!;
+ NLog.Logger nLogAsyncLogger = default!;
NLog.Logger nLogLogger = default!;
- NLog.Logger nLogLoggerDefault = default!;
List disposables = new();
@@ -117,11 +119,13 @@ public void SetUp()
var msExtConsoleLoggerFactory = LoggerFactory.Create(logging =>
{
logging
- .AddConsole(options =>
+ .AddSimpleConsole(options =>
{
- options.FormatterName = "BenchmarkPlainText";
- })
- .AddConsoleFormatter();
+ options.ColorBehavior = Microsoft.Extensions.Logging.Console.LoggerColorBehavior.Disabled;
+ options.IncludeScopes = false;
+ options.SingleLine = true;
+ options.TimestampFormat = "u";
+ });
});
disposables.Add(msExtConsoleLoggerFactory);
@@ -129,62 +133,65 @@ public void SetUp()
// Serilog
+ serilogAsyncLogger = new LoggerConfiguration()
+ .WriteTo.Async(a => a.TextWriter(TextWriter.Null), bufferSize: N)
+ .CreateLogger();
+ disposables.Add(serilogAsyncLogger);
+ var serilogAsyncMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogAsyncLogger));
+ serilogAsyncMsExtLogger = serilogAsyncMsExtLoggerFactory.CreateLogger();
+ disposables.Add(serilogAsyncMsExtLoggerFactory);
+
serilogLogger = new LoggerConfiguration()
- .WriteTo.Async(a => a.TextWriter(TextWriter.Null))
+ .WriteTo.TextWriter(TextWriter.Null)
.CreateLogger();
disposables.Add(serilogLogger);
var serilogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogLogger));
serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
disposables.Add(serilogMsExtLoggerFactory);
- serilogLoggerDefault = new LoggerConfiguration()
- .WriteTo.TextWriter(TextWriter.Null)
- .CreateLogger();
- var serilogMsExtLoggerFactoryDefault = LoggerFactory.Create(x => x.AddSerilog(serilogLoggerDefault));
- serilogMsExtLoggerDefault = serilogMsExtLoggerFactoryDefault.CreateLogger();
- disposables.Add(serilogMsExtLoggerFactoryDefault);
-
// NLog
var nLogLayout = new NLog.Layouts.SimpleLayout("${longdate} [${level}] ${message}");
{
- var nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.FileTarget("Null")
+ var nLogAsyncConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.NullTarget("Null Async")
{
- FileName = NullDevicePath,
- Layout = nLogLayout
+ Layout = nLogLayout,
+ FormatMessage = true,
};
- var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, 10000, AsyncTargetWrapperOverflowAction.Grow)
+ var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, N, AsyncTargetWrapperOverflowAction.Grow)
{
TimeToSleepBetweenBatches = 0
};
- nLogConfig.AddTarget(asyncTarget);
- nLogConfig.AddRuleForAllLevels(asyncTarget);
- nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogAsyncConfig.AddTarget(asyncTarget);
+ nLogAsyncConfig.AddRuleForAllLevels(asyncTarget);
+ nLogAsyncConfig.LogFactory.Configuration = nLogAsyncConfig;
- nLogLogger = nLogConfig.LogFactory.GetLogger("NLog");
+ nLogAsyncLogger = nLogAsyncConfig.LogFactory.GetLogger("NLog");
- var nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
- nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
+ var nLogAsyncMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogAsyncConfig));
+ nLogAsyncMsExtLogger = nLogAsyncMsExtLoggerFactory.CreateLogger();
- disposables.Add(nLogMsExtLoggerFactory);
+ disposables.Add(nLogAsyncMsExtLoggerFactory);
+ disposables.Add(nLogAsyncConfig.LogFactory);
}
{
- var nLogConfigDefault = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.FileTarget("Null:Default")
+ var nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.NullTarget("Null")
{
- FileName = NullDevicePath,
- Layout = nLogLayout
+ Layout = nLogLayout,
+ FormatMessage = true,
};
- nLogConfigDefault.AddTarget(target);
- nLogConfigDefault.AddRuleForAllLevels(target);
- nLogConfigDefault.LogFactory.Configuration = nLogConfigDefault;
+ nLogConfig.AddTarget(target);
+ nLogConfig.AddRuleForAllLevels(target);
+ nLogConfig.LogFactory.Configuration = nLogConfig;
- nLogLogger = nLogConfigDefault.LogFactory.GetLogger("NLog");
+ nLogLogger = nLogConfig.LogFactory.GetLogger("NLog");
- var nLogMsExtLoggerFactoryDefault = LoggerFactory.Create(logging => logging.AddNLog(nLogConfigDefault));
- nLogMsExtLoggerDefault = nLogMsExtLoggerFactoryDefault.CreateLogger();
+ var nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
+ nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
- disposables.Add(nLogMsExtLoggerFactoryDefault);
+ disposables.Add(nLogMsExtLoggerFactory);
+ disposables.Add(nLogConfig.LogFactory);
}
}
@@ -222,62 +229,62 @@ public void MsExtConsole_SourceGenerator_Log()
}
[Benchmark]
- public void Serilog_MsExt_Log()
+ public void Serilog_Async_MsExt_Log()
{
- serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void Serilog_MsExt_SourceGenerator_Log()
+ public void Serilog_Async_MsExt_SourceGenerator_Log()
{
- serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void Serilog_Log()
+ public void Serilog_Async_Log()
{
- serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void Serilog_Default_MsExt_Log()
+ public void Serilog_MsExt_Log()
{
- serilogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void Serilog_Default_Log()
+ public void Serilog_Log()
{
- serilogLoggerDefault.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void NLog_MsExt_Log()
+ public void NLog_Async_MsExt_Log()
{
- nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void NLog_MsExt_SourceGenerator_Log()
+ public void NLog_Async_MsExt_SourceGenerator_Log()
{
- nLogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void NLog_Log()
+ public void NLog_Async_Log()
{
- nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void NLog_Default_MsExt_Log()
+ public void NLog_MsExt_Log()
{
- nLogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
[Benchmark]
- public void NLog_Default_Log()
+ public void NLog_Log()
{
- nLogLoggerDefault.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
-}
\ No newline at end of file
+}
diff --git a/sandbox/Benchmark/Benchmarks/WriteJsonToConsole.cs b/sandbox/Benchmark/Benchmarks/WriteJsonToConsole.cs
index fe674e9..ecd61b8 100644
--- a/sandbox/Benchmark/Benchmarks/WriteJsonToConsole.cs
+++ b/sandbox/Benchmark/Benchmarks/WriteJsonToConsole.cs
@@ -24,7 +24,7 @@ public BenchmarkConfig()
{
AddDiagnoser(MemoryDiagnoser.Default);
//AddJob(Job.ShortRun.WithWarmupCount(1).WithIterationCount(1));
- AddJob(Job.ShortRun.WithWarmupCount(1).WithIterationCount(1).WithToolchain(InProcessNoEmitToolchain.Instance));
+ AddJob(Job.ShortRun.WithWarmupCount(5).WithIterationCount(5).WithToolchain(InProcessNoEmitToolchain.Instance));
}
}
@@ -33,29 +33,29 @@ public BenchmarkConfig()
[LogWritesPerSecond]
public class WriteJsonToConsole
{
- const int N = 1;
+ const int N = 10_000;
ILogger zLogger = default!;
ILogger msExtConsoleLogger = default!;
+ ILogger serilogAsyncMsExtLogger = default!;
ILogger serilogMsExtLogger = default!;
- ILogger serilogMsExtLoggerDefault = default!;
+ ILogger nLogAsyncMsExtLogger = default!;
ILogger nLogMsExtLogger = default!;
- ILogger nLogMsExtLoggerDefault = default!;
ILoggerFactory zLoggerFactory;
ILoggerFactory msExtConsoleLoggerFactory;
+ ILoggerFactory serilogAsyncMsExtLoggerFactory;
ILoggerFactory serilogMsExtLoggerFactory;
- ILoggerFactory serilogMsExtLoggerFactoryDefault;
+ ILoggerFactory nLogAsyncMsExtLoggerFactory;
ILoggerFactory nLogMsExtLoggerFactory;
- ILoggerFactory nLogMsExtLoggerFactoryDefault;
+ Serilog.Core.Logger serilogAsyncLogger = default!;
Serilog.Core.Logger serilogLogger = default!;
- Serilog.Core.Logger serilogLoggerDefault = default!;
+ NLog.Logger nLogAsyncLogger = default!;
NLog.Logger nLogLogger = default!;
- NLog.Logger nLogLoggerDefault = default!;
+ NLog.Config.LoggingConfiguration nLogAsyncConfig = default!;
NLog.Config.LoggingConfiguration nLogConfig = default!;
- NLog.Config.LoggingConfiguration nLogConfigDefault = default!;
ZeroLog.Log zeroLogLogger = ZeroLog.LogManager.GetLogger();
@@ -89,18 +89,18 @@ public void SetUpLogger()
var serilogFormatter = new JsonFormatter(renderMessage: true);
- serilogLogger = new Serilog.LoggerConfiguration()
+ serilogAsyncLogger = new Serilog.LoggerConfiguration()
.WriteTo.Async(a => a.Console(serilogFormatter), bufferSize: N)
.CreateLogger();
- serilogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddSerilog(serilogLogger));
- serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
+ serilogAsyncMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddSerilog(serilogAsyncLogger));
+ serilogAsyncMsExtLogger = serilogAsyncMsExtLoggerFactory.CreateLogger();
- serilogLoggerDefault = new Serilog.LoggerConfiguration()
+ serilogLogger = new Serilog.LoggerConfiguration()
.WriteTo.Console(serilogFormatter)
.CreateLogger();
- serilogMsExtLoggerFactoryDefault = LoggerFactory.Create(x => x.AddSerilog(serilogLoggerDefault));
- serilogMsExtLoggerDefault = serilogMsExtLoggerFactoryDefault.CreateLogger();
+ serilogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogLogger));
+ serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
// NLog
@@ -109,50 +109,44 @@ public void SetUpLogger()
IncludeEventProperties = true,
Attributes =
{
- new NLog.Layouts.JsonAttribute("timestamp", "${longdate}"),
+ new NLog.Layouts.JsonAttribute("timestamp", "${date:format=o}"),
new NLog.Layouts.JsonAttribute("level", "${level}"),
new NLog.Layouts.JsonAttribute("message", "${message}"),
new NLog.Layouts.JsonAttribute("logger", "${logger}"),
}
};
{
- nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.ConsoleTarget("Console")
+ nLogAsyncConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.ConsoleTarget("Console_Async")
{
Layout = nLogLayout,
};
- var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, 10000, AsyncTargetWrapperOverflowAction.Grow)
+ var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, N, AsyncTargetWrapperOverflowAction.Grow)
{
TimeToSleepBetweenBatches = 0
};
- nLogConfig.AddTarget(asyncTarget);
- nLogConfig.AddRuleForAllLevels(asyncTarget);
- nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogAsyncConfig.AddTarget(asyncTarget);
+ nLogAsyncConfig.AddRuleForAllLevels(asyncTarget);
+ nLogAsyncConfig.LogFactory.Configuration = nLogAsyncConfig;
- nLogLogger = nLogConfig.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToConsole");
+ nLogAsyncLogger = nLogAsyncConfig.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToConsole");
- nLogMsExtLoggerFactory = LoggerFactory.Create(logging =>
- {
- logging.AddNLog(nLogConfig);
- });
- nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
+ nLogAsyncMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogAsyncConfig));
+ nLogAsyncMsExtLogger = nLogAsyncMsExtLoggerFactory.CreateLogger();
}
{
- nLogConfigDefault = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.ConsoleTarget("Console:Default")
+ nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.ConsoleTarget("Console")
{
Layout = nLogLayout,
};
- nLogConfigDefault.AddTarget(target);
- nLogConfigDefault.AddRuleForAllLevels(target);
+ nLogConfig.AddTarget(target);
+ nLogConfig.AddRuleForAllLevels(target);
nLogConfig.LogFactory.Configuration = nLogConfig;
- nLogLoggerDefault = nLogConfigDefault.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToConsole");
+ nLogLogger = nLogConfig.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToConsole");
- nLogMsExtLoggerFactoryDefault = LoggerFactory.Create(logging =>
- {
- logging.AddNLog(nLogConfigDefault);
- });
- nLogMsExtLoggerDefault = nLogMsExtLoggerFactoryDefault.CreateLogger();
+ nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
+ nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
}
// ZeroLog
@@ -180,16 +174,16 @@ public void Cleanup()
{
zLoggerFactory.Dispose();
msExtConsoleLoggerFactory.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
serilogMsExtLoggerFactory.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
+ nLogAsyncMsExtLoggerFactory.Dispose();
nLogMsExtLoggerFactory.Dispose();
- nLogMsExtLoggerFactoryDefault.Dispose();
+ serilogAsyncLogger.Dispose();
serilogLogger.Dispose();
- serilogLoggerDefault.Dispose();
+ nLogAsyncConfig.LogFactory.Shutdown();
nLogConfig.LogFactory.Shutdown();
- nLogConfigDefault.LogFactory.Shutdown();
ZeroLog.LogManager.Shutdown();
}
@@ -218,7 +212,7 @@ public void ZLogger_SourceGenerator_JsonConsole()
}
[Benchmark]
- public void ZeroLog_JsonFile()
+ public void ZeroLog_JsonConsole()
{
for (var i = 0; i < N; i++)
{
@@ -254,105 +248,100 @@ public void MsExtConsole_SourceGenerator_JsonConsole()
}
[Benchmark]
- public void Serilog_MsExt_JsonConsole()
+ public void Serilog_Async_MsExt_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_MsExt_SourceGenerator_JsonConsole()
+ public void Serilog_Async_MsExt_SourceGenerator_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_JsonConsole()
+ public void Serilog_Async_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
+ serilogAsyncLogger.Dispose();
}
[Benchmark]
- public void Serilog_Default_JsonConsole()
+ public void Serilog_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- serilogLoggerDefault.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLoggerDefault.Dispose();
}
[Benchmark]
- public void Serilog_Default_MsExt_JsonConsole()
+ public void Serilog_MsExt_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLoggerDefault.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLoggerDefault.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void NLog_MsExt_JsonConsole()
+ public void NLog_Async_MsExt_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_MsExt_SourceGenerator_JsonConsole()
+ public void NLog_Async_MsExt_SourceGenerator_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_JsonConsole()
+ public void NLog_Async_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_Default_JsonConsole()
+ public void NLog_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- nLogLoggerDefault.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfigDefault.LogFactory.Shutdown();
}
[Benchmark]
- public void NLog_Default_MsExt_JsonConsole()
+ public void NLog_MsExt_JsonConsole()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogMsExtLoggerFactoryDefault.Dispose();
}
-}
\ No newline at end of file
+}
diff --git a/sandbox/Benchmark/Benchmarks/WriteJsonToFile.cs b/sandbox/Benchmark/Benchmarks/WriteJsonToFile.cs
index 447339f..b2b97b4 100644
--- a/sandbox/Benchmark/Benchmarks/WriteJsonToFile.cs
+++ b/sandbox/Benchmark/Benchmarks/WriteJsonToFile.cs
@@ -36,24 +36,24 @@ public class WriteJsonToFile
const int N = 100_000;
ILogger zLogger = default!;
+ ILogger serilogAsyncMsExtLogger = default!;
ILogger serilogMsExtLogger = default!;
- ILogger serilogMsExtLoggerDefault = default!;
+ ILogger nLogAsyncMsExtLogger = default!;
ILogger nLogMsExtLogger = default!;
- ILogger nLogMsExtLoggerDefault = default!;
ILoggerFactory zLoggerFactory;
+ ILoggerFactory serilogAsyncMsExtLoggerFactory;
ILoggerFactory serilogMsExtLoggerFactory;
- ILoggerFactory serilogMsExtLoggerFactoryDefault;
+ ILoggerFactory nLogAsyncMsExtLoggerFactory;
ILoggerFactory nLogMsExtLoggerFactory;
- ILoggerFactory nLogMsExtLoggerFactoryDefault;
+ Serilog.Core.Logger serilogAsyncLogger = default!;
Serilog.Core.Logger serilogLogger = default!;
- Serilog.Core.Logger serilogLoggerDefault = default!;
+ NLog.Logger nLogAsyncLogger = default!;
NLog.Logger nLogLogger = default!;
- NLog.Logger nLogLoggerDefault = default!;
+ NLog.Config.LoggingConfiguration nLogAsyncConfig = default!;
NLog.Config.LoggingConfiguration nLogConfig = default!;
- NLog.Config.LoggingConfiguration nLogConfigDefault = default!;
ZeroLog.Log zeroLogLogger = ZeroLog.LogManager.GetLogger();
@@ -90,26 +90,19 @@ public void SetUpLogger()
// Serilog
var serilogFormatter = new JsonFormatter(renderMessage: true);
-
- serilogLogger = new Serilog.LoggerConfiguration()
- .WriteTo.Async(a => a.File(serilogFormatter, GetLogFilePath("serilog.log"), buffered: true, flushToDiskInterval: TimeSpan.Zero), bufferSize: N)
+ serilogAsyncLogger = new Serilog.LoggerConfiguration()
+ .WriteTo.Async(a => a.File(serilogFormatter, GetLogFilePath("serilog_async.log"), buffered: true, flushToDiskInterval: TimeSpan.FromSeconds(1)), bufferSize: N)
.CreateLogger();
- serilogMsExtLoggerFactory = LoggerFactory.Create(logging =>
- {
- logging.AddSerilog(serilogLogger, true);
- });
- serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
+ serilogAsyncMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddSerilog(serilogAsyncLogger, true));
+ serilogAsyncMsExtLogger = serilogAsyncMsExtLoggerFactory.CreateLogger();
- serilogLoggerDefault = new Serilog.LoggerConfiguration()
- .WriteTo.File("serilog_default.log")
+ serilogLogger = new Serilog.LoggerConfiguration()
+ .WriteTo.File(serilogFormatter, GetLogFilePath("serilog.log"))
.CreateLogger();
- serilogMsExtLoggerFactoryDefault = LoggerFactory.Create(logging =>
- {
- logging.AddSerilog(serilogLoggerDefault, true);
- });
- serilogMsExtLoggerDefault = serilogMsExtLoggerFactory.CreateLogger();
+ serilogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddSerilog(serilogLogger, true));
+ serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
// NLog
@@ -125,48 +118,42 @@ public void SetUpLogger()
}
};
{
- nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.FileTarget("File")
+ nLogAsyncConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.FileTarget("FileAsync")
{
- FileName = GetLogFilePath("nlog.log"),
+ FileName = GetLogFilePath("nlog_async.log"),
Layout = nLogLayout,
KeepFileOpen = true,
- ConcurrentWrites = false,
- AutoFlush = true
+ AutoFlush = false,
+ OpenFileFlushTimeout = 1,
};
- var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, 10000, AsyncTargetWrapperOverflowAction.Grow)
+ var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, N, AsyncTargetWrapperOverflowAction.Grow)
{
TimeToSleepBetweenBatches = 0,
};
- nLogConfig.AddTarget(asyncTarget);
- nLogConfig.AddRuleForAllLevels(asyncTarget);
- nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogAsyncConfig.AddTarget(asyncTarget);
+ nLogAsyncConfig.AddRuleForAllLevels(asyncTarget);
+ nLogAsyncConfig.LogFactory.Configuration = nLogAsyncConfig;
- nLogLogger = nLogConfig.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToFile");
+ nLogAsyncLogger = nLogAsyncConfig.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToFile");
- nLogMsExtLoggerFactory = LoggerFactory.Create(logging =>
- {
- logging.AddNLog(nLogConfig);
- });
- nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
+ nLogAsyncMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogAsyncConfig));
+ nLogAsyncMsExtLogger = nLogAsyncMsExtLoggerFactory.CreateLogger();
}
{
- nLogConfigDefault = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.FileTarget("FileDefault")
+ nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.FileTarget("File")
{
- FileName = GetLogFilePath("nlog_default.log"),
- Layout = nLogLayout
+ FileName = GetLogFilePath("nlog.log"),
+ Layout = nLogLayout,
};
- nLogConfigDefault.AddTarget(target);
- nLogConfigDefault.AddRuleForAllLevels(target);
- nLogConfigDefault.LogFactory.Configuration = nLogConfigDefault;
- nLogLoggerDefault = nLogConfigDefault.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToFile");
+ nLogConfig.AddTarget(target);
+ nLogConfig.AddRuleForAllLevels(target);
+ nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogLogger = nLogConfig.LogFactory.GetLogger("Benchmark.Benchmarks.WriteJsonToFile");
- nLogMsExtLoggerFactoryDefault = LoggerFactory.Create(logging =>
- {
- logging.AddNLog(nLogConfigDefault);
- });
- nLogMsExtLoggerDefault = nLogMsExtLoggerFactoryDefault.CreateLogger();
+ nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
+ nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
}
// ZeroLog
@@ -193,16 +180,16 @@ public void SetUpLogger()
public void Cleanup()
{
zLoggerFactory.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
serilogMsExtLoggerFactory.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
+ nLogAsyncMsExtLoggerFactory.Dispose();
nLogMsExtLoggerFactory.Dispose();
- nLogMsExtLoggerFactoryDefault.Dispose();
+ serilogAsyncLogger.Dispose();
serilogLogger.Dispose();
- serilogLoggerDefault.Dispose();
+ nLogAsyncConfig.LogFactory.Shutdown();
nLogConfig.LogFactory.Shutdown();
- nLogConfigDefault.LogFactory.Shutdown();
ZeroLog.LogManager.Shutdown();
}
@@ -247,108 +234,100 @@ public void ZeroLog_JsonFile()
}
[Benchmark]
- public void Serilog_MsExt_JsonFile()
+ public void Serilog_Async_MsExt_JsonFile()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_MsExt_SourceGenerator_JsonFile()
+ public void Serilog_Async_MsExt_SourceGenerator_JsonFile()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_JsonFile()
+ public void Serilog_Async_JsonFile()
{
for (var i = 0; i < N; i++)
{
- serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
+ serilogAsyncLogger.Dispose();
}
[Benchmark]
- public void Serilog_Default_MsExt_JsonFile()
+ public void Serilog_MsExt_JsonFile()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLoggerDefault.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void Serilog_Default_JsonFile()
+ public void Serilog_JsonFile()
{
for (var i = 0; i < N; i++)
{
- serilogLoggerDefault.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLoggerDefault.Dispose();
}
[Benchmark]
- public void NLog_MsExt_JsonFile()
+ public void NLog_Async_MsExt_JsonFile()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_MsExt_SourceGenerator_JsonFile()
+ public void NLog_Async_MsExt_SourceGenerator_JsonFile()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_JsonFile()
+ public void NLog_Async_JsonFile()
{
for (var i = 0; i < N; i++)
{
- nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_Default_MsExt_JsonFile()
+ public void NLog_MsExt_JsonFile()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfigDefault.LogFactory.Shutdown();
- nLogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void NLog_Default_JsonFile()
+ public void NLog_JsonFile()
{
for (var i = 0; i < N; i++)
{
- nLogLoggerDefault.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfigDefault.LogFactory.Shutdown();
}
-}
\ No newline at end of file
+}
diff --git a/sandbox/Benchmark/Benchmarks/WritePlainTextToConsole.cs b/sandbox/Benchmark/Benchmarks/WritePlainTextToConsole.cs
index 14b7d15..ae0413b 100644
--- a/sandbox/Benchmark/Benchmarks/WritePlainTextToConsole.cs
+++ b/sandbox/Benchmark/Benchmarks/WritePlainTextToConsole.cs
@@ -1,4 +1,4 @@
-using BenchmarkDotNet.Attributes;
+using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
using BenchmarkDotNet.Diagnosers;
using BenchmarkDotNet.Jobs;
@@ -29,29 +29,29 @@ public BenchmarkConfig()
[LogWritesPerSecond]
public class WritePlainTextToConsole
{
- const int N = 100_000;
+ const int N = 10_000;
ILogger zLogger = default!;
ILogger msExtConsoleLogger = default!;
+ ILogger serilogAsyncMsExtLogger = default!;
ILogger serilogMsExtLogger = default!;
- ILogger serilogMsExtLoggerDefault = default!;
+ ILogger nLogAsyncMsExtLogger = default!;
ILogger nLogMsExtLogger = default!;
- ILogger nLogMsExtLoggerDefault = default!;
ILoggerFactory zLoggerFactory;
ILoggerFactory msExtConsoleLoggerFactory;
+ ILoggerFactory serilogAsyncMsExtLoggerFactory;
ILoggerFactory serilogMsExtLoggerFactory;
- ILoggerFactory serilogMsExtLoggerFactoryDefault;
+ ILoggerFactory nLogAsyncMsExtLoggerFactory;
ILoggerFactory nLogMsExtLoggerFactory;
- ILoggerFactory nLogMsExtLoggerFactoryDefault;
+ Serilog.Core.Logger serilogAsyncLogger = default!;
Serilog.Core.Logger serilogLogger = default!;
- Serilog.Core.Logger serilogLoggerDefault = default!;
+ NLog.Logger nLogAsyncLogger = default!;
NLog.Logger nLogLogger = default!;
- NLog.Logger nLogLoggerDefault = default!;
+ NLog.Config.LoggingConfiguration nLogAsyncConfig = default!;
NLog.Config.LoggingConfiguration nLogConfig = default!;
- NLog.Config.LoggingConfiguration nLogConfigDefault = default!;
ZeroLog.Log zeroLogLogger = ZeroLog.LogManager.GetLogger();
@@ -77,11 +77,13 @@ public void SetUpLogger()
msExtConsoleLoggerFactory = LoggerFactory.Create(logging =>
{
logging
- .AddConsole(options =>
+ .AddSimpleConsole(options =>
{
- options.FormatterName = "BenchmarkPlainText";
- })
- .AddConsoleFormatter();
+ options.ColorBehavior = Microsoft.Extensions.Logging.Console.LoggerColorBehavior.Disabled;
+ options.IncludeScopes = false;
+ options.SingleLine = true;
+ options.TimestampFormat = "u";
+ });
});
msExtConsoleLogger = msExtConsoleLoggerFactory.CreateLogger();
@@ -89,52 +91,52 @@ public void SetUpLogger()
var serilogFormatter = new MessageTemplateTextFormatter("{Timestamp} [{Level}] {Message}{NewLine}");
- serilogLogger = new Serilog.LoggerConfiguration()
+ serilogAsyncLogger = new Serilog.LoggerConfiguration()
.WriteTo.Async(a => a.Console(serilogFormatter), bufferSize: N)
.CreateLogger();
- serilogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogLogger, true));
- serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
+ serilogAsyncMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogAsyncLogger, true));
+ serilogAsyncMsExtLogger = serilogAsyncMsExtLoggerFactory.CreateLogger();
- serilogLoggerDefault = new Serilog.LoggerConfiguration()
+ serilogLogger = new Serilog.LoggerConfiguration()
.WriteTo.Console(serilogFormatter)
.CreateLogger();
- serilogMsExtLoggerFactoryDefault = LoggerFactory.Create(x => x.AddSerilog(serilogLoggerDefault, true));
- serilogMsExtLoggerDefault = serilogMsExtLoggerFactoryDefault.CreateLogger();
+ serilogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogLogger, true));
+ serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
// NLog
var nLogLayout = new NLog.Layouts.SimpleLayout("${longdate} [${level}] ${message}");
{
- nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.ConsoleTarget("Console")
+ nLogAsyncConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.ConsoleTarget("Console_Async")
{
Layout = nLogLayout,
};
- var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, 10000, AsyncTargetWrapperOverflowAction.Grow)
+ var asyncTarget = new NLog.Targets.Wrappers.AsyncTargetWrapper(target, N, AsyncTargetWrapperOverflowAction.Grow)
{
TimeToSleepBetweenBatches = 0
};
- nLogConfig.AddTarget(asyncTarget);
- nLogConfig.AddRuleForAllLevels(asyncTarget);
- nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogAsyncConfig.AddTarget(asyncTarget);
+ nLogAsyncConfig.AddRuleForAllLevels(asyncTarget);
+ nLogAsyncConfig.LogFactory.Configuration = nLogAsyncConfig;
- nLogLogger = nLogConfig.LogFactory.GetLogger(nameof(WritePlainTextToConsole));
- nLogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddNLog(nLogConfig));
- nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
+ nLogAsyncLogger = nLogAsyncConfig.LogFactory.GetLogger(nameof(WritePlainTextToConsole));
+ nLogAsyncMsExtLoggerFactory = LoggerFactory.Create(x => x.AddNLog(nLogAsyncConfig));
+ nLogAsyncMsExtLogger = nLogAsyncMsExtLoggerFactory.CreateLogger();
}
{
- nLogConfigDefault = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.ConsoleTarget("Console:Default")
+ nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.ConsoleTarget("Console")
{
Layout = nLogLayout
};
- nLogConfigDefault.AddTarget(target);
- nLogConfigDefault.AddRuleForAllLevels(target);
- nLogConfigDefault.LogFactory.Configuration = nLogConfigDefault;
+ nLogConfig.AddTarget(target);
+ nLogConfig.AddRuleForAllLevels(target);
+ nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogLogger = nLogConfig.LogFactory.GetLogger(nameof(WritePlainTextToConsole));
- nLogLoggerDefault = nLogConfigDefault.LogFactory.GetLogger(nameof(WritePlainTextToConsole));
- nLogMsExtLoggerFactoryDefault = LoggerFactory.Create(x => x.AddNLog(nLogConfigDefault));
- nLogMsExtLoggerDefault = nLogMsExtLoggerFactoryDefault.CreateLogger();
+ nLogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddNLog(nLogConfig));
+ nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
}
// ZeroLog
@@ -162,16 +164,16 @@ public void Cleanup()
{
zLoggerFactory.Dispose();
msExtConsoleLoggerFactory.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
serilogMsExtLoggerFactory.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
+ nLogAsyncMsExtLoggerFactory.Dispose();
nLogMsExtLoggerFactory.Dispose();
- nLogMsExtLoggerFactoryDefault.Dispose();
+ serilogAsyncLogger.Dispose();
serilogLogger.Dispose();
- serilogLoggerDefault.Dispose();
+ nLogAsyncConfig.LogFactory.Shutdown();
nLogConfig.LogFactory.Shutdown();
- nLogConfigDefault.LogFactory.Shutdown();
ZeroLog.LogManager.Shutdown();
}
@@ -228,108 +230,100 @@ public void MsExtConsole_SourceGenerator_PlainTextConsole()
}
[Benchmark]
- public void Serilog_MsExt_PlainTextConsole()
+ public void Serilog_Async_MsExt_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.LogInformation("x={X} y={Y} z={Z}", 100, 200, 300);
+ serilogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_MsExt_SourceGenerator_PlainTextConsole()
+ public void Serilog_Async_MsExt_SourceGenerator_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_PlainTextConsole()
+ public void Serilog_Async_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- serilogLogger.Information("x={X} y={Y} z={Z}", 100, 200, 300);
+ serilogAsyncLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
+ serilogAsyncLogger.Dispose();
}
[Benchmark]
- public void Serilog_Default_PlainTextConsole()
+ public void Serilog_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- serilogLoggerDefault.Information("x={X} y={Y} z={Z}", 100, 200, 300);
+ serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLoggerDefault.Dispose();
}
[Benchmark]
- public void Serilog_Default_MsExt_PlainTextConsole()
+ public void Serilog_MsExt_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLoggerDefault.LogInformation("x={X} y={Y} z={Z}", 100, 200, 300);
+ serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLoggerDefault.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void NLog_MsExt_PlainTextConsole()
+ public void NLog_Async_MsExt_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.LogInformation("x={X} y={Y} z={Z}", 100, 200, 300);
+ nLogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_MsExt_SourceGenerator_PlainTextConsole()
+ public void NLog_Async_MsExt_SourceGenerator_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_PlainTextConsole()
+ public void NLog_Async_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- nLogLogger.Info("x={X} y={Y} z={Z}", 100, 200, 300);
+ nLogAsyncLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_Default_MsExt_PlainTextConsole()
+ public void NLog_MsExt_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLoggerDefault.LogInformation("x={X} y={Y} z={Z}", 100, 200, 300);
+ nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfigDefault.LogFactory.Shutdown();
- nLogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void NLog_Default_PlainTextConsole()
+ public void NLog_PlainTextConsole()
{
for (var i = 0; i < N; i++)
{
- nLogLoggerDefault.Info("x={X} y={Y} z={Z}", 100, 200, 300);
+ nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfigDefault.LogFactory.Shutdown();
}
}
diff --git a/sandbox/Benchmark/Benchmarks/WritePlainTextToFile.cs b/sandbox/Benchmark/Benchmarks/WritePlainTextToFile.cs
index 4c51667..b1897cd 100644
--- a/sandbox/Benchmark/Benchmarks/WritePlainTextToFile.cs
+++ b/sandbox/Benchmark/Benchmarks/WritePlainTextToFile.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.IO;
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Configs;
@@ -37,24 +37,24 @@ public class WritePlainTextToFile
const int N = 100_000;
ILogger zLogger = default!;
+ ILogger serilogAsyncMsExtLogger = default!;
ILogger serilogMsExtLogger = default!;
- ILogger serilogMsExtLoggerDefault = default!;
+ ILogger nLogAsyncMsExtLogger = default!;
ILogger nLogMsExtLogger = default!;
- ILogger nLogMsExtLoggerDefault = default!;
ILoggerFactory zLoggerFactory;
+ ILoggerFactory serilogAsyncMsExtLoggerFactory;
ILoggerFactory serilogMsExtLoggerFactory;
- ILoggerFactory serilogMsExtLoggerFactoryDefault;
+ ILoggerFactory nLogAsyncMsExtLoggerFactory;
ILoggerFactory nLogMsExtLoggerFactory;
- ILoggerFactory nLogMsExtLoggerFactoryDefault;
+ Serilog.Core.Logger serilogAsyncLogger = default!;
Serilog.Core.Logger serilogLogger = default!;
- Serilog.Core.Logger serilogLoggerDefault = default!;
+ NLog.Logger nLogAsyncLogger = default!;
NLog.Logger nLogLogger = default!;
- NLog.Logger nLogLoggerDefault = default!;
+ NLog.Config.LoggingConfiguration nLogAsyncConfig = default!;
NLog.Config.LoggingConfiguration nLogConfig = default!;
- NLog.Config.LoggingConfiguration nLogConfigDefault = default!;
ZeroLog.Log zeroLogLogger = ZeroLog.LogManager.GetLogger();
@@ -98,58 +98,58 @@ public void SetUpLogger()
var serilogFormatter = new MessageTemplateTextFormatter("{Timestamp} [{Level}] {Message}{NewLine}");
- serilogLogger = new Serilog.LoggerConfiguration()
+ serilogAsyncLogger = new Serilog.LoggerConfiguration()
.WriteTo.Async(
- a => a.File(serilogFormatter, GetLogFilePath("serilog.log"), buffered: true,
- flushToDiskInterval: TimeSpan.Zero), bufferSize: N)
+ a => a.File(serilogFormatter, GetLogFilePath("serilog_async.log"), buffered: true,
+ flushToDiskInterval: TimeSpan.FromSeconds(1)), bufferSize: N)
.CreateLogger();
+ serilogAsyncMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogAsyncLogger));
+ serilogAsyncMsExtLogger = serilogAsyncMsExtLoggerFactory.CreateLogger();
+
+ serilogLogger = new Serilog.LoggerConfiguration().WriteTo.File(serilogFormatter, GetLogFilePath("serilog.log")).CreateLogger();
serilogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddSerilog(serilogLogger));
serilogMsExtLogger = serilogMsExtLoggerFactory.CreateLogger();
- serilogLoggerDefault = new Serilog.LoggerConfiguration().WriteTo.File("serilog_default.log").CreateLogger();
- serilogMsExtLoggerFactoryDefault = LoggerFactory.Create(x => x.AddSerilog(serilogLoggerDefault));
- serilogMsExtLoggerDefault = serilogMsExtLoggerFactoryDefault.CreateLogger();
-
// NLog
var nLogLayout = new NLog.Layouts.SimpleLayout("${longdate} [${level}] ${message}");
{
- nLogConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
- var target = new NLog.Targets.FileTarget("File")
+ nLogAsyncConfig = new NLog.Config.LoggingConfiguration(new LogFactory());
+ var target = new NLog.Targets.FileTarget("File_Async")
{
- FileName = GetLogFilePath("nlog.log"),
+ FileName = GetLogFilePath("nlog_async.log"),
Layout = nLogLayout,
KeepFileOpen = true,
- ConcurrentWrites = false,
- AutoFlush = true
+ AutoFlush = false,
+ OpenFileFlushTimeout = 1,
};
var asyncTarget =
- new NLog.Targets.Wrappers.AsyncTargetWrapper(target, 10000, AsyncTargetWrapperOverflowAction.Grow)
+ new NLog.Targets.Wrappers.AsyncTargetWrapper(target, N, AsyncTargetWrapperOverflowAction.Grow)
{
TimeToSleepBetweenBatches = 0
};
- nLogConfig.AddTarget(asyncTarget);
- nLogConfig.AddRuleForAllLevels(asyncTarget);
- nLogConfig.LogFactory.Configuration = nLogConfig;
- nLogLogger = nLogConfig.LogFactory.GetLogger(nameof(WritePlainTextToFile));
+ nLogAsyncConfig.AddTarget(asyncTarget);
+ nLogAsyncConfig.AddRuleForAllLevels(asyncTarget);
+ nLogAsyncConfig.LogFactory.Configuration = nLogAsyncConfig;
+ nLogAsyncLogger = nLogAsyncConfig.LogFactory.GetLogger(nameof(WritePlainTextToFile));
- nLogMsExtLoggerFactory = LoggerFactory.Create(x => x.AddNLog(nLogConfig));
- nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
+ nLogAsyncMsExtLoggerFactory = LoggerFactory.Create(x => x.AddNLog(nLogAsyncConfig));
+ nLogAsyncMsExtLogger = nLogAsyncMsExtLoggerFactory.CreateLogger();
}
{
- nLogConfigDefault = new NLog.Config.LoggingConfiguration();
- var target = new NLog.Targets.FileTarget("File:Default")
+ nLogConfig = new NLog.Config.LoggingConfiguration();
+ var target = new NLog.Targets.FileTarget("File")
{
- FileName = GetLogFilePath("nlog_default.log"),
- Layout = nLogLayout
+ FileName = GetLogFilePath("nlog.log"),
+ Layout = nLogLayout,
};
- nLogConfigDefault.AddTarget(target);
- nLogConfigDefault.AddRuleForAllLevels(target);
- nLogConfigDefault.LogFactory.Configuration = nLogConfigDefault;
- nLogLoggerDefault = nLogConfigDefault.LogFactory.GetLogger(nameof(WritePlainTextToFile));
+ nLogConfig.AddTarget(target);
+ nLogConfig.AddRuleForAllLevels(target);
+ nLogConfig.LogFactory.Configuration = nLogConfig;
+ nLogLogger = nLogConfig.LogFactory.GetLogger(nameof(WritePlainTextToFile));
- nLogMsExtLoggerFactoryDefault = LoggerFactory.Create(logging => logging.AddNLog(nLogConfigDefault));
- nLogMsExtLoggerDefault = nLogMsExtLoggerFactoryDefault.CreateLogger();
+ nLogMsExtLoggerFactory = LoggerFactory.Create(logging => logging.AddNLog(nLogConfig));
+ nLogMsExtLogger = nLogMsExtLoggerFactory.CreateLogger();
}
// ZeroLog
@@ -176,16 +176,16 @@ public void SetUpLogger()
public void Cleanup()
{
zLoggerFactory?.Dispose();
+ serilogAsyncMsExtLoggerFactory?.Dispose();
serilogMsExtLoggerFactory?.Dispose();
- serilogMsExtLoggerFactoryDefault?.Dispose();
+ nLogAsyncMsExtLoggerFactory?.Dispose();
nLogMsExtLoggerFactory?.Dispose();
- nLogMsExtLoggerFactoryDefault?.Dispose();
+ serilogAsyncLogger?.Dispose();
serilogLogger?.Dispose();
- serilogLoggerDefault?.Dispose();
+ nLogAsyncConfig?.LogFactory?.Shutdown();
nLogConfig?.LogFactory?.Shutdown();
- nLogConfigDefault?.LogFactory?.Shutdown();
ZeroLog.LogManager.Shutdown();
}
@@ -232,121 +232,111 @@ public void ZeroLog_PlainTextFile()
}
[Benchmark]
- public void Serilog_MsExt_PlainTextFile()
+ public void Serilog_Async_MsExt_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_MsExt_SourceGenerator_PlainTextFile()
+ public void Serilog_Async_MsExt_SourceGenerator_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ serilogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- serilogLogger.Dispose();
- serilogMsExtLoggerFactory.Dispose();
+ serilogAsyncLogger.Dispose();
+ serilogAsyncMsExtLoggerFactory.Dispose();
}
[Benchmark]
- public void Serilog_PlainTextFile()
+ public void Serilog_Async_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
+ serilogAsyncLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
MessageSample.Arg3);
}
- serilogLogger.Dispose();
+ serilogAsyncLogger.Dispose();
}
[Benchmark]
- public void Serilog_Default_MsExt_PlainTextFile()
+ public void Serilog_MsExt_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- serilogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
+ serilogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
MessageSample.Arg3);
}
-
- serilogLoggerDefault.Dispose();
- serilogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void Serilog_Default_PlainTextFile()
+ public void Serilog_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- serilogLoggerDefault.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
+ serilogLogger.Information(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
MessageSample.Arg3);
}
-
- serilogLoggerDefault.Dispose();
}
[Benchmark]
- public void NLog_MsExt_PlainTextFile()
+ public void NLog_Async_MsExt_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
+ nLogAsyncMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
MessageSample.Arg3);
}
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_MsExt_SourceGenerator_PlainTextFile()
+ public void NLog_Async_MsExt_SourceGenerator_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
- MessageSample.Arg3);
+ nLogAsyncMsExtLogger.GeneratedLog(MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogMsExtLoggerFactory.Dispose();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_PlainTextFile()
+ public void NLog_Async_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogAsyncLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
- nLogConfig.LogFactory.Shutdown();
+ nLogAsyncConfig.LogFactory.Flush();
}
[Benchmark]
- public void NLog_Default_MsExt_PlainTextFile()
+ public void NLog_MsExt_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- nLogMsExtLoggerDefault.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
+ nLogMsExtLogger.LogInformation(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2,
MessageSample.Arg3);
}
-
- nLogMsExtLoggerFactoryDefault.Dispose();
}
[Benchmark]
- public void NLog_Default_PlainTextFile()
+ public void NLog_PlainTextFile()
{
for (var i = 0; i < N; i++)
{
- nLogLoggerDefault.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
+ nLogLogger.Info(MessageSample.Message, MessageSample.Arg1, MessageSample.Arg2, MessageSample.Arg3);
}
-
- nLogConfigDefault.LogFactory.Shutdown();
}
}
diff --git a/sandbox/Benchmark/Formatters.cs b/sandbox/Benchmark/Formatters.cs
deleted file mode 100644
index 374da64..0000000
--- a/sandbox/Benchmark/Formatters.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System;
-using System.IO;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using Microsoft.Extensions.Logging.Console;
-
-namespace Benchmark;
-
-class BenchmarkPlainTextConsoleFormatter : ConsoleFormatter
-{
- internal class Options : ConsoleFormatterOptions
- {
- }
-
- public BenchmarkPlainTextConsoleFormatter() : base("BenchmarkPlainText")
- {
- }
-
- public override void Write(in LogEntry logEntry, IExternalScopeProvider scopeProvider, TextWriter textWriter)
- {
- var message = logEntry.Formatter.Invoke(logEntry.State, logEntry.Exception);
- textWriter.Write(DateTime.Now);
- textWriter.Write(" [");
- textWriter.Write(logEntry.LogLevel);
- textWriter.Write("] ");
- textWriter.Write(message);
- textWriter.WriteLine();
- }
-}
\ No newline at end of file