Dominic Jonas
Dominic Jonas

Reputation: 5015

NLog set custom logger namespace suffix when using ILoggerFactory / ILoggingBuilder

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

Upvotes: 0

Views: 415

Answers (1)

Dominic Jonas
Dominic Jonas

Reputation: 5015

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}");
    }
}

Upvotes: 1

Related Questions