如何使用字段将 Serilog 数据发送到 Elasticsearch
How to send Serilog data to Elasticsearch with fields
我是 ES 和 Serilog 的新手,但我的搜索还没有产生这个答案。我想弄清楚如何使用 Serilog 以这种方式将数据发送到 Elasticsearch,如果数据包含字段(例如,如果它是具有 public 属性的对象),则数据会显示在 ES 中将这些属性作为字段。到目前为止,我已经使用 RenderedCompactJsonFormatter 和匿名类型来实现这个 mostly(见下文),但仍然会生成命名字段,其中字段中的数据是除了匿名类型声明的 "new" 部分之外的所有内容:
var log = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/test_srpostimes"))
{
InlineFields = true,
IndexDecider = (@event,offset) => "test_elapsedtimes",
CustomFormatter = new RenderedCompactJsonFormatter()
})
.WriteTo.Console()
.CreateLogger();
var elapsedTime = new {Time = 64};
var timeStamp = new {Timestamp = DateTime.Now};
var transID = new {TransID = "551674"};
log.Information("{timeStamp} {transID} {elapsedTime}", timeStamp, transID, elapsedTime);
这会产生:
@t:
2016-07-11T18:45:35.0349343Z
@m:
"{ Timestamp = 7/11/2016 2:45:35 PM }" "{ TransID = 551674 }" "{ Time = 64 }"
@i:
b3ee2c05
timeStamp:
{ Timestamp = 7/11/2016 2:45:35 PM }
transID:
{ TransID = 551674 }
elapsedTime:
{ Time = 64 }
_id:
AVXbR11WjgSgCs5HSlYY
_type:
logevent
_index:
test_srpostimes
_score:
1
是否有更好的方法来做到这一点,以便我们的数据可以 searched/visualized 使用 ES(和 Kibana)中的字段?
我明白了。我更改了构造以使用 ElasticsearchJsonFormatter。由于记录器似乎能够从消息中解析字段名称,因此我切换到一个对象并传入属性:
var log = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/test_srpostimes"))
{
IndexDecider = (@event,offset) => "test_elapsedtimes",
CustomFormatter = new ElasticsearchJsonFormatter()
})
.WriteTo.Console()
.CreateLogger();
var elapsedTimeMessage = new ElapsedTimeMessage(DateTime.Now.Millisecond);
log.Information("{EventTime} {EventId} {ElapsedTime}", elapsedTimeMessage.EventTime, elapsedTimeMessage.EventId, elapsedTimeMessage.ElapsedTime);
这在 ES 中产生了更具可读性的输出:
"_source": {
"@timestamp": "2016-07-12T09:03:21.5804873-04:00",
"level": "Information",
"messageTemplate": "{EventTime} {EventId} {ElapsedTime}",
"fields": {
"EventTime": "2016-07-12T09:03:21.5754873-04:00",
"EventId": "575",
"ElapsedTime": 575
}
}
我是 ES 和 Serilog 的新手,但我的搜索还没有产生这个答案。我想弄清楚如何使用 Serilog 以这种方式将数据发送到 Elasticsearch,如果数据包含字段(例如,如果它是具有 public 属性的对象),则数据会显示在 ES 中将这些属性作为字段。到目前为止,我已经使用 RenderedCompactJsonFormatter 和匿名类型来实现这个 mostly(见下文),但仍然会生成命名字段,其中字段中的数据是除了匿名类型声明的 "new" 部分之外的所有内容:
var log = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/test_srpostimes"))
{
InlineFields = true,
IndexDecider = (@event,offset) => "test_elapsedtimes",
CustomFormatter = new RenderedCompactJsonFormatter()
})
.WriteTo.Console()
.CreateLogger();
var elapsedTime = new {Time = 64};
var timeStamp = new {Timestamp = DateTime.Now};
var transID = new {TransID = "551674"};
log.Information("{timeStamp} {transID} {elapsedTime}", timeStamp, transID, elapsedTime);
这会产生:
@t:
2016-07-11T18:45:35.0349343Z
@m:
"{ Timestamp = 7/11/2016 2:45:35 PM }" "{ TransID = 551674 }" "{ Time = 64 }"
@i:
b3ee2c05
timeStamp:
{ Timestamp = 7/11/2016 2:45:35 PM }
transID:
{ TransID = 551674 }
elapsedTime:
{ Time = 64 }
_id:
AVXbR11WjgSgCs5HSlYY
_type:
logevent
_index:
test_srpostimes
_score:
1
是否有更好的方法来做到这一点,以便我们的数据可以 searched/visualized 使用 ES(和 Kibana)中的字段?
我明白了。我更改了构造以使用 ElasticsearchJsonFormatter。由于记录器似乎能够从消息中解析字段名称,因此我切换到一个对象并传入属性:
var log = new LoggerConfiguration()
.MinimumLevel.Information()
.WriteTo.Elasticsearch(new ElasticsearchSinkOptions(new Uri("http://localhost:9200/test_srpostimes"))
{
IndexDecider = (@event,offset) => "test_elapsedtimes",
CustomFormatter = new ElasticsearchJsonFormatter()
})
.WriteTo.Console()
.CreateLogger();
var elapsedTimeMessage = new ElapsedTimeMessage(DateTime.Now.Millisecond);
log.Information("{EventTime} {EventId} {ElapsedTime}", elapsedTimeMessage.EventTime, elapsedTimeMessage.EventId, elapsedTimeMessage.ElapsedTime);
这在 ES 中产生了更具可读性的输出:
"_source": {
"@timestamp": "2016-07-12T09:03:21.5804873-04:00",
"level": "Information",
"messageTemplate": "{EventTime} {EventId} {ElapsedTime}",
"fields": {
"EventTime": "2016-07-12T09:03:21.5754873-04:00",
"EventId": "575",
"ElapsedTime": 575
}
}