在把叢集中的每個 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 設定中。
<dependency> <groupId>net.logstash.logback</groupId> <artifactId>logstash-logback-encoder</artifactId> <version>4.7</version> </dependency>
以下是改用 Logstash 的 encoder 作為輸出格式的設定檔:
<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 的格式如下:
{"@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"}
沒有留言:
張貼留言