前一段时间,我们开始将记录器从log4net替换为Serilog,以便将日志直接发送到Elastic
。在我们的项目中,我们正在使用IOC
与Autofac
一起工作。因此,当我们在类LogSerilog
中配置 root时,我们最初创建了一个包装类(ILogSerilog
)和一个相应的接口(LogSerilog
),并将其添加到构建器中。记录器。
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似乎是对我来说最好的解决方案,因为它将为我们提供所有上下文。问题在于它似乎不起作用,甚至更多,log4net接收器(我们仍在使用log4net在计算机中拥有日志副本)也不起作用!我觉得我在这里做错了什么-但我不确定应该如何解决。
答案 0 :(得分:0)
经过调查,我找到了问题的答案。
Autofac Serilog integration
不支持它,并且您需要通过您自己的。 答案 1 :(得分:0)
Serilog有一个方便的静态类,用于设置和保留日志配置。 这是我的环境中常见配置的示例:
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