Bài học 2: Viết cấu hình Logstash đầu tiên - Cấu trúc một File Config
Trong Logstash, để ra lệnh cho "nhà máy" hoạt động, bạn cần viết một tệp cấu hình (thường có đuôi là .conf). Tệp này sử dụng một cú pháp rất dễ đọc, được chia làm 3 khối (block) chính: input, filter, và output mà chúng ta đã học ở Bài 1.
1. Bài toán đặt ra (Dữ liệu thô)
Giả sử Nginx của bạn sinh ra một dòng nhật ký (log) thô như sau khi có người truy cập:
192.168.1.10 - - [13/Jul/2026:10:00:00 +0700] "GET /index.html HTTP/1.1" 200 1024
Nếu nhìn bằng mắt thường, bạn biết 192.168.1.10 là địa chỉ IP, GET /index.html là trang họ truy cập, và 200 là mã thành công. Nhưng máy tính thì không hiểu, nó chỉ coi đây là một chuỗi văn bản dài. Chúng ta cần Logstash tách chúng ra.
2. Viết file cấu hình (nginx-logstash.conf)
Dưới đây là một tệp cấu hình Logstash hoàn chỉnh để xử lý dòng log trên:
# 1. KHỐI INPUT: Lấy dữ liệu từ đâu?
input {
file {
path => "/var/log/nginx/access.log"
start_position => "beginning"
}
}
# 2. KHỐI FILTER: Xử lý dữ liệu như thế nào?
filter {
grok {
match => {
"message" => "%{IPORHOST:client_ip} - %{DATA:remote_user} \[%{HTTPDATE:time_local}\] \"%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}\" %{NUMBER:response_code} %{NUMBER:body_bytes_sent}"
}
}
}
# 3. KHỐI OUTPUT: Gửi dữ liệu đi đâu?
output {
# Đẩy lên Elasticsearch để lưu trữ
elasticsearch {
hosts => ["http://localhost:9200"]
index => "nginx-logs-%{+YYYY.MM.dd}"
}
# Đồng thời in ra màn hình để kiểm tra (test)
stdout {
codec => rubydebug
}
}
3. Giải ngố đoạn mã cấu hình trên
- Khối input: Chúng ta sử dụng plugin có tên là file. Logstash sẽ liên tục chầu chực ở đường dẫn /var/log/nginx/access.log. Bất cứ khi nào Nginx ghi thêm một dòng log mới vào file này, Logstash sẽ ngay lập tức hút dòng đó vào.
- Khối filter: Chúng ta sử dụng một plugin tên là grok. Bạn cứ hiểu grok giống như một cái khuôn dập. Nó áp cái khuôn đó lên dòng văn bản thô, và ép từng từ vào từng nhãn dán cụ thể. Ví dụ: nó gán 192.168.1.10 thành client_ip, gán 200 thành response_code.
- Khối output: Chúng ta gọi đến plugin elasticsearch. Dữ liệu sau khi được cắt gọt sạch sẽ được đẩy thẳng vào kho Elasticsearch, tạo thành một thư mục (index) có gắn ngày tháng, ví dụ: nginx-logs-2026.07.13.
4. Kết quả sau khi chạy
Từ một chuỗi văn bản lộn xộn ban đầu, qua tay Logstash, nó sẽ biến thành một cấu trúc dữ liệu gọn gàng (dạng JSON) như thế này để Kibana có thể đọc được:
{
"client_ip": "192.168.1.10",
"time_local": "13/Jul/2026:10:00:00 +0700",
"method": "GET",
"request": "/index.html",
"response_code": "200",
"body_bytes_sent": "1024"
}
Giờ thì Kibana đã có thể vẽ biểu đồ: "Hôm nay có bao nhiêu request có response_code là 200" cực kỳ dễ dàng!
Trong khối filter ở trên, grok được coi là "trái tim" và là phần khó nhất khi học Logstash. Bạn muốn Bài học 3 của chúng ta tập trung giải mã cách tự viết một mẫu grok để xử lý bất kỳ loại văn bản nào, hay bạn muốn học cách cài đặt Logstash lên máy tính để chạy thử tệp cấu hình này trước?
All rights reserved