使用serilog直接将日志写入elasticsearch是否一个好主意
Posted
技术标签:
【中文标题】使用serilog直接将日志写入elasticsearch是否一个好主意【英文标题】:Is it a good idea to use serilog to write logs directly to the elasticsearch使用serilog直接将日志写入elasticsearch是不是一个好主意 【发布时间】:2018-11-13 21:15:25 【问题描述】:我正在评估有关分布式日志服务器的不同选项。
如我所见,在 Java 世界中,最流行的解决方案是 filebeat + kafka + logstash + elasticsearch + kibana。
但是,在 .NET 世界中,有一个 serilog 可以将结构日志直接发送到 elasticsearch。所以唯一需要的组件就是 elasticsearch + kibana。
我进行了很多搜索,但在生产中没有太多关于此解决方案的信息。我不知道它是否足以处理大量日志。
谁能给我一些建议?谢谢。
【问题讨论】:
【参考方案1】:我遇到了同样的问题正是。我们的系统使用“经典”elk-stack
架构,即 FileBeat -> LogStash -> Elastic (->Kibana)。
但正如我们在具有大量日志的大型项目中发现的那样,Serilog 是更好的解决方案,原因如下:
-
CI\CD - 当你有不同类型的不同结构的日志,你想拥有不同的类型时,
Serilog
power 会派上用场。在LogStash
中,您需要创建一个不同的过滤器来根据模式分解消息。这意味着在日志结构方面和LogStash
方面存在很大的耦合——非常容易出错。
维护——CI\CD简单,单点变更,维护大量日志更容易。
可扩展性 - FileBeat
在处理大块数据时遇到问题,因为注册表文件容易“爆炸” - 个人经验参考stack overflow flow question ; elastic-forum question
更少的故障点 - 使用 serilog 时,日志直接发送到弹性,而使用 Filebeat
您必须通过 LogStash
。又多了一个失败的地方。
希望对您的评价有所帮助。
【讨论】:
我对这个答案的第二点提出了额外的意见:5. 成本 - 与仅扩展您的应用程序相比,使用其他应用程序(如 logstash 和/或节拍)与一些队列机制(如 SQS)混合使用会大大增加成本和弹性集群。【参考方案2】:更新(2021 年 12 月):
Elasticsearch 记录器提供程序已移至 Elastic ECS DotNet 项目。
在此处查找最新版本:https://github.com/elastic/ecs-dotnet/blob/master/src/Elasticsearch.Extensions.Logging/ReadMe.md
nuget 包在这里:https://www.nuget.org/packages/Elasticsearch.Extensions.Logging/1.6.0-alpha1
它仍被标记为 alpha 版本(尽管它比 Essential 的版本具有更多功能),因此目前(2021 年 12 月)您需要在添加包时指定版本:
dotnet add package Elasticsearch.Extensions.Logging --version 1.6.0-alpha1
免责声明: 我是作者
原始答案
现在还有一个独立的记录器提供程序,可以将 .NET Core 日志记录直接写入 Elasticsearch,遵循 Elasticsearch 通用架构 (ECS) 字段规范 https://github.com/sgryphon/essential-logging/tree/master/src/Essential.LoggerProvider.Elasticsearch
要在您的 .NET Core 应用程序中使用它,请添加对 Essential.LoggerProvider.Elasticsearch 包的引用:
dotnet add package Essential.LoggerProvider.Elasticsearch
然后,在主机构建期间,使用提供的扩展方法将提供程序添加到 loggingBuilder。
using Essential.LoggerProvider;
// ...
.ConfigureLogging((hostContext, loggingBuilder) =>
loggingBuilder.AddElasticsearch();
)
默认配置将写入运行在 http://localhost:9200/ 的本地 Elasticsearch。
一旦您发送了一些日志事件,打开 Kibana(例如 http://localhost:5601/)并使用时间过滤器“@timestamp”为“dotnet-*”定义一个索引模式。
这进一步减少了依赖关系,而不是引入整个 Serilog 基础架构(应用程序 -> Microsoft ILogger -> Serilog 提供程序/适配器 -> Elasticsearch 接收器 -> Elasticsearch),而您现在只有(应用程序 -> Microsoft ILogger - > Elasticsearch 提供者 -> Elasticsearch)。
ElasticsearchLoggerProvider 还按照 Elasticsearch Common Schema (ECS) 约定写入事件,因此与从其他来源记录的事件兼容,例如节拍。
【讨论】:
类似github.com/amccool/AM.Extensions.Logging.ElasticSearch以上是关于使用serilog直接将日志写入elasticsearch是否一个好主意的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET Core 2.2 中使用 InProcess 托管模型时,Serilog 不会将日志写入文件