經驗與實踐 前兩篇文章里我們介紹了nxlog的日誌收集和轉發《ELK系列~Nxlog日誌收集加轉發(解決log4日誌換行導致json轉換失敗問題)》,今天我們主要總結一下,在與log4和fluentd及elasticsearch配合工作時需要註意的幾個點,這幾個點也是我們經常遇到的坑,希望可以幫到大 ...
經驗與實踐
前兩篇文章里我們介紹了nxlog的日誌收集和轉發《ELK系列~Nxlog日誌收集加轉發(解決log4日誌換行導致json轉換失敗問題)》,今天我們主要總結一下,在與log4和fluentd及elasticsearch配合工作時需要註意的幾個點,這幾個點也是我們經常遇到的坑,希望可以幫到大家!我們從日誌產生端log4開始說。
- log4需要註意的,編碼與時間戳格式
- nxlog需要註意output里對內容處理
- fluentd需要註意類型和format的規定
1 log4產生日誌,格式必須是utf-8,ansi編碼對中文解析時有問題,主要表示在fluentd到elasticsearch寫數據時
<datePattern value="yyyyMMdd"Error.log"" />
<encoding value="utf-8" /> <layout type="log4net.Layout.PatternLayout"> </layout> </appender>
2 log4日誌里,時間戳@timestamp,需要是UTC時間,格式為yyyy-MM-ddTHH:mm:ss.fff+0800
private static string FormatStr(string level, string message, Exception ex) { var json = JsonConvert.SerializeObject(new { target_index = projectName, timestamp = DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fff+0800"), Level = level.ToString(), Message = message, StackTrace = ex?.StackTrace }); json = json.Replace("target_index", "@target_index").Replace("timestamp", "@timestamp"); return json; }
3 nxlog日誌收集時,由於log4產生的數據都是\r符號,所以在nxlog.conf里需要對output進行過濾,當然\n,使它變成兩條消息,這樣主體消息里就沒有\r了,json解析時就不會有問題
<Output out> Module om_tcp Host 192.168.200.214 Port 24224 Exec $raw_event =$raw_event + "\n"; </Output>
4 fluentd的配置里,類型需要是tcp,格式format需要是none
<source> @type tcp tag windows.log format none port 24224 bind 0.0.0.0 </source> <filter docker.**> type parser format json time_format %Y-%m-%dT%H:%M:%S.%L%Z key_name log reserve_data true </filter> <match **> @type stdout </match>
5 最後就是成功寫入elasticsearch,通過kibana就可以查看日誌了
請把學習作為一種習慣!
請把積累和總結變成一種學習的方式!
感謝各位的閱讀!