0

我有一个第三方库,让我有机会NLog通过ILoggerFactory接口进行连接。但是,我想为记录器命名空间添加一个后缀。

以下 ExtensionMethod 目前用于注入NLog.

var factory = LoggerFactory.Create(builder => builder.AddNLog());

目前,命名空间如下所示:

my.custom.library.class1

my.custom.library.class2

my.custom.library.with.inner.subclass

但是,我希望在每个命名空间后面都有例如foo

my.custom.library.class1.foo

my.custom.library.class2.foo

my.custom.library.with.inner.subclass.foo

4

1 回答 1

1

这是一个没有任何过载的快速修复。

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}");
    }
}
于 2021-08-31T08:53:20.817 回答