Skip to content

Commit

Permalink
#445: Added support for better custom logging (#446)
Browse files Browse the repository at this point in the history
  • Loading branch information
danielpalme committed Sep 10, 2021
1 parent 632daac commit 4433b60
Show file tree
Hide file tree
Showing 5 changed files with 198 additions and 7 deletions.
4 changes: 4 additions & 0 deletions src/Readme.txt
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,10 @@ For further details take a look at LICENSE.txt.

CHANGELOG

4.8.13.0

* New: #445: Added support for better custom logging

4.8.11.0

* New: #426: Added file numbers to class report
Expand Down
11 changes: 4 additions & 7 deletions src/ReportGenerator.Core/Logging/ConsoleLoggerFactory.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Palmmedia.ReportGenerator.Core.Logging
{
Expand All @@ -13,7 +10,7 @@ internal class ConsoleLoggerFactory : ILoggerFactory
/// <summary>
/// The cached logger.
/// </summary>
private static readonly ILogger Logger = new ConsoleLogger();
private readonly ILogger logger = new ConsoleLogger();

/// <summary>
/// Gets or sets the verbosity of console loggers.
Expand All @@ -22,12 +19,12 @@ public VerbosityLevel VerbosityLevel
{
get
{
return Logger.VerbosityLevel;
return this.logger.VerbosityLevel;
}

set
{
Logger.VerbosityLevel = value;
this.logger.VerbosityLevel = value;
}
}

Expand All @@ -36,6 +33,6 @@ public VerbosityLevel VerbosityLevel
/// </summary>
/// <param name="type">The type of the class that uses the logger.</param>
/// <returns>The logger.</returns>
public ILogger GetLogger(Type type) => Logger;
public ILogger GetLogger(Type type) => this.logger;
}
}
129 changes: 129 additions & 0 deletions src/ReportGenerator.Core/Logging/DelegateLogger.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,129 @@
using System;

namespace Palmmedia.ReportGenerator.Core.Logging
{
/// <summary>
/// <see cref="ILogger"/> which executes a delegate.
/// </summary>
internal class DelegateLogger : ILogger
{
/// <summary>
/// The log delegate.
/// </summary>
private Action<VerbosityLevel, string> logDelegate;

/// <summary>
/// Initializes a new instance of the <see cref="DelegateLogger"/> class.
/// </summary>
/// <param name="logDelegate">The log delegate.</param>
public DelegateLogger(Action<VerbosityLevel, string> logDelegate)
{
this.logDelegate = logDelegate ?? throw new ArgumentNullException(nameof(logDelegate));
}

/// <summary>
/// Gets or sets the verbosity level.
/// </summary>
public VerbosityLevel VerbosityLevel { get; set; }

/// <summary>
/// Log a message at DEBUG level.
/// </summary>
/// <param name="message">The message.</param>
public void Debug(string message)
{
if (this.VerbosityLevel < VerbosityLevel.Info)
{
this.logDelegate(this.VerbosityLevel, message);
}
}

/// <summary>
/// Log a formatted message at DEBUG level.
/// </summary>
/// <param name="format">The template string.</param>
/// <param name="args">The arguments.</param>
public void DebugFormat(string format, params object[] args)
{
if (this.VerbosityLevel < VerbosityLevel.Info)
{
this.logDelegate(this.VerbosityLevel, string.Format(format, args));
}
}

/// <summary>
/// Log a message at INFO level.
/// </summary>
/// <param name="message">The message.</param>
public void Info(string message)
{
if (this.VerbosityLevel < VerbosityLevel.Warning)
{
this.logDelegate(this.VerbosityLevel, message);
}
}

/// <summary>
/// Log a formatted message at INFO level.
/// </summary>
/// <param name="format">The template string.</param>
/// <param name="args">The arguments.</param>
public void InfoFormat(string format, params object[] args)
{
if (this.VerbosityLevel < VerbosityLevel.Warning)
{
this.logDelegate(this.VerbosityLevel, string.Format(format, args));
}
}

/// <summary>
/// Log a message at WARN level.
/// </summary>
/// <param name="message">The message.</param>
public void Warn(string message)
{
if (this.VerbosityLevel < VerbosityLevel.Error)
{
this.logDelegate(this.VerbosityLevel, message);
}
}

/// <summary>
/// Log a formatted message at WARN level.
/// </summary>
/// <param name="format">The template string.</param>
/// <param name="args">The arguments.</param>
public void WarnFormat(string format, params object[] args)
{
if (this.VerbosityLevel < VerbosityLevel.Error)
{
this.logDelegate(this.VerbosityLevel, string.Format(format, args));
}
}

/// <summary>
/// Log a message at INFO level.
/// </summary>
/// <param name="message">The message.</param>
public void Error(string message)
{
if (this.VerbosityLevel < VerbosityLevel.Off)
{
this.logDelegate(this.VerbosityLevel, message);
}
}

/// <summary>
/// Log a formatted message at ERROR level.
/// </summary>
/// <param name="format">The template string.</param>
/// <param name="args">The arguments.</param>
public void ErrorFormat(string format, params object[] args)
{
if (this.VerbosityLevel < VerbosityLevel.Off)
{
this.logDelegate(this.VerbosityLevel, string.Format(format, args));
}
}
}
}
52 changes: 52 additions & 0 deletions src/ReportGenerator.Core/Logging/DelegateLoggerFactory.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
using System;

namespace Palmmedia.ReportGenerator.Core.Logging
{
/// <summary>
/// A logger factory creating delegate loggers.
/// </summary>
internal class DelegateLoggerFactory : ILoggerFactory
{
/// <summary>
/// The cached logger.
/// </summary>
private readonly ILogger logger;

/// <summary>
/// Initializes a new instance of the <see cref="DelegateLoggerFactory"/> class.
/// </summary>
/// <param name="logDelegate">The log delegate.</param>
public DelegateLoggerFactory(Action<VerbosityLevel, string> logDelegate)
{
if (logDelegate == null)
{
throw new ArgumentNullException(nameof(logDelegate));
}

this.logger = new DelegateLogger(logDelegate);
}

/// <summary>
/// Gets or sets the verbosity of delegate loggers.
/// </summary>
public VerbosityLevel VerbosityLevel
{
get
{
return this.logger.VerbosityLevel;
}

set
{
this.logger.VerbosityLevel = value;
}
}

/// <summary>
/// Initializes the logger for the given type.
/// </summary>
/// <param name="type">The type of the class that uses the logger.</param>
/// <returns>The logger.</returns>
public ILogger GetLogger(Type type) => this.logger;
}
}
9 changes: 9 additions & 0 deletions src/ReportGenerator.Core/Logging/LoggerFactory.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,15 @@ public static void Configure(ILoggerFactory factory)
innerFactory = factory ?? throw new ArgumentNullException(nameof(factory));
}

/// <summary>
/// Configures the inner logger factory.
/// </summary>
/// <param name="logDelegate">The log delegate.</param>
public static void Configure(Action<VerbosityLevel, string> logDelegate)
{
innerFactory = new DelegateLoggerFactory(logDelegate) ?? throw new ArgumentNullException(nameof(logDelegate));
}

/// <summary>
/// Initializes the logger for the given type.
/// </summary>
Expand Down

0 comments on commit 4433b60

Please sign in to comment.