我们开始将Serilog与Elasticsearch结合使用,这是一种非常有效的存储结构化日志数据的方法(稍后使用Kibana等工具将它们可视化)。但是,我看到了不直接将日志数据写入后端而是配置日志代理(如Logstash)的好处,它可以负责向日志消息添加标记、选择索引等。通过这种设置,应用程序不需要了解日志数据分布。
Logstash在中间的问题是什么Serilog接收器是最好的,这样Logstash可以导入它的数据,而不应用高级和cpu密集型过滤器。我看到有人提到Redis是Logstash的好伙伴,但是Serilog没有Redis接收器。对于Serilog sink,哪些数据可以很容易地通过Logstash传输到Elasticsearch索引,有什么建议吗?
甚至有一种方法可以先使用Elasticsearch sink,然后在进行一些安排并应用额外的标签后再次将其环回到Elasticsearch。
接受的答案是在接收器serilog . sink . http存在之前编写的。
与其将日志记录到文件并让Filebeat监视它,不如让HTTP接收器将日志事件发送到Logstash HTTP输入插件。这将意味着在创建日志的实例上移动的部分更少。
我收到Nicholas Blumhardt (Serilog创建者)的建议,将RollingFileSink与JsonFormatter结合使用。
我为Serilog创建了一个支持RabbitMQ的接收器,使用logstash的RabbitMQ input-plugin:
https://www.nuget.org/packages/Serilog.Sinks.RabbitMQ如果你在应用服务器上运行一个RabbitMQ实例,那么你可以使用RabbitMQSink使用Serilog记录到这个RabbitMQ实例,最终绕过网络隔离/下行场景。
当网络恢复时,Logstash将从队列中获取消息。
更新:Sink现在是V2.0并且支持ASP。. NET Core 1.0
也许最新的答案是:
使用ElasticSearch Sink
它包含了一个持久性模式,这样即使应用程序离线,日志也不会丢失。
我使用这个解决方案,并为我工作。
1- Logstash与管道:
input {
http {
host => "0.0.0.0"
port => 31000
codec => json
}
}
#filter {
#
#}
output {
#stdout {}
elasticsearch {
hosts => ["127.0.0.1:9200"]
index => "logstash-%{+YYYY.MM.dd}"
}
}
2-Serilog config as:
{
"Serilog": {
"Using": [ "Serilog.Sinks.Http" ],
"MinimumLevel": "Information",
"WriteTo": [
{
"Name": "Async",
"Args": {
"bufferSize": 10000000,
"configure": [
{
"Name": "Http",
"Args": {
"requestUri": "http://127.0.0.1:31000",
"textFormatter": "Serilog.Formatting.Elasticsearch.ElasticsearchJsonFormatter, Serilog.Formatting.Elasticsearch",
"batchFormatter": "Serilog.Sinks.Http.BatchFormatters.ArrayBatchFormatter, Serilog.Sinks.Http"
}
}
]
}
}
],
"Properties": {
"Application": "Test1"
}
},
"AllowedHosts": "*"
}