哪个 Serilog 接收器用于发送到 Logstash?

Posted

技术标签:

【中文标题】哪个 Serilog 接收器用于发送到 Logstash?【英文标题】:Which Serilog sink to use for sending to Logstash? 【发布时间】:2014-10-06 16:05:28 【问题描述】:

我们开始将 Serilog 与 Elasticsearch 结合使用,这是一种非常有效的存储结构日志数据的方法(后来使用 Kibana 等工具将它们可视化)。但是,我看到了不将日志数据直接写入后端而是配置日志代理(例如 Logstash)的优势,该代理可以负责将标签添加到日志消息、选择索引等。通过此设置,应用程序将不需要具备相关知识日志数据分布。

Logstash 在中间,问题是最好使用哪种 Serilog 接收器,以便 Logstash 可以在不应用高级和 CPU 密集型过滤器的情况下导入其数据。我已经看到 Redis 被认为是 Logstash 的好伴侣,但是 Serilog 没有 Redis 接收器。对 Serilog 接收器有什么建议,哪些数据可以通过 Logstash 轻松传输到 Elasticsearch 索引?

甚至还有一种方法是先使用 Elasticsearch sink,然后在经过一些安排并应用额外的标签后再次将其环回 Elasticsearch。

【问题讨论】:

【参考方案1】:

接受的答案是在接收器Serilog.Sinks.Http 存在之前编写的。

可以让 HTTP 接收器将日志事件发布到 Logstash HTTP input plugin,而不是记录到文件并让 Filebeat 监视它。这意味着创建日志的实例上的移动部件更少。

【讨论】:

会要求 OP 将他接受的答案更改为这个。 如果暂时无法访问logstash怎么办?你不会丢失你的日志吗?所以 Filebeat 更有意义。 HTTP 接收器可以是持久的,防止丢失日志事件。请查看它的文档。 对我很有帮助。谢谢@FantasticFiasco【参考方案2】:

我收到了 Nicholas Blumhardt(Serilog 创建者)的建议,建议将 RollingFileSink 与 JsonFormatter 结合使用。

【讨论】:

是的!我只需要找出记录异常的最佳方法,但这是另一个问题的答案。 ...大概是用伐木工人运送? RollingFileSink 将日志保存到文件中。如何使用它将日志传输到 Logstash? filebeat 可以将文件中的日志发送到 logstash。 elastic.co/products/beats/filebeat 我们可以自定义 JSON 的格式吗,我们希望所有元素在 JSON 中处于同一级别。我只能用实现ELK的团队不接受的属性elemet进行配置。【参考方案3】:

我已经为支持 RabbitMQ 的 Serilog 创建了一个接收器,它使用 logstash 的 rabbitmq 输入插件非常好地与 logstash 关联:

https://www.nuget.org/packages/Serilog.Sinks.RabbitMQ

如果您在应用服务器上运行 RabbitMQ 实例,则可以使用 RabbitMQSink 通过 Serilog 登录到该 RabbitMQ 实例,最终绕过网络隔离/停机场景。

当网络备份时,Logstash 将在队列中提取消息。

更新:Sink 现在是 V2.0 并支持 ASP.NET Core 1.0

【讨论】:

【参考方案4】:

也许最新的答案是:

使用ElasticSearch Sink。

它确实包含durability mode,因此如果应用程序离线,日志不会丢失。

【讨论】:

如果你想跨多个传入日志重用过滤和处理设置,引入 Logstash 似乎仍然是一个有效的举措......我认为这个接收器与开箱即用的 Logstash 不兼容。 . 所以不确定这是否可以作为答案...... @chaami 正确 - 这个接收器目前与 LogStash 不兼容,但我认为答案应该保留,因为对于那些来寻找并意识到他们实际上只是想直接与 ElasticSearch 通信的人来说可能是相关的.此外,我怀疑以后可能会支持 LogStash,因为 Beats 可以同时与 LogStash 和 ElasticSearch 通信。【参考方案5】:

我使用了这个解决方案并为我工作。 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 配置为:


  "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": "*"

【讨论】:

以上是关于哪个 Serilog 接收器用于发送到 Logstash?的主要内容,如果未能解决你的问题,请参考以下文章

关于c#:Filter Serilog日志取决于上下文源到不同的接收器?

每个功能的 serilog 多个实例

Serilog:无法使用 MongoDb 接收器登录到 MongoDb

Serilog 最佳实践

serilog 没有将日志发送到 logstash

无法从Windows服务中托管的Asp.net核心网站启动多个Serilog接收器