0

Bài học 3: Giải mã Grok - "Trái tim" của Logstash Filter

1. Grok thực chất là gì?

Bản chất của mọi dữ liệu log đều là văn bản. Để trích xuất thông tin từ văn bản, các lập trình viên thường dùng Biểu thức chính quy (Regular Expressions - Regex). Tuy nhiên, Regex vô cùng phức tạp và khó đọc.

Grok ra đời để giải quyết vấn đề đó. Nó đóng gói những đoạn Regex phức tạp thành những tên gọi ngắn gọn, dễ hiểu. Bạn chỉ cần gọi tên các gói này ra và ghép chúng lại với nhau để khớp với dòng log của bạn.

2. Cú pháp vàng của Grok

Mọi mẫu (pattern) trong Grok đều tuân theo một cú pháp duy nhất:

%{SYNTAX:SEMANTIC}

  • SYNTAX (Cú pháp): Tên của mẫu Grok có sẵn (đại diện cho loại dữ liệu bạn muốn tìm). Ví dụ: NUMBER (số), IP (địa chỉ IP).
  • SEMANTIC (Ngữ nghĩa): Tên cái nhãn (field) mà bạn muốn đặt cho dữ liệu vừa tìm được để lưu vào cơ sở dữ liệu.

Ví dụ: Nếu trong log có con số 404 và bạn muốn lưu nó lại dưới tên là status_code, bạn sẽ viết: %{NUMBER:status_code}

3. Các mẫu Grok phổ biến nhất

Logstash cung cấp sẵn hơn 120 mẫu Grok. Dưới đây là những mẫu "quen mặt" nhất mà bạn sẽ dùng thường xuyên:

  • WORD: Khớp với một từ duy nhất (không có khoảng trắng). Ví dụ: GET, POST, Nginx.
  • NUMBER: Khớp với các con số (nguyên hoặc thập phân). Ví dụ: 200, 3.14.
  • IP: Khớp với một địa chỉ IP (IPv4 hoặc IPv6). Ví dụ: 192.168.1.1.
  • TIMESTAMP_ISO8601: Khớp với định dạng thời gian chuẩn. Ví dụ: 2026-07-13T10:00:00Z.
  • DATA: Khớp với mọi loại ký tự, thường dùng để quét qua các đoạn văn bản ngắn.
  • GREEDYDATA: Khớp với toàn bộ phần văn bản còn lại của dòng log (thường dùng ở cuối cùng).

4. Thực hành: Tự viết một mẫu Grok

Hãy tưởng tượng hệ thống ứng dụng của bạn tự sinh ra một dòng log tự tạo (custom log) có dạng như sau:

[2026-07-13] ERROR - User admin123 failed to login from 10.0.0.5

Chúng ta sẽ phân tích và dập khuôn từng phần một:

  1. [2026-07-13]: Đây là thời gian. Ta dùng [%{DATA:date}] (Lưu ý: dấu ngoặc vuông [ và ] là ký tự đặc biệt, cần thêm dấu \ phía trước để Logstash hiểu đó chỉ là văn bản bình thường).
  2. ERROR: Đây là chữ thể hiện mức độ log. Ta dùng %{LOGLEVEL:level}.
  3. -: Dấu gạch ngang và khoảng trắng, ta chỉ cần gõ đúng dấu - và khoảng trắng vào khuôn.
  4. User admin123 failed to login from: Một đoạn văn bản. Ta có thể tóm gọn cả đoạn này thành %{DATA:message}.
  5. 10.0.0.5: Địa chỉ IP. Ta dùng %{IP:client_ip}.

Lắp ghép tất cả lại, ta có mẫu Grok hoàn chỉnh:

match => { 
  "message" => "\[%{DATA:date}\] %{LOGLEVEL:level} - %{DATA:message} %{IP:client_ip}" 
}

Kết quả đầu ra (JSON) mà Kibana sẽ nhận được:

{
  "date": "2026-07-13",
  "level": "ERROR",
  "message": "User admin123 failed to login from",
  "client_ip": "10.0.0.5"
}

5. Lời khuyên cho kỹ sư vận hành (Pro Tip)

Khi viết Grok, đừng bao giờ viết một mạch từ đầu đến cuối rồi đưa lên máy chủ chạy thử ngay. Hãy làm từng bước:

  1. Copy dòng log mẫu của bạn.
  2. Mở các công cụ Grok Debugger (Có sẵn trong Kibana ở phần Dev Tools, hoặc các trang web online miễn phí).
  3. Viết từng mẫu %{...} một và kiểm tra xem nó có khớp (match) thành công không. Điều này giúp bạn tiết kiệm hàng giờ đồng hồ tìm lỗi cú pháp.

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í