【问题标题】:TcpClient don't send data to Logstash until tcp stream is closed在 tcp 流关闭之前,TcpClient 不会向 Logstash 发送数据
【发布时间】:2018-12-25 10:13:14
【问题描述】:

我正在尝试通过 TcpClient 将数据写入 logstash。代码工作正常,但logstash 仅显示最后发送的记录,并且仅在 tcp 流关闭后显示。

_client = new TcpClient();
_client.Connect(_settings.Host, _settings.Port);
var stream = _client.GetStream();
stream.Write(encoded, 0, encoded.Length);
stream.Flush();

Logstash tcp 设置:

input{
    tcp{
        type=>"app"
        port=>"9876"
    }
}

我的问题是什么?错误的代码或错误的logstash设置

【问题讨论】:

  • 我不确定你想要达到什么目的,但我不能推荐serilog。它有一个直接运送到elasticsearch 的水槽。
  • 我已经为我的项目选择了serilog,但是我们使用ELK进行日志记录,在这种情况下直接将日志写入elasticsearch并不是一个好主意。所以我想为带有tcp连接的logstash开发自定义接收器。我找到了几个水槽,但由于多种原因它们不适合我。
  • 为什么你认为直接将日志写入ELK不是一个好主意?我工作过的多家公司都是这样做的。这是梦幻般的!你正在切断中间人。
  • 很遗憾,这不是我的决定。我们使用logstash 将数据传递给elasticsearch 并使用elasticsearch 来存储它。顺便说一句,许多人建议以这种方式使用日志。我认为这是因为logstash极大地简化了elasticsearch中的日志记录,尤其是在微服务架构下。无论如何,时间很紧,所以我将连接从 tcp 更改为 http。但我仍然想知道为什么 tcp 连接会以这种方式与 logstash 一起运行!

标签: c# elasticsearch .net-core logstash tcpclient


【解决方案1】:

我知道这是一篇旧帖子,但我想向那些可能有同样问题的人发布解决方案。在我看来,通过 TCP 将 C# Log 数据发送到 LogStash 的最简单方法如下。

#From logstash configs 
input{
  tcp{
    port=>"9876"
    codec=>"json"
  }
}

在 C# 方面,我们需要创建一个 json 字符串以发送到 logstash。首先创建一个 LogJson.cs 类并覆盖 ToString()。此类将简单地返回所需的格式化 json 字符串。

using System;
using Newtonsoft.Json;

namespace FeedLogstash
{
  class LogJson
  {
    public readonly int Id;
    public readonly DateTime DateTime;
    public readonly string Message;

    public LogJson(int id, DateTime dateTime, string message) {
        Id=id; DateTime=dateTime;  Message=message;
    }

    public override string ToString()  {
        return JsonConvert.SerializeObject(this);
    }
  }
}

我们现在可以将上面的 json 字符串发送到 LogStash tcp 输入。我正在使用 C# SimpleTcpClient 类来创建简单连接。注意-您必须关闭连接才能写入数据。

using SimpleTCP;
...
public void PushData() {
  LogJson log = new LogJson(1001, DateTime.Now, "Danger: Will Robinson");
  SimpleTcpClient _client;
  _client = new SimpleTcpClient().Connect(host, port);
  _client.Write(log.ToString() + "\n");
  _client.Disconnect();
}

希望这可以帮助任何想要通过 TCP 从 C# 推送日志数据的人。我相信 Java 也可以采用同样的算法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2016-10-08
    相关资源
    最近更新 更多