我目前正在尝试更改系统配置以使用 Serilog (而不是使用FileBeat作为LogStash的托运人)
我们还在各种查询中使用日志类型字段(在FileBeat配置文件中很容易配置)以及在Elastic上索引日志。
问题是当使用Serilog时我们得到默认类型 logevent ,而我找不到我可以配置它的位置。 我想有一个选项来确定每个Serilog实例的特定日志类型。 目前我设法只为所有日志提供了同类型。
我的Serilop配置是:
var path = GetLogPath();
var logger = new LoggerConfiguration()
.MinimumLevel.Information()
.Enrich.WithMachineName()
.Enrich.WithProperty("RequestId", Guid.NewGuid())
.WriteTo.RollingFile(
pathFormat: path,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u4}] [{RequestId}] {Message}{NewLine}{Exception}", buffered: false, shared: true);
logger.WriteTo.Elasticsearch(
new ElasticsearchSinkOptions(new Uri(this.configurationService.ElasticSearchUrl())));
如何更改日志类型?
修改
经过一些调查后,我发现我想更改LoggerConfiguration中的 typeName 字段,似乎我只能通过AppConfig文件来执行此操作,如果我愿意的话更改它,更改将影响所有记录器实例。
我错过了什么吗?
答案 0 :(得分:2)
只需为Elasticsearch接收器使用另一个重载:
var path = GetLogPath();
var logger = new LoggerConfiguration()
.MinimumLevel.Information()
.Enrich.WithMachineName()
.Enrich.WithProperty("RequestId", Guid.NewGuid())
.WriteTo.RollingFile(
pathFormat: path,
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss} [{Level:u4}] [{RequestId}] {Message}{NewLine}{Exception}", buffered: false, shared: true);
logger.WriteTo.Elasticsearch(
this.configurationService.ElasticSearchUrl(), typeName: "type");
因此您不必在appsettings中指定typeName,也不会影响所有实例。
答案 1 :(得分:1)
要向记录器添加属性和值,可以使用Contextual logging and Enrichment
内容记录器
将上下文属性附加到日志事件的最简单,最直接的方法
首先初始化您的记录器:
Log.Logger = new LoggerConfiguration().ReadFrom.AppSettings().CreateLogger();
然后您可以创建上下文记录器:
// adding Log Context
var StudentLogger = Log.Logger.ForContext<Student>();
StudentLogger.Error(/* log message */);
或者您可以使用关联日志条目:
// correlation Log Entries
var orderId = "some value";
var corrLog = Log.Logger.ForContext("orderId", orderId)
corrLog.Error(/* log message */);
<强>富集强>
在某些情况下,我们希望记录器创建的每个事件都可以携带 相同的,固定的,财产价值。应用程序示例是其中之一 这些
Serilog在a级别提供Enrich.WithProperty() LoggerConfiguration:
Log.Logger = new LoggerConfiguration()
.Enrich.WithProperty("Application", "e-Commerce")
.Enrich.WithProperty("Environment", ConfigurationManager.AppSettings["Environment"])
// Other logger configuration
有两种配置Serilog的方法:
使用API (需要serilog.sinks.elasticsearch包):
var loggerConfig = new LoggerConfiguration()
.MinimumLevel.Debug()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200") ){
AutoRegisterTemplate = true,
});
var logger = loggerConfig.CreateLogger();
使用AppSettings中的配置(除serilog.sinks.elasticsearch外还需要Serilog.Settings.AppSettings)
这样,您将所有设置都放在AppSetting文件中,例如
<appSettings>
<add key="serilog:using" value="Serilog.Sinks.Elasticsearch"/>
<add key="serilog:write-to:Elasticsearch.nodeUris" value="http://localhost:9200;http://remotehost:9200"/>
<add key="serilog:write-to:Elasticsearch.indexFormat" value="custom-index-{0:yyyy.MM}"/>
<add key="serilog:write-to:Elasticsearch.templateName" value="myCustomTemplate"/>
</appSettings>
告诉serilog从appSettigns
读取配置Log.Logger = new LoggerConfiguration()
.ReadFrom.AppSettings()
... // Other configuration here, then
.CreateLogger()
请参阅:AppSetting和ElasticSearch Configure Sink
我不确定您指的是哪种日志事件类型?在我的例子中,我在记录错误的同时传递了对象类型:
catch (Exception ex)
{
Logger.Error(ex, string.Format("Exception occured in Controller: {0}, Action: Post.", this.GetType()), this.GetType());
答案 2 :(得分:0)
另一种选择是创建一个全局加载器静态类。定义多个 ILogger 字段,一个用于错误,另一个用于诊断等等。配置静态构造函数中的字段。然后创建几个公共方法,WriteError()、WriteDebug()、WriteInfo() 等等。例如,当从 WriteDebug(logDetail) 方法调用 ILogger.Write(LogEventLevel.Debug, logDetail) 时,您将能够决定 LogEventLevel。