C++ELK三种~NLog.Targets.Fluentd到达怎么着通过tcp发到fluentd

日前火的无法再火的日记框架就是ELK,其中E(Elasticsearch)表示日志存款和储蓄,L(Logstash)表示日志收集,K(kibana)表示日志的UI界面,用来询问和分析,而里面包车型大巴L能够运用Fluentd来取代,并且上述架构都能够经过docker来举行高效的配备。

它们的行事流程

C++ 1

fluentd系统有输入和输出,输入相应大家的应用程序,输出对应咱们的ES存款和储蓄系统,在.net平台上,假如希望把日志发到fluentd,有二种办法,上面分别不难说一下:

  1. http方式
  2. tcp方式
  3. 客户端c/s方式

一 http方式

构建一个共享的httpclient对象,然后申明为keep-alive,使用keep-alive能够创新那种意况,即在2次TCP连接中得以不断发送多份数据而不会断开连接。通过行使keep-alive机制,能够减掉tcp连接建立次数,也意味着能够减小TIME_WAIT状态连接,以此抓实品质和增强httpd服务器的吞吐率(更少的tcp连接意味着更少的系统基本调用,socket的accept()和close()调用)。

fluentd配置:

<source>
    @type http
    port 24224
    bind 0.0.0.0
  </source>

C#代码:

                    var json = JsonConvert.SerializeObject(new
                    {
                        target_index = projectName,
                        timestamp = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffZ"),
                        Level = level.ToString(),
                        Message = message,
                        StackTrace = ex?.StackTrace
                    });
                    json = json.Replace("target_index", "@target_index").Replace("timestamp", "@timestamp");
                    var httpContent = new StringContent(json, Encoding.UTF8);
                    httpContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
                    httpClient.PostAsync(apiLoggerUrl, httpContent).Wait();

二 tcp方式

tcp方式比http要复杂一些,在fluentd配置时也急需登记,在质量上优化http,近来NLog.Targets.Fluentd这么些框架对它实行了合并,但表达文档不是很明亮,二叔经过测试也一度成功完毕了tcp的日志记录,需求专注的地点就是fluentd在接受tcp时,必要有3个结出标示,私下认可是\n,在客户端发送请求时须求在数额包结尾添加它。

NLog.Targets.Fluentd在github上的地点:

https://github.com/fluent/NLog.Targets.Fluentd

fluentd配置:

  <source>
    @type tcp
    tag pilipa
    format /^(?<field1>\d+):(?<field2>\w+)$/
    port 24224
    bind 0.0.0.0
  </source>
  <match **>
    @type stdout
  </match>

客户端调用

          var fluentdTarget = new NLog.Targets.Fluentd()
            {
                Host = "192.168.200.214",
                Port = 24224,
                Tag = "pilipa",
                LingerEnabled = false,
                NoDelay = true,
                EmitStackTraceWhenAvailable = false,
            };
            LoggingConfiguration config = new LoggingConfiguration();
            config.AddRuleForOneLevel(LogLevel.Info, "fluentd");
            LogManager.Configuration = config;
            Logger logger = LogManager.GetLogger("Example");
            logger.Info(json + "\n"); //这是必须的,看到\n表示数据包结束
            Console.Read();

 然后在咱们的fluentd上就足以见见日志了。

三 客户端c/s方式

现阶段正在商量,客户端驱动地址:https://docs.fluentd.org/v0.12/articles/windows\#set-up-nxlog-on-windows