我通常将注入与Serilog和ILogger结合使用,但在这种情况下,我不得不创建自己的ILogger,如下所示:
private static readonly ILogger _logger = Serilog.Log.ForContext<MyClass>() as ILogger;然而,我确实需要一个微软ILogger,是否有任何方法从Serilog创建微软ILogger,或者将现有的ILogger转换为ILogger?
编辑1:说得很清楚,该项目是一个使用"IHostBuilder.UseSerilog“将微软ILogger注入到类的.net微服务。但是,在这种特殊情况下,我不能注入ILogger,这将创建一个循环关系。因此,要解决这个问题,我必须在上下文中手动创建它(上面的例子)。
问题是,这会创建一个Serilog ILogger,而我需要使用的方法则是一个ILogger。
因此,要么我需要将Serilog ILogger转换为ILogger,或者更好的是让Serilog创建一个ILogger。
实际上,如果我能够避免在代码中添加更多的Serilog内容,那么如果以后需要切换日志系统,就会更加困难。
编辑2:
我试过这样做:
var logger1 = Serilog.Log.ForContext<MessageQueueSink>() as Serilog.ILogger;
logger1.Information("test1");
var loggerFactorytest = new LoggerFactory()
.AddSerilog(logger1);
var logger2 = loggerFactory.CreateLogger("Logger");
logger2.LogInformation("test2");第一个"test1“显示在输出中,但"test2”不显示。现在,它越来越倾向于将日志记录排除在代码的这一部分之外。
发布于 2022-03-08 10:43:59
我没有找到从Serilog获取MS ILogger或将Serilog ILogger转换为MS ILogger的方法,所以我创建了一个定制的MS ILogger,它像这样包装了一个Serilog ILogger:
public class CustomSerilogger : Microsoft.Extensions.Logging.ILogger
{
private readonly ILogger _logger;
public CustomSerilogger(ILogger logger)
{ _logger = logger; }
public IDisposable BeginScope<TState>(TState state) => default!;
public bool IsEnabled(Microsoft.Extensions.Logging.LogLevel logLevel) { return _logger.IsEnabled(LogLevelToLogEventLevel(logLevel)); }
public void Log<TState>(Microsoft.Extensions.Logging.LogLevel logLevel, Microsoft.Extensions.Logging.EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
{
if (!IsEnabled(logLevel))
return;
_logger.Write(LogLevelToLogEventLevel(logLevel), exception, state.ToString());
}
private LogEventLevel LogLevelToLogEventLevel(Microsoft.Extensions.Logging.LogLevel loglevel)
{
switch(loglevel)
{
case Microsoft.Extensions.Logging.LogLevel.Debug:
return LogEventLevel.Debug;
case Microsoft.Extensions.Logging.LogLevel.Information:
return LogEventLevel.Information;
case Microsoft.Extensions.Logging.LogLevel.Warning:
return LogEventLevel.Warning;
case Microsoft.Extensions.Logging.LogLevel.Error:
return LogEventLevel.Error;
case Microsoft.Extensions.Logging.LogLevel.Critical:
return LogEventLevel.Fatal;
case Microsoft.Extensions.Logging.LogLevel.None:
return LogEventLevel.Verbose;
case Microsoft.Extensions.Logging.LogLevel.Trace:
return LogEventLevel.Verbose;
}
return LogEventLevel.Verbose;
}
}https://stackoverflow.com/questions/71350624
复制相似问题