项目作者: daredever

项目描述 :
Extensions and wrapper for default .NET ILogger for solving unnecessary allocations issues
高级语言: C#
项目地址: git://github.com/daredever/PerformanceLogging.git
创建时间: 2020-05-17T06:06:58Z
项目社区:https://github.com/daredever/PerformanceLogging

开源协议:MIT License

下载


Performance logging NuGet Version

Extensions and wrapper for default .NET ILogger. Designed to increase performance by more accurate work with strings.

This project, as well as the examples below, was inspired by JetBrains.RD framework logging component.

Use extensions for short-lived services (common way):

  1. using PerformanceLogging;
  2. logger.Trace()?.Log("Message.");
  3. logger.Debug()?.Log($"Message: {GetMessage()}.");
  4. logger.Info()?.Log("Message: {message}.", "log message");
  5. logger.Warn()?.Log("Message: {message}.", GetMessage());
  6. logger.Error()?.Log("Message: {message}, {anotherMessage}.", "log message", GetMessage());
  7. logger.Critical()?.Log("Message: part{part1}, part{part2}.", 1, 2);

or

Wrap logger for long-lived reusable services and plenty of logging:

  1. using PerformanceLogging;
  2. var wrappedLogger = logger.Wrap();
  3. wrappedLogger.Trace?.Log("Message.");
  4. wrappedLogger.Debug?.Log($"Message: {GetMessage()}.");
  5. wrappedLogger.Info?.Log("Message: {message}.", "log message");
  6. wrappedLogger.Warn?.Log("Message: {message}.", GetMessage());
  7. wrappedLogger.Error?.Log("Message: {message}, {anotherMessage}.", "log message", GetMessage());
  8. wrappedLogger.Critical?.Log("Message: part{part1}, part{part2}.", 1, 2);

See also, some usage examples in Demo folder.

Benchmarks

Trace logging with specified log message (1000 log messages).

See benchmark’s full report
and source.

Method MinLogLevel Mean Error Ratio Gen 0 Gen 1 Gen 2 Allocated
logger.LogTrace() Trace 142,469.45 ns 550.393 ns 1.00 12.4512 - - 79200 B
if(TraceEnabled){logger.LogTrace()} Trace 157,030.51 ns 604.003 ns 1.10 12.4512 - - 79200 B
logger.Trace()?.Log() Trace 154,799.17 ns 399.695 ns 1.09 12.4512 - - 79200 B
wrappedLogger.Trace?.Log() Trace 153,710.00 ns 336.233 ns 1.08 12.4512 - - 79200 B
logger.LogTrace() Debug 132,921.32 ns 459.185 ns 1.00 12.4512 - - 79200 B
if(TraceEnabled){logger.LogTrace()} Debug 5,857.41 ns 14.172 ns 0.04 - - - -
logger.Trace()?.Log() Debug 6,783.43 ns 14.028 ns 0.05 - - - -
wrappedLogger.Trace?.Log() Debug 3,985.49 ns 10.370 ns 0.03 - - - -

Trace logging with formatted log message (1000 log messages).

See benchmark’s full report
and source.

Method MinLogLevel Mean Error Ratio Gen 0 Gen 1 Gen 2 Allocated
logger.LogTrace() Trace 84,242.975 ns 171.9278 ns 1.00 8.9111 - - 56000 B
if(TraceEnabled){logger.LogTrace()} Trace 92,538.049 ns 158.2325 ns 1.10 8.9111 - - 56000 B
logger.Trace()?.Log() Trace 94,536.405 ns 95.2812 ns 1.12 8.9111 - - 56000 B
wrappedLogger.Trace?.Log() Trace 87,847.457 ns 103.4875 ns 1.04 8.9111 - - 56000 B
logger.LogTrace() Debug 73,142.684 ns 98.5258 ns 1.00 8.9111 - - 56000 B
if(TraceEnabled){logger.LogTrace()} Debug 6,137.874 ns 27.6830 ns 0.08 - - - -
logger.Trace()?.Log() Debug 6,365.255 ns 5.6625 ns 0.09 - - - -
wrappedLogger.Trace?.Log() Debug 5,210.616 ns 3.4169 ns 0.07 - - - -