文章出處

最近火的不能再火的日志框架就是ELK,其中E(Elasticsearch)表示日志存儲,L(Logstash)表示日志收集,K(kibana)表示日志的UI界面,用來查詢和分析,而其中的L可以使用Fluentd來代替,并且以上架構都可以通過docker來進行快速的部署。

它們的工作流程

fluentd系統有輸入和輸出,輸入對應我們的應用程序,輸出對應咱們的ES存儲系統,在.net平臺上,如果希望把日志發到fluentd,有三種方式,下面分別簡單說一下:

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

一 http方式

構建一個共享的httpclient對象,然后聲明為keep-alive,使用keep-alive可以改善這種狀態,即在一次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時,需要有一個結果標示,默認是\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

 


文章列表




Avast logo

Avast 防毒軟體已檢查此封電子郵件的病毒。
www.avast.com


arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()