Chào mọi người,
Ở một số bài trước mình đã chia sẻ về cách ghi log và Tầm quan trọng của việc ghi log trong phát triển phần mềm. Nhưng ghi log rồi không dùng đến thì cũng phí công, hoặc lúc cần xem log thì lại quá phức tạp thì cũng gây khó khăn cho người vận hành.
Ví dụ 1 số cách xem log cổ điển mà phần lớn mọi người đang sử dụng.

  1. Truy cập trực tiếp ssh vào máy chủ, tìm đường dẫn đến file log của ứng dụng cần xem và gõ lệnh tail -f <file_name.log> . Cách này muốn xem log của 1 khoảng thời gian nào đó thì kéo console mỏi tay

  2. Truy cập trực tiếp ssh hoặc ftp vào máy chủ, tìm đường dẫn đến file log của ứng dụng cần xem và kéo về máy local open file. Cách này mà gặp file log không cắt, nặng vài GB thì cũng căng, có khi download xong còn chả open nổi.

Cả 2 cách trên đều gặp vấn đề là bạn phải nhớ đường dẫn file log của ứng dụng. Đi check log mà gặp hệ thống có nhiều ứng dụng con hoặc deploy trên nhiều server khác nhau (ít cũng khoảng 5-10 server chẳng hạn) thì cũng hơi oải, không biết lỗi ở server nào phải ssh từng server để xem.

Ngoài 2 cách trên thì 1 số lỗi có thể bắn trực tiếp lên giao diện kiểu alert, nhưng log này thường là message rút gọn quá ít thông tin để xem. Hoặc Ghi log bất đồng bộ vào database, nhưng không phải log nào cũng ghi vào DB nên xét cho cùng nhiều khi vẫn không đủ để trace, vẫn cần đến log file.

Lúc này, để giải quyết các vấn đề trên, ta cần 1 hệ thống ghi log và giám sát log tập trung dành cho mọi ứng dụng. Nghĩa là vào 1 ứng dụng duy nhất để xem được log của tất cả ứng dụng, tất cả server deploy. ELK (Elasticsearch Logtash Kibana) chính là cái bạn cần. Các bạn có thể nhìn vào hình ảnh dưới đây để hình dung dễ hơn về mô hình triển khai của ELK

  • E (Elasticsearch): Ứng dụng phân tích log, đánh index tăng tốc độ tìm kiếm, hỗ trợ full text search giúp cho việc tìm kiếm log linh hoạt hơn.
  • L (Logstash): Ứng dụng tổng hợp log từ nhiều nguồn khác nhau, nhiều định dạng và phương thức khác nhau về tập trung 1 chỗ. Các cách tổng hợp log có thể kể đến như
    • Logstash đọc trực tiếp file log theo đường dẫn cố định
    • Sử dụng Filebeat đọc log file sau đó gửi cho Logstash
    • Sử dụng Metricbeat đọc dữ liệu metric sau đó gửi cho Logstash
    • Ứng dụng nghiệp vụ chủ động gửi log cho Logstash qua socket, ví dụ trong Log4J ta có thể cấu hình thêm Appender Logstash để gửi log
  • K (Kibana): Ứng dụng hiển thị log, thông số log dưới dạng bảng và biểu đồ trực quan, dễ dàng cho việc giám sát và kiểm soát sức khỏe ứng dụng.

Ở trên mạng đã có khá nhiều bài viết hướng dẫn về cách cài đặt và cấu hình ELK rồi nên mình sẽ không đề cập đến ở đây nữa. Mình chỉ đưa ra 1 số keyword logic giúp các bạn có thể tiếp cận và làm chủ ELK một cách dễ dàng hơn.

Index pattern: Sau khi cài đặt và tích hợp lấy log lên Kibana thành công, bạn cũng chưa giám sát hay trace được log gì cả, việc đầu tiên là phải tạo Index Pattern, cái này sẽ phân loại log theo từng bộ nhóm có sự tương đồng về định dạng log hoặc phân loại theo chức năng nghiệp vụ. Đây cũng là cơ sở để phân tích log ở các chức năng tiếp theo.

Discover: Sau khi đã có các Index Pattern, các bạn có thể thực hiện 1 số thao tác cơ bản với log như

  • Tìm kiếm nhanh theo keyword
  • Giới hạn thời gian tìm kiếm
  • Filter theo 1 vài trường và giá trị cụ thể
  • Ẩn hiện các trường dữ liệu theo dạng cột để dễ nhìn và thông tin tập trung hơn

Visualize: Cái này sẽ giúp các bạn chuyển hóa các dữ liệu log dạng text về dạng biểu đồ trực quan, grid dữ liệu, thực hiện các phép tính toán như Sum, Count, Avg, Max, Min,… Có rất nhiều biểu đồ và cách hiển thị cho các bạn lựa chọn

Ví dụ dưới đây mình sử dụng biểu đồ cột, hiển thị dữ liệu theo timeline và chia một cột thành nhiều stack theo Response Code (HTTP Status)

Dashboard: Rất dễ hiểu, dashboard giúp bạn hiển thị nhiều Visualize trên cùng 1 màn hình, giám sát được nhiều thông tin và đầy đủ hơn, không cần vào từng Visualize để xem.

Đó là những gì ELK hỗ trợ sẵn cho bạn sử dụng. Nhưng để lên được Dashboard đẹp, phong phú thông tin và chắt lọc được những dữ liệu cần thiết thì cần phải customize bộ filter của Logstash. Ví dụ mình có 1 dòng log dạng text từ ứng dụng như sau, đây là log hiển thị thời gian thực thi của một method

User: anonymousUser END EmployeeController.findByExample in 21 ms

Nếu theo mặc định, các bạn sẽ chả làm được gì với cái log này ngoài việc search ra nhìn bằng mắt. Nhiệm vụ bây giờ là phải tách được tên method và số 21 kia ra thực hiện 1 số phép toán như Max, Avg, Count,… để giám sát xem method nào thực hiện chậm nhất và có hướng tuning, hoặc xác định xem method nào được gọi nhiều nhất.

Việc bóc này thực hiện khá đơn giản bằng grok trong filter của Logstash, tuy nhiên bạn cần có chút kiến thức logic về Regex. Cách thực hiện như sau:

Mở file cấu hình <folder logstash>/pipeline/logstash.conf để bổ sung grok bóc tách dữ liệu

filter {
    mutate {
        add_field => { "receiveAt" => "%{@timestamp}" }
        # remove color code 
        gsub => ["message", "\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[m|K]", ""]
    }
    
    grok {
        match => {"message" => "%{JAVACLASS:[class_function]} in %{NUMBER:[finish_time]:int} %{WORD:[time_unit]}"}
    }
    
}

Trong đây:

mutate: Mình đang sử dụng để add thêm trường receiveAt đánh dấu thời gian nhận được log. Và gsub để chuẩn hóa lại chuỗi message log, loại bỏ các ký tự thừa của log, đây là các ký tự do logj4 định dạng màu sắc cho log. Nếu log của bạn đã chuẩn rồi thì bỏ qua cái này.

grok: Dạng biểu thức chính quy (regex) bóc tách thông tin từ 1 chuỗi ký tự, ngoài ra grok cũng hỗ trợ sẵn một số pattern để đơn giản hóa chuỗi regex như:

  • JAVACLASS: Định dạng java class, java package (vd: net.tunghuynh.elk.Main)
  • NUMBER: Định dạng số
  • IP: Định dạng địa chỉ IP
  • TIMESTAMP: Định dạng thời gian
  • WORD: 1 từ bất kỳ

Nhiều pattern khác các bạn có thể tham khảo tại đây: https://github.com/logstash-plugins/logstash-patterns-core/blob/master/patterns/grok-patterns

Sau khi đã viết được 1 chuỗi grok bóc tách dữ liệu, các bạn có thể kiểm tra trước xem chuỗi grok có đúng cú pháp và có bóc tách được dữ liệu theo đúng ý muốn hay không bằng cách đưa grok vào test với một vài chuỗi message log mẫu. Sử dụng chức năng Dev Tool có sẵn trên Kibana

Kết quả sau khi cấu hình và restart logstash, các bạn có thể hiển thị riêng các giá trị đã bóc tách được thành các cột riêng biệt, từ đây có thể sử dụng các phép toán group, sum, max, min,… tùy ý.

Một số lưu ý khi sử dụng:

  • Không nên đưa quá nhiều visualize lên 1 biểu đồ, việc này sẽ làm quá trình load dashboard của bạn khá chậm chạp
  • Hạn chế việc tìm dữ liệu quá dài ngày. Mặc dù Elasticsearch làm khá tốt nhiệm vụ tối ưu tốc độ và kết quả tìm kiếm nhưng với khối lượng dữ liệu log lớn thì vẫn nên cân nhắc về khoảng thời gian tìm kiếm
  • Với hệ thống lớn, nên deploy ra nhiều node Logstash và Elasticsearch để share tải
  • Dành cho ELK một tài nguyên ổ cứng đủ lớn để lưu được dữ liệu log lâu dài, vì elasticsearch sẽ đánh index phụ thuộc theo các tiêu chí filter bạn cấu hình vì vậy càng nhiều cấu hình thì index càng nhiều, có trường hợp 1Gb text log sau khi phân tích có thể chiếm đến hơn 2Gb data index
  • Và một số vấn đề nhỏ khác, các bạn có thể trải nghiệm dần trong quá trình sử dụng 🙂

Chúc các bạn thành công và có một hệ thống mượt mà! 😀

One Reply to “Giám sát log tối ưu với ELK – Elasticsearch Logstash Kibana”

Bình luận