# Logs 與 Filebeat 的基本介紹

### 本篇學習重點

* Logs 在 Observability 中的基本介紹
* Filebeat 的簡介，以及如何用 Filebeat 來收集 Logs 資料

## Observability Logs 的基本介紹

### Logs 在 Observability 扮演的角色

[Google Cloud Architecture Center - DevOps Guides](https://cloud.google.com/architecture/devops/devops-measurement-monitoring-and-observability) \[1] 對針 Observability 這個詞的定義中，描述到：

> **Observability** is tooling or a technical solution that allows teams to actively debug their system. Observability is based on exploring properties and patterns not defined in advance.

有提到一個重點，就是『**非事先定義**』，Observability 也就是擁有能夠探索未事先定義的屬性與模式的能力，我們在先前介紹的 **Uptime** 與 **Metrics** 的部份，其實都是需要事先定義，就算是 Elastic 已經做好很多預設的 Integration 以及 Dashboard，但也都是先定義好的，如果沒有定義的部份，也就不會被收集到。

而 Observability 當中的 Logs 與 APM，就擁有較多可以觀察到『**非事先定義**』部份的能力，針對 Logs 的部份，源頭當然還是需要系統、應用程式端、或是服務端，有記錄足夠資訊的日誌，而這些日誌，將會讓我們擁有『**當發現系統有異常時，能夠進一步深入挖掘系統內部運作的情況，並且提供分析核心原因及找到解決方案**』的能力。

### Observability 中的 Logs 提供了什麼樣的能力

#### 即時監控不斷產生的 Logs - Streaming

就好比我們在 \*nix 環境中常會針對日誌檔使用的指令 `tail -f`，能讓我們查看最新不斷產生的日誌內容，Logs 也提供了 Streaming 的功能，在 **Kibana** > **Observability** > **Logs** 當中，我們可以啟用 `Stream live` 的按鈕，就可以讓我們即時的查看分散在多台主機的系統、服務、應用程式，所最新產生的日誌內容。

![13-Kibana-O11y-Logs-stream](https://i.imgur.com/kFN8er5.png)

在這個 Logs Streaming 的功能之中，由於資訊量很大，所以 Logs 同時也有提供一些能力，能協助我們找到或是關注在我們所需要的資料上：

* 使用 **KQL (Kibana Query Language)** 定義篩選的規則
* 使用 **Highlights** 在結果當中以顏色突顯、也會在右方的時間軸上呈現出哪些時間有發生 ![13-Kibana-O11t-Stream-Highlight](https://i.imgur.com/BgrRBZk.png)
* 在查詢到指定某一條 log 時，能透過 `View in Context` 的方式來檢視，也就是可以快速的翻查這行 log 的前、後的 logs，這個功能非常的實用。

![13-Kibana-O11t-Stream-view-in-context](https://i.imgur.com/lEKrGTK.png)

### 使用 Machine Learning 來協助分析 Logs

這部份在 Observability 的 Logs 之中，預設在選單上就有列出兩個功能，都是透過 Machine Learning 來協助做到二個類型的處理：

* Anomalies 異常
* Categories 分類

透過機器學習的方式，能針對指定 Logs 的時間啟始點、針對哪些 Index，建立 Machine Learning 的 Job。

![13-Kibana-Create-ML-Job](https://i.imgur.com/FDmNocP.png)

在進入這兩個功能的檢視畫面時，就可以發現 Elastic 已經貼心的幫我們建立好這些基本的學習規則，可以直接查看當下發現的結果。

![13-Kibana-Create-Anomalies](https://i.imgur.com/KXaLKqv.png)

進一步可以從 Anomaly Explorer 查看異常分析的內容。

![13-Kibana-Create-Anomaly-Explorer](https://i.imgur.com/qBWAq5V.png)

甚至可以查看異常判斷的原因。

![13-Kibana-Create-Anomaly-Reason](https://i.imgur.com/drKlsji.png)

## Filebeat 基本介紹

要使用上述介紹到 Elastic 在 Kibana 提供的 Observability Logs 的這些基本能力之前，我們要先將 Logs 收集到 Elasticsearch 之中，Elastic Stack 中負責收集 Logs 資訊的主要角色，就是 Filebeat，如同先前介紹的 Metricbeat 和 Heartbeat 一樣，Filebeat 也是 Beats 家族中的一員，所以也是從 `libbeat` 所發展出來，並且是針對檔案類型的 Logs 進行收集的工具。

### Filebeat 的主要運作架構

如下圖所示，Filebeat 主要是針對機器上的各種檔案，並且會使命必達的負責將指定的目錄中的檔案有新增的 logs，收集起來並且往後傳遞，可以直接送到 Elasticsearch 或是送到 Logstash 進行 ETL (Etract, Transform, Load) 的處理，又或是送到 Kafka 或 Redis 的 Queue 之中，再透過其他的工具進行後續的處理。

![13-Filebeat-Architecture](https://i.imgur.com/BISE7FI.png)

### Filebeat 的安裝方式

安裝的方式如同其他 Beats 家族成員相似，以下是使用最簡單的安裝步驟來做介紹，其實與官方的 Quick start 的文件差不多，先大約知道將 Metricbeat 運作起來的流程為何，我將會以 `MacOS` 為例。

1. 下載，並解壓縮 Filebeat。

```
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.15.0-darwin-x86_64.tar.gz
tar xzvf filebeat-7.15.0-darwin-x86_64.tar.gz
```

1. 在解壓縮目錄下的 `filebeat.yml` 指定 Elasticsearch 的位置

```
output.elasticsearch:
  hosts: ["myEShost:9200"]
  username: "filebeat_internal"
  password: "YOUR_PASSWORD" 
```

1. 啟動要安裝的模組

```
./filebeat modules enable {module_name}
```

Filebeat 提供了非常多內建的模組 (modules)，像是 `Elasticsearch`、 `Apache`、`Nginx`、`MySQL`、`PostgreSQL`、`Redis`、`MongoDB`...等，詳細可以查看 [官方文件 Filebeat Modules](https://www.elastic.co/guide/en/beats/filebeat/7.15/filebeat-modules.html) \[2]。

另外針對啟動的模組，通常都會要調整這些模組的 config 檔，檔案的路徑就在 `./modules.d/` 裡面，檔名就會是 module 的名字，副檔名為 `.yml`。

1. 安裝 Filebeat 內建的 Kibana Dashboard，以及 Elasticsearch 的 Index Template。

```
./filebeat setup -e
```

1. 啟動 Filebeat

```
./filebeat -d
```

若是要以 `root` 執行，要記得把 config 的擁有者也改成 `root`

```
sudo chown root filebeat.yml 
sudo chown root modules.d/system.yml 
sudo ./filebeat -e
```

接下來就可以到 Kibana 查看 Filebeat 所發送的資料，有沒有成功的進入到 Elasticsearch了。

## 參考資料

1. [Google Cloud Architecture Center - DevOps Guides](https://cloud.google.com/architecture/devops/devops-measurement-monitoring-and-observability)
2. [官方文件 Filebeat Modules](https://www.elastic.co/guide/en/beats/filebeat/7.15/filebeat-modules.html)
