如何将 Autofac 与 Serilog 包装器一起使用 class
How to use Autofac with a Serilog wrapper class
不久前,我们开始将我们的记录器从 log4net 替换为 Serilog,以便将我们的日志直接发送到我们的 Elastic
。在我们的项目中,我们使用 Autofac
处理 IOC
。因此,我们最初创建了一个包装器 class (LogSerilog
) 和一个相应的接口 (ILogSerilog
),当在 class LogSerilog
我们配置了 root logger。
public class LogSerilog : ILogSerilog
{
private readonly IElasticConfiguration configuration;
public LogSerilog(IElasticConfiguration configuration)
{
this.configuration = configuration;
Init();
}
public void Init()
{
var logger = new LoggerConfiguration().MinimumLevel.Information().Enrich.WithMachineName();
try
{
logger.WriteTo.Elasticsearch(
this.configuration.GetElasticPath(), typeName: "Serilog");
}
catch (Exception)
{
//Swallow - Elastic is N/A don't wan't to crash. logging won't help since I don't have logger yet :)
}
logger.WriteTo.Log4Net();
Log.Logger = logger.CreateLogger();
}
..........
在那之后我看到了 autofac-serilog-integration Nuget,它似乎是 me.because 的最佳解决方案,它将为我们连接所有上下文。问题是它似乎没有 work.Even 更多,log4net 接收器(我们仍在使用 log4net 在机器中获取日志副本)也不能正常工作!我觉得我在这里做错了什么 - 但我不确定我应该如何解决它。
- 如果我要删除 wrrapper class,我应该在哪里配置根记录器?
- log4net 接收器的问题与包装器无关吗class?
- 如果您看到我以错误的方式接近它,欢迎任何其他提示。
经过一番调查,我找到了问题的答案。
- 如果我要删除 wrrapper class,我应该在哪里配置根记录器?
在主class - 刚好程序开始运行\之前我需要第一次登录。
- 是不是log4net sink的问题跟wrapper无关class?
不,它与对旧 log4net dll 版本的引用有关
- 如果您看到我以错误的方式接近它,欢迎任何其他提示。
Serilog 包装器并没有真正的问题——这不是问题所在——但我确实发现它有问题,因为例如 Autofac Serilog integration
不支持它,你需要提供上下文由你自己。
Serilog 有一个方便的静态 class 用于设置和保留日志配置。
这是我的环境中常见配置的示例:
string SerilogPrefix = "SerilogPrefix";
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings(settingPrefix: SerilogPrefix)
.Enrich.FromLogContext()
.Enrich.WithMemoryUsage()
.Enrich.WithProcessId()
.Enrich.WithThreadId()
.Enrich.WithExceptionDetails()
.Enrich.With(new LogEnricher()) // optional custom class to add properties to the log message
.Filter.With(new SerilogEventFilter()) // optional custom class to filter messages
.CreateLogger();
在 nuget 上查看这些包:
Serilog.Settings.AppSettings
Serilog.Enrichers.Memory
Serilog.Enrichers.Process
Serilog.Enrichers.Thread
Serilog.Sinks.Seq
SerilogMetrics
不久前,我们开始将我们的记录器从 log4net 替换为 Serilog,以便将我们的日志直接发送到我们的 Elastic
。在我们的项目中,我们使用 Autofac
处理 IOC
。因此,我们最初创建了一个包装器 class (LogSerilog
) 和一个相应的接口 (ILogSerilog
),当在 class LogSerilog
我们配置了 root logger。
public class LogSerilog : ILogSerilog
{
private readonly IElasticConfiguration configuration;
public LogSerilog(IElasticConfiguration configuration)
{
this.configuration = configuration;
Init();
}
public void Init()
{
var logger = new LoggerConfiguration().MinimumLevel.Information().Enrich.WithMachineName();
try
{
logger.WriteTo.Elasticsearch(
this.configuration.GetElasticPath(), typeName: "Serilog");
}
catch (Exception)
{
//Swallow - Elastic is N/A don't wan't to crash. logging won't help since I don't have logger yet :)
}
logger.WriteTo.Log4Net();
Log.Logger = logger.CreateLogger();
}
..........
在那之后我看到了 autofac-serilog-integration Nuget,它似乎是 me.because 的最佳解决方案,它将为我们连接所有上下文。问题是它似乎没有 work.Even 更多,log4net 接收器(我们仍在使用 log4net 在机器中获取日志副本)也不能正常工作!我觉得我在这里做错了什么 - 但我不确定我应该如何解决它。
- 如果我要删除 wrrapper class,我应该在哪里配置根记录器?
- log4net 接收器的问题与包装器无关吗class?
- 如果您看到我以错误的方式接近它,欢迎任何其他提示。
经过一番调查,我找到了问题的答案。
- 如果我要删除 wrrapper class,我应该在哪里配置根记录器?
在主class - 刚好程序开始运行\之前我需要第一次登录。 - 是不是log4net sink的问题跟wrapper无关class?
不,它与对旧 log4net dll 版本的引用有关 - 如果您看到我以错误的方式接近它,欢迎任何其他提示。
Serilog 包装器并没有真正的问题——这不是问题所在——但我确实发现它有问题,因为例如Autofac Serilog integration
不支持它,你需要提供上下文由你自己。
Serilog 有一个方便的静态 class 用于设置和保留日志配置。 这是我的环境中常见配置的示例:
string SerilogPrefix = "SerilogPrefix";
Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings(settingPrefix: SerilogPrefix)
.Enrich.FromLogContext()
.Enrich.WithMemoryUsage()
.Enrich.WithProcessId()
.Enrich.WithThreadId()
.Enrich.WithExceptionDetails()
.Enrich.With(new LogEnricher()) // optional custom class to add properties to the log message
.Filter.With(new SerilogEventFilter()) // optional custom class to filter messages
.CreateLogger();
在 nuget 上查看这些包:
Serilog.Settings.AppSettings
Serilog.Enrichers.Memory
Serilog.Enrichers.Process
Serilog.Enrichers.Thread
Serilog.Sinks.Seq
SerilogMetrics