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