Serilog ILogger 到 Microsoft ILogger?
Serilog ILogger to Microsoft ILogger?
我通常使用 Serilog 和 ILogger 进行注入,但在这种情况下,我不得不像这样创建自己的 ILogger :
private static readonly ILogger _logger = Serilog.Log.ForContext<MyClass>() as ILogger;
但是我确实需要 Microsoft ILogger,有什么方法可以从 Serilog 创建 Microsoft ILogger 或将现有的 Serilog ILogger 转换为 Microsoft ILogger?
编辑 1: 需要说明的是,该项目是一个 .net 微服务,它使用“IHostBuilder.UseSerilog”将 Microsoft ILogger 的注入提供给 类.但是,在这种特定情况下,我不能注入 ILogger,这会产生循环关系。所以要解决这个问题,我必须在上下文中手动创建它(上面的示例)。
问题是这会创建一个 Serilog ILogger,而我需要使用的方法采用 Microsoft ILogger。
因此,要么我需要将 Serilog ILogger 转换为 Microsoft ILogger,要么更好,获取 Serilog 以创建 Microsoft 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”。它现在越来越倾向于从这部分代码中排除日志记录。
我没有找到从 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;
}
}
我通常使用 Serilog 和 ILogger 进行注入,但在这种情况下,我不得不像这样创建自己的 ILogger :
private static readonly ILogger _logger = Serilog.Log.ForContext<MyClass>() as ILogger;
但是我确实需要 Microsoft ILogger,有什么方法可以从 Serilog 创建 Microsoft ILogger 或将现有的 Serilog ILogger 转换为 Microsoft ILogger?
编辑 1: 需要说明的是,该项目是一个 .net 微服务,它使用“IHostBuilder.UseSerilog”将 Microsoft ILogger 的注入提供给 类.但是,在这种特定情况下,我不能注入 ILogger,这会产生循环关系。所以要解决这个问题,我必须在上下文中手动创建它(上面的示例)。
问题是这会创建一个 Serilog ILogger,而我需要使用的方法采用 Microsoft ILogger。
因此,要么我需要将 Serilog ILogger 转换为 Microsoft ILogger,要么更好,获取 Serilog 以创建 Microsoft 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”。它现在越来越倾向于从这部分代码中排除日志记录。
我没有找到从 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;
}
}