0

Bài học 10: Tuyệt chiêu gỡ lỗi (Troubleshooting) - Cứu hộ hệ thống Logstash

Chào mừng bạn đến với bài học cuối cùng trong chuỗi series về Logstash. Khi đưa hệ thống vào vận hành thực tế (Production), không sớm thì muộn bạn cũng sẽ gặp lỗi. Kỹ năng quan trọng nhất của một kỹ sư không phải là viết mã (code) không bao giờ lỗi, mà là biết cách tìm và sửa lỗi nhanh nhất.

Hôm nay, chúng ta sẽ "bắt mạch" những căn bệnh phổ biến nhất của Logstash.

1. Căn bệnh kinh điển: _grokparsefailure

Khi bạn mở Kibana lên và thấy một loạt các dòng log có gắn nhãn (tag) là _grokparsefailure, điều đó có nghĩa là Logstash đã thất bại trong việc bóc tách dữ liệu.

Nguyên nhân: Dòng log thô (đầu vào) KHÔNG khớp với cái khuôn (mẫu Grok) mà bạn đã định nghĩa ở khối Filter. Chỉ cần dư một khoảng trắng, hoặc Nginx tự nhiên chèn thêm một dấu phẩy vào log, cái khuôn của bạn sẽ vỡ. Lúc này, Logstash lập tức gắn thẻ _grokparsefailure rồi đẩy thẳng toàn bộ dòng log thô lộn xộn đó lên Elasticsearch.

2. Quy trình 3 bước "bắt bệnh" và sửa lỗi Grok

Để xử lý lỗi này, bạn tuyệt đối không được sửa tệp cấu hình (config) rồi khởi động lại Logstash liên tục. Việc đó vô cùng tốn thời gian. Hãy làm theo 3 bước sau:

  • Bước 1: Tìm dòng log gây án. Mở Kibana, lọc tìm kiếm với cú pháp tags: "_grokparsefailure". Chọn ra một dòng log thô (trường message) đang bị lỗi và copy đoạn văn bản đó.
  • Bước 2: Sử dụng phòng thí nghiệm. Mở công cụ Grok Debugger (Nằm trong menu Dev Tools của Kibana). Dán dòng log vừa copy vào ô "Sample Data". Dán cái khuôn Grok hiện tại của bạn vào ô "Grok Pattern".
  • Bước 3: Gỡ từng lớp. Xóa toàn bộ khuôn Grok, chỉ để lại phần đầu tiên (ví dụ %{IP:client_ip}). Nếu hệ thống báo thành công, hãy viết tiếp phần thứ 2. Cứ làm như vậy cho đến khi bạn phát hiện ra chính xác vị trí nào trong mẫu Grok đang lệch so với dòng log thực tế.

3. Xử lý khủng hoảng "Đụng độ kiểu dữ liệu" (Mapping Clash)

Một lỗi "tàng hình" khác vô cùng nguy hiểm là Logstash chạy rất mượt, không báo lỗi gì, nhưng dữ liệu lại không xuất hiện trên Kibana. Nguyên nhân phần lớn đến từ việc xung đột kiểu dữ liệu ở đầu ra (Elasticsearch).

Ví dụ thực tế: Hôm qua, trường response_code của bạn vô tình bị Logstash đẩy lên dưới dạng Chữ (String). Elasticsearch đã ghi nhớ và đóng đinh response_code là String. Hôm nay, bạn cập nhật Logstash, dùng mutate (như học ở Bài 4) để ép kiểu response_code thành Số (Integer) và đẩy lên. Elasticsearch sẽ từ chối nhận dữ liệu mới này vì kiểu dữ liệu không khớp. Lỗi này sẽ được in ra trong file log của Logstash với từ khóa mapper_parsing_exception.

Cách khắc phục:

  • Môi trường thử nghiệm (Dev/Test): Cách nhanh nhất là xóa kho lưu trữ (index) cũ trên Elasticsearch đi và để Logstash tạo lại từ đầu với kiểu dữ liệu mới.
  • Môi trường thực tế (Production): Bạn không thể xóa dữ liệu cũ. Bạn phải dùng khối Filter đổi tên trường dữ liệu bị lỗi (ví dụ: đổi response_code thành http_status_code) hoặc ép hệ thống đẩy log sang một index hoàn toàn mới cho ngày hôm nay.

4. Bật chế độ "Soi chiếu" (Debug Mode)

Khi mọi phương pháp đều bế tắc và bạn không biết Logstash đang làm gì bên trong, hãy tạm thời tắt Logstash và khởi động lại nó bằng dòng lệnh có gắn cờ --debug.

Lúc này, thay vì chạy ngầm tĩnh lặng, Logstash sẽ in ra màn hình chi tiết từng mili-giây nó đang làm gì, dòng log nào đang bị tắc ở bộ lọc nào. Lượng chữ in ra sẽ vô cùng khổng lồ, nhưng nó là manh mối cuối cùng để bạn tìm ra vấn đề cốt lõi.

Vậy là chúng ta đã hoàn thành trọn vẹn chuỗi 10 bài học về Logstash - từ những khái niệm thô sơ nhất, cách viết các bộ lọc bóc tách, tối ưu kiến trúc với Filebeat, đảm bảo an toàn dữ liệu bằng Hàng đợi (Persistent Queue), cho đến kỹ năng gỡ lỗi trong môi trường thực tế.

Hy vọng qua series này, bạn đã có một cái nhìn hệ thống và vững vàng nhất để tự tin thiết lập "nhà máy xử lý dữ liệu" cho mọi dự án web của mình. Chúc bạn vận hành hệ thống thật mượt mà và không bao giờ bị rớt một dòng log nào!


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí