Get in touch
or send us a question?
CONTACT

TÌM HIỂU VỀ ELK STACK – CÔNG CỤ QUẢN LÝ LOG NGẦU NHẤT QUẢ ĐẤT!

Logging là một công cụ đơn giản và mạnh mẽ, ghi lại toàn bộ những hoạt động của hệ thống. 

Nhờ có logging, ta có thể tra cứu lại trạng thái của hệ thống trong quá khứ, những code nào đã được chạy, từ đó tìm ra lỗi và fix dễ dàng hơn.

Hôm nay, mình sẽ giới thiệu về ELK Stack, một trong các stack mạnh mẽ, phổ biến nhất dùng để ghi log nhé!

Rất nhiều hệ thống lớn trên thế giới (LinkedIn, Netflix, Medium) đều sử dụng stack này đấy!

ELK Stack là gì?

ELK Stack là tập hợp 3 phần mềm đi chung với nhau, phục vụ cho công việc logging. Ba phần mềm này lần lượt là:

  • Elasticsearch: Cơ sở dữ liệu để lưu trữ, tìm kiếm và query log
  • Logstash: Tiếp nhận log từ nhiều nguồn, sau đó xử lý log và ghi dữ liệu và Elasticsearch
  • Kibana: Giao diện để quản lý, thống kê log. Đọc thông tin từ Elasticsearch

Cơ chế hoạt động của ELK Stack cũng khá đơn giản, các bạn xem hình sẽ hiểu:

co-che-hoat-dong-elk-stack
Cơ chế hoạt động của ELK Stack
  1. Đầu tiên, log sẽ được đưa đến Logstash. (Thông qua nhiều con đường, ví dụ như server gửi UDP request chứa log tới URL của Logstash, hoặc Beat đọc file log và gửi lên Logstash)
  2. Logstash sẽ đọc những log này, thêm những thông tin như thời gian, IP, parse dữ liệu từ log (server nào, độ nghiêm trọng, nội dung log) ra, sau đó ghi xuống database là Elasticsearch.
  3. Khi muốn xem log, người dùng vào URL của Kibana. Kibana sẽ đọc thông tin log trong Elasticsearch, hiển thị lên giao diện cho người dùng query và xử lý.
Kibana hiển thị thông tin từ log cho người dùng

Tại sao phải dùng ELK Stack?

Với các hệ thống hoặc ứng dụng nhỏ, ta không cần sử dụng ELK stack làm gì! Cứ dùng thư viện ghi log đi kèm với ngôn ngữ, sau đó ghi log ra file rồi đọc thôi!

Tuy nhiên, với những hệ thống lớn nhiều người dùng, có nhiều service phân tán (microservice), có nhiều server chạy cùng lúc… thì việc ghi log xuống file không còn hiệu quả nữa.

Giả sử bạn có 10 con server chạy cùng lúc, bạn sẽ phải lục tung 10 con server này để đọc và tìm file log, cực quá phải không nào? Lúc này, người ta bắt đầu áp dụng centralized logging, tức ghi log tập trung vào 1 chỗ.

ELK là một lựa chọn cực kì phù hợp, được nhiều công ty lớn như Netflix, Linkedin, Medium lựa chọn vì những lý do bên dưới!

Các công ty sử dụng ELK Stack

Vậy ELK Stack có gì hay ho?

Vì đâu mà mà ELK Stack lại vô cùng mạnh mẽ, tiện dùng, được nhiều công ty sử dụng như vậy? Vì các lý do sau:

  • Đọc log từ nhiều nguồn: Logstash có thể đọc được log từ rất nhiều nguồn, từ log file cho đến log database cho đến UDP hay REST request.
  • Dễ tích hợp: Dù bạn có dùng Nginx hay Apache, dùng MSSQL, MongoDB hay Redis, Logstash đều có thể đọc hiểu và xử lý log của bạn nên việc tích hợp rất dễ dàng.
  • Hoàn toàn free: Chỉ cần tải về, setup và dùng, không tốn một đồng nào cả. Công ty tạo ra ELK Stack kiếm tiền bằng các dịch vụ cloud hoặc các sản phẩm premium phụ thêm.
  • Khả năng scale tốt: Logstash và Elasticsearch chạy trên nhiều node nên hệ thống ELK cực kì dễ scale. Khi có thêm service, thêm người dùng, muốn log nhiều hơn, bạn chỉ việc thêm node cho Logstash và Elasticsearch là xong.
  • Search và filter mạnh mẽ: Elasticsearch cho phép lưu trữ thông tin kiểu NoSQL, hỗ trợ luôn Full-Text Search nên việc query rất dễ dàng và mạnh mẽ.
  • Cộng đồng mạnh, tutorial nhiều: Nhiều công ty dùng nên dĩ nhiên là có nhiều tutorial để học và dùng ELK Stack rồi.
elk-tutorial
Tutorial của ELK Stack nhiều vô kể

Ứng dụng ra sao?

Trước đây, hệ thống của bên mình gặp phải vấn đề về logging:

  • Hệ thống back-end xây dựng theo mô hình microservice. Mỗi microservice được deploy thành một AppService trên Azure. Mỗi khi service có vấn đề, cần đọc log thì phải vào Azure, tìm service đó, tìm trong folder deploy để tìm file log.
  • Một app Desktop khác do mình viết bằng Electron, cần chạy trên 100 máy ảo của khoảng 100 users. Mỗi khi app có vấn đề gì thì phải login vào máy ảo đó và tìm file log.
  • Khi cần tìm và fix bug, ta cần phải mò và đọc file log để “điều tra” xem lỗi nằm ở đâu.

Do vậy, bên mình quyết định sử dụng ELK Stack để chứa toàn bộ log của hệ thống. Việc tích hợp đơn giản tới không ngờ, chỉ mất khoảng 1 ngày:

  1. Thay vì kiếm server và cài đặt ELK Stack, CTO quyết định dùng service của logit.io. Thằng này host sẵn ELK Stack trên cloud, khỏi cần mình tốn công quản lý.
  2. Mình config Logstash cho phép ghi log thông qua giao thức UDP.
  3. Các service phía back-end đã dùng log4net sẵn, do vậy mình không cần sửa code nhiều, chỉ config cho log4net ghi thêm log qua giao thức UDP, gửi tới logstash là được.
  4. App Desktop của mình thì sửa lại một chút, lúc ghi log thì ghi xuống cả file lẫn gửi log theo giao thức UDP.

Sau một ngày hì hục, team mình đã có một hệ thống centralized logging với ELK Stack. Chỉ cần truy cập vào Kibana là có thể biết hệ thống đang hoạt động như thế nào.

Hệ thống logging hiện tại của công ty mình

Khi có vấn đề, thay vì lục file log, mình chỉ cần dùng Kibana để lọc ra những log trong khoảng thời gian đó, sau đó filter tí là ra, tiết kiệm được rất nhiều thời gian!

Kết

Nếu muốn nâng cao khả năng, các bạn nên đọc những bài mang tính kĩ thuật như thế này nhé!