在把叢集中的每個 Application 的 log 都集中起來以後,下一個遇到的問題就是如何分析?
收集起來的 log 數量通常不小,而且各個不同節點的 log 全混在一起
要如何有效率一點地解析他們呢?
實務上,比較容易想像的方式大概就是把 log 導到某個能夠做 log 分析的系統上
例如 ELK 架構(Elasticsearch + Logstash + Kibana)。
不過要讓 Logstash 能夠簡單地把集中起來的 log 全部帶走,最好還是能讓 log 都以 JSON 格式輸出
這樣在 Logstash 那邊寫設定檔時,會比較簡單。
雖然直覺會覺得,大概直接在 Pattern 欄位上面,刻意以 JSON 的格式去表示的話
應該就能避免還需要去更改原始碼裡面寫 log 的程序
不過實際上以輸出給 Logstash 來說,還有更簡單的方式,也就是利用官方釋出的 encoder [1]。
在要使用 Logstash 的 encoder 之前,記得先將 encoder 加入到 Maven 設定中。
1 2 3 4 5 |
< dependency > < groupId >net.logstash.logback</ groupId > < artifactId >logstash-logback-encoder</ artifactId > < version >4.7</ version > </ dependency > |
以下是改用 Logstash 的 encoder 作為輸出格式的設定檔:
1 2 3 4 5 6 7 8 9 10 |
< appender name = "FILE" class = "ch.qos.logback.core.rolling.RollingFileAppender" > < file >centralized-logs.log</ file > < rollingPolicy class = "ch.qos.logback.core.rolling.TimeBasedRollingPolicy" > <!-- hourly rollover --> < fileNamePattern >archived-logs.%d{yyyy-MM-dd_HH}.log</ fileNamePattern > <!-- keep 3 days' (72 hours) worth of history --> < maxHistory >72</ maxHistory > </ rollingPolicy > < encoder class = "net.logstash.logback.encoder.LogstashEncoder" /> </ appender > |
上述 appender 設定中,跟一般不同的地方在於沒有設定 Pattern,取而代之的是增加了第 9 行的 encoder
最後跑出來的 log 的格式如下:
1 |
{ "@timestamp" : "2016-06-15T11:23:46.198+08:00" , "@version" :1, "message" : "Start log receiver." , "logger_name" : "org.twgogo.jimwayne.logback.log_receiver" , "thread_name" : "main" , "level" : "INFO" , "level_value" :20000, "HOSTNAME" : "localhost" } |
沒有留言:
張貼留言