2016年6月15日 星期三

叢集環境的 logging(三):以 JSON 格式輸出 log

在把叢集中的每個 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"}
參考資料
  1. logstash-logback-encoder

沒有留言: