gpt4 book ai didi

asp.net-core - ILogger 的自定义实现

转载 作者:行者123 更新时间:2023-12-04 15:59:27 25 4
gpt4 key购买 nike

在我的项目中,我经常为我的日志消息添加前缀。

目前我正在这样做

      logger.LogDebug(prefix + " some message");

我认为这将是实现自定义记录器的好方法,在该记录器中我设置了前缀,并且记录器本身在每次记录某些内容时都会附加它。

所以我创建了我的自定义记录器类并实现了 ILogger 接口(interface)。但我不明白如何使用

    public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)

添加前缀的方法(它是自定义记录器类的成员)。

我的完整代码是:

      public class CustomLogger : ILogger
{

private readonly ILogger _logger;
private string _logPrefix;

public CustomLogger(ILogger logger)
{
_logger = logger ?? throw new ArgumentNullException(nameof(logger));
_logPrefix = null;
}

public ILogger SetLogPrefix(string logPrefix)
{
_logPrefix = logPrefix;
return this;
}

public IDisposable BeginScope<TState>(TState state)
{
return _logger.BeginScope(state);
}

public bool IsEnabled(LogLevel logLevel)
{
return _logger.IsEnabled(logLevel);
}

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
_logger.Log(logLevel, eventId, state, exception, formatter);
}

}

最佳答案

我认为您不应该在自定义记录器中调用 _logger。

这将是运行时的循环调用,结果将是“前缀:前缀:前缀:前缀:前缀:前缀:前缀:前缀:...”

简单地说,您可以创建一个简单的记录器并实现一个日志写入器,例如控制台、数据库写入器、log4net...

现在首先,您应该更改自定义记录器,如下所示:

    public class CustomLogger : ILogger
{
private readonly string CategoryName;
private readonly string _logPrefix;

public CustomLogger(string categoryName, string logPrefix)
{
CategoryName = categoryName;
_logPrefix = logPrefix;
}

public IDisposable BeginScope<TState>(TState state)
{
return new NoopDisposable();
}

public bool IsEnabled(LogLevel logLevel)
{
return true;
}

public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
string message = _logPrefix;
if (formatter != null)
{
message += formatter(state, exception);
}
// Implement log writter as you want. I am using Console
Console.WriteLine($"{logLevel.ToString()} - {eventId.Id} - {CategoryName} - {message}");
}

private class NoopDisposable : IDisposable
{
public void Dispose()
{
}
}
}

第二步,创建一个logger provider:

     public class LoggerProvider : ILoggerProvider
{
public ILogger CreateLogger(string categoryName)
{
return new CustomLogger(categoryName, "This is prefix: ");
}

public void Dispose()
{
}
}

第三步,在从 Startup.cs 配置中:

    loggerFactory.AddProvider(new MicroserviceLoggerProvider());

关于asp.net-core - ILogger 的自定义实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53494199/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com