ELK Stack, một trong các stack mạnh mẽ, phổ biến nhất dùng để ghi log. Rất nhiều hệ thống lớn trên thế giới (LinkedIn, Netflix, Medium) đều sử dụng stack này.
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.
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:
Cơ chế hoạt động của ELK Stack
- Đầ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)
- 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
- 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ý.
>> Xem thêm các khóa học VoIP, chứng chỉ viễn thô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!
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.
Ứ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:
- 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ý.
- Mình config Logstash cho phép ghi log thông qua giao thức UDP.
- 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.
- 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.
Tìm hiểu một chút về Logtash trong ELK Stack #
Logstash là một chương trình mã nguồn mở, nằm trong hệ sinh thái của bộ sản phẩm ELK Stack, với nhiệm vụ rất quan trọng bao gồm ba giai đoạn trong chuỗi xử lý sự kiện log (pipeline) tương ứng ba module:
- INPUT: tiếp nhận/thu thập dữ liệu sự kiện log ở dạng thô từ các nguồn khác nhau như file, redis, rabbitmq, beats, syslog,….
- FILTER: Sau khi tiếp nhận dữ liệu sẽ tiến hành thao tác dữ liệu sự kiện log (như thêm, xoá, thay thế,.. nội dung log) theo cấu hình của quản trị viên để xây dựng lại cấu trúc dữ liệu log event theo mong muốn.
- OUTPUT: Sau cùng sẽ thực hiện chuyển tiếp dữ liệu sự kiện log về các dịch vụ khác như Elasticsearch tiếp nhận lưu trữ log hoặc hiển thị log,..
Workflow #
Ở bước INPUT, Logstash sẽ được cấu hình lựa chọn hình thức tiếp nhận log event hoặc đi lấy dữ liệu log ở dịch remote theo nhu cầu. Sau khi lấy được log event thì , khâu INPUT sẽ ghi dữ liệu event xuống hàng đợi tập trung ở bộ nhớ RAM hoặc trên ổ cứng.
Mỗi pipeline worker thread sẽ tiếp tục lấy một loạt sự kiện đang nằm trong hàng đợi này để xử lý FILTER giúp tái cấu trúc dữ liệu log sẽ được gửi đi ở phần OUTPUT. Số lượng sự kiện được xử lý một loạt và số lượng pipeline worker thread có thể được cấu hình tinh chỉnh tối ưu hơn, nội dung này có thể đề cập ở phần khác.
Mặc định Logstash sử dụng hàng đợi nằm trong bộ nhớ RAM giữa các giai đoạn (input -> filter và filter -> output) để làm bộ đệm lưu trữ dữ liệu event trước khi xử lý. Nếu mà chương trình dịch vụ Logstash của bạn vì một lý do nào đó bị dừng hoạt động giữa chừng, thì các dữ liệu event đang nằm trong buffer sẽ bị mất.
Input #
Bạn sẽ sử dụng phần cấu hình block ‘INPUT’ để quy định cơ chế nhận/lấy log vào chương trình Logstash. Một số Input plugin phổ biến thường được sử dụng để nhận/lấy log như :
- file: đọc dữ liệu từ file trên filesystem, giống lệnh ‘tail -f’ trên UNIX.
- syslog: chương trình Logstash sẽ lắng nghe trên port 514 để tiếp nhận dữ liệu syslog.
- redis: đọc dữ liệu log từ redis server, sử dụng cả 2 cơ chế redis channel và redis lists.
- beats: xử lý các dữ liệu thông tin được gửi từ chương trình Beats (một sản phẩm nổi tiếng trong hệ thống ELK)
Logstash có hỗ trợ khá nhiều loại plugin input khác nhau giúp bạn linh động trong việc nhận nguồn dữ liệu log. C
Filter #
Bạn có thể kết hợp filter với các điều kiện so sánh nhằm thực hiện 1 tác vụ hành động (action) khi một sự kiện thoả mãn khớp với các tiêu chí do bạn được ra. Một số filter plugin hữu ích như :
- grok: Nếu bạn gặp một dữ liệu sự kiện log với cấu trúc văn bản không phổ biến hoặc là phức tạp. Thì Grok hiện là plugin filter tốt nhất để phân tích cú pháp dữ liệu log không được cấu trúc văn bản thành một thứ có cấu trúc và có thể truy vấn được.
- mutate: thực hiện sự thay đổi trên thông tin sự kiện log như: đổi tên, xoá, thay thế, tinh chỉnh các trường (field) thông tin của sự kiện log.
- drop: dừng xử lý sự kiện ngay lập tức, ví dụ các ‘debug event’.
- clone: tạo một bản copy của sự kiện.
- geoip: thêm thông tin về vị trí địa lý của địa chỉ IP (thường để hiển thị biểu đồ trên Kibana)
Outputs #
Output là bước cuối cùng trong chuỗi các bước xử lý của Logstash. Một sự kiện có thể đưa qua nhiều output khác nhau, tiếp đây là các Output plugin hay sử dụng.
- elasticsearch: gửi dữ liệu sự kiện đến hệ thống Elasticsearch. Tất nhiên đầu cuối của hệ thống logging ELK thường là Elasticsearch giúp bạn lưu trữ log, tìm kiếm log, …
- file: nếu bạn chả cần bất kì sự lưu trữ log cho việc tìm kiếm, hiển thị,… thì có thể lưu ra file trên hệ thống.
- graphite: một trong những tool mã nguồn mở hỗ trợ việc lưu trữ và tạo biểu đồ metric.
- statsd: gửi dữ liệu tới dịch vụ ‘statsd’.
Bạn có thể tham khảo thêm các Output plugin tại đây
Cấu trúc thư mục của Logstash #
Chúng ta sẽ cùng điểm qua cấu trúc thư mục mặc định của Logstash. Khi được cài đặt từ file .rpm (RHEL/CentOS)
Loại | Miêu tả | Đường dẫn folder | Thông số |
home | /usr/share/logstash | ||
bin | /usr/share/logstash/bin | ||
settings | /etc/logstash | ||
conf | /etc/logstash/conf.d/*.conf | ||
logs | file log của chương trình logstash | /var/log/logstash/ | path.logs |
plugins | /usr/share/logstash/plugins | path.plugins | |
data | /var/lib/logstash |
Nguồn: toidicodedao.com ; cuongquach.com