最近火的不能再火的日誌框架就是ELK,其中E(Elasticsearch)表示日誌存儲,L(Logstash)表示日誌收集,K(kibana)表示日誌的UI界面,用來查詢和分析,而其中的L可以使用Fluentd來代替,並且以上架構都可以通過docker來進行快速的部署。 它們的工作流程 fluent ...
最近火的不能再火的日誌框架就是ELK,其中E(Elasticsearch)表示日誌存儲,L(Logstash)表示日誌收集,K(kibana)表示日誌的UI界面,用來查詢和分析,而其中的L可以使用Fluentd來代替,並且以上架構都可以通過docker來進行快速的部署。
它們的工作流程
fluentd系統有輸入和輸出,輸入對應我們的應用程式,輸出對應咱們的ES存儲系統,在.net平臺上,如果希望把日誌發到fluentd,有三種方式,下麵分別簡單說一下:
- http方式
- tcp方式
- 客戶端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