I have a third-party library that gives me the opportunity to connect NLog
via an ILoggerFactory
interface.
However, I would like to add a suffix to the logger namespace.
The following ExtensionMethod is currently used to inject NLog
.
var factory = LoggerFactory.Create(builder => builder.AddNLog());
Currently, a namespace looks like this:
my.custom.library.class1
my.custom.library.class2
my.custom.library.with.inner.subclass
However, I would like that behind every namespace there is e.g. foo
my.custom.library.class1.foo
my.custom.library.class2.foo
my.custom.library.with.inner.subclass.foo
Here's a quick fix without any overloads.
var factory = LoggerFactory.Create(builder => builder.AddNLogWithSuffix(_IpSuffix));
public static class LoggingBuilderExtensions
{
public static void AddNLogWithSuffix(this ILoggingBuilder builder, string loggerSuffix)
{
builder.Services.TryAddEnumerable(ServiceDescriptor.Singleton<ILoggerProvider, NLogLoggerProviderWithSuffix>(_ => new NLogLoggerProviderWithSuffix(new NLogProviderOptions(), LogManager.LogFactory, loggerSuffix)));
}
}
[ProviderAlias("NLog")]
public class NLogLoggerProviderWithSuffix : ILoggerProvider
{
private readonly NLogLoggerProvider _NLogLoggerProvider;
private readonly string _LoggerSuffix;
/// <summary>New provider with options and a suffix</summary>
/// <param name="options"></param>
/// <param name="logFactory">Optional isolated NLog LogFactory</param>
/// <param name="loggerSuffix"></param>
public NLogLoggerProviderWithSuffix(NLogProviderOptions options, LogFactory logFactory, string loggerSuffix)
{
_LoggerSuffix = loggerSuffix;
_NLogLoggerProvider = new NLogLoggerProvider(options, logFactory);
}
public void Dispose()
{
_NLogLoggerProvider.Dispose();
}
public ILogger CreateLogger(string categoryName)
{
return _NLogLoggerProvider.CreateLogger($"{categoryName}.{_LoggerSuffix}");
}
}