Search code examples
c#.net.net-corenlogilogger

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


Solution

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