LOGSTASH LÀ GÌ

Xin chào mọi người, gần đây mình được dịp tìm hiểu về Elasticsearch(ES). Trong quá trình đọc về ES thì mình đặt ra một số hướng tìm hiểu như sau:

Kết nối Golang với ESDựng hệ thống Logging với ELK Stack (ngày nay gọi là Elastic Stack)Demo chức năng tìm kiếm mờ Fuzzy Search

Việc kết nối Golang với ES thì mình thấy cũng không quá khó, nên mình sẽ viết luôn bài về Logging. Còn về Fuzzy Search thì mình chưa coi tới. Hẹn sẽ có bài viết sớm.

Bạn đang xem: Logstash là gì

Các khái niệm

Mô hình

Khi nói về vấn đề Logging thì thường người ta sẽ nhắc tới ELK Stack gồm (Elasticsearch, Logstash, Kibana). Tuy nhiên, sau này xuất hiện thêm Beats để shipping logs. Vì vậy ELK Stack thường được gọi luôn là Elastic Stack.

Ở mô hình đơn giản, thì ta có thể hình dung như sau:


*

*

Filebeat

Filebeat là một beats application, nó có nhiệm vụ theo dõi sự thay đổi trong các log files rồi sau đó forwards những sự thay đổi đó qua cho logstash.

Khi config cho Filebeat, ta sẽ cần chỉ ra thư mục, hoặc 1 file cụ thể chưa log, Filebeat sẽ liên tục theo dõi sự thay đổi trên các file logs để gửi đến cho logstash

Logstash

Logstash có nhiệm vụ nhận logs từ Filebeat, xong sẽ thực hiện việc filter trên các logs đó, rồi cuối cùng là gửi lên cho Elasticsearch

Elasticsearch

Elasticsearch là một NoSQL database đã được optimized để lưu trữ document có cấu trúc (structured documents). Structured documents được lưu dưới dạng JSON

Để tương tác với database này thì ta sẽ dùng REST API

Kibana

Kibana sẽ là giao diện hiển thị dữ liệu của Elasticsearch thành đồ thị, graphs, tables để người dùng có thể dễ dàng hình dung, đưa ra các phân tích, quyết định dựa trên các biểu đồ, hình vẽ,…

Thực hành

Mục tiêu của phần thực hành này là giúp mọi người đối chiếu với các định nghĩa trên và dựng được Elastic Stack đơn giản nhất.

Demo sẽ gồm 2 phần:

Golang và Filebeat: Viết file main.go để tạo file log. Filebeat sẽ được cài trên máy host, đọc trong thư mục logs đó rồi gửi qua ELK StackELK Stack: mình sẽ dựng bằng docker-compose

Cấu trúc thư mục:


*

*

Golang và Filebeat

Trong main.go, ta sẽ sử dụng thư việc “go.uber.org/zap” để tạo ra file log. Cứ sau 3 giây sẽ sinh ra 1 dòng log, log này có thể là Error Log hoặc Info Log.

Xem thêm: Sinh Năm 2007 Mệnh Gì ? Sinh Năm 2007 Mệnh Gì, Tuổi Gì Và Hợp Màu Gì

File log sẽ được lưu tại: ./logs/go.log

main.go

package mainimport ( "fmt" "go.uber.org/zap" "io/ioutil" "math/rand" "net/http" "os" "time")func main() { os.OpenFile(logPath, os.O_RDONLY|os.O_CREATE, 0666) c := zap.NewProductionConfig() c.OutputPaths = <>string{"stdout", "./logs/go.log"} l, err := c.Build() if err != nil { panic(err) } i := 0 for { i++ time.Sleep(time.Second * 3) if rand.Intn(10) == 1 { l.Error("test error", zap.Error(fmt.Errorf("error because test: %d", i))) } else { l.Info(fmt.Sprintf("test log: %d", i)) } }}Cài đặt và config cho Filebeat

Filebeat thì mình sẽ cài trên máy host. Mọi người có thể tham khảo bài viết ở đây để cài đặt cho phù hợp: https://www.elastic.co/guide/en/beats/filebeat/7.7/filebeat-getting-started.html

Ở đây, mình sẽ cài bằng brew

$ brew tap elastic/tap$ brew install elastic/tap/filebeat-fullSau khi cài đặt xong, ta có thể chạy lệnh sau để kiểm tra:

$ filebeat -eVới mỗi cách cài thì các file config của Filebeat sẽ nằm ở các vị trí khác nhau, vì vậy mọi người có thể xem trang này để biết file config đang nằm ở đâu nhé


Vì mình cài bằng brew nên file config của Filebeat sẽ nằm ở /usr/local/etc/filebeat/filebeat.yml

Mở filebeat.yml lên và ta sẽ config như nhau:

filebeat.inputs:- type: log enabled: true paths: - /Users/locpham/workspace/go-elasticsearch/logs/go.logoutput.logstash: hosts: <"localhost:5044">Chỉ đơn giản vậy thôi, tất cả các dòng còn lại, đều comment lại hết nhé. Có thể khi xem qua file config thì mọi người cũng đã hiểu được ý nghĩa của nó.

Input sẽ khai báo nơi mà filebeat sẽ lấy các file logs, mọi thứ liên quan tới nơi filebeat cần lấy log thì sẽ nằm trong phần Input

Output là config nơi mà filebeat sẽ forward thông tin tới. Như config trên thì filebeat sẽ gửi tới logstash

ELK Stack

Về phần ELK Stack thì mình sẽ dựng bằng docker, cụ thể mình có file docker-compose như sau:

docker-compose.yml


Để chạy thì ta sẽ vào folder của dự án, chạy lệnh:

$ docker-compose up -dnó sẽ tải về các images cần thiết và run container

Lưu ý:

Sau khi start các containers lên, nó sẽ mất tầm 5–6p mới init xong hết mọi thứ. Tức là sau đó bạn mới vào được các link: localhost:9200 (cho elasticsearch) và localhost:5601 (cho Kibana)Version mình đang sử dụng cho cả 3 containers là 7.7.1 nên có thể giao diện ở Kibana của mình sẽ khác nếu bạn config theo version khác

Sau khi mọi thứ đã lên hết:

Vào localhost:9200 sẽ trả về kết quả JSON tựa tựa như sau (do mình dùng extension để hiển thị JSON format cho đẹp hơn)