Giới thiệu
Trong bài viết này, chúng tôi sẽ hướng dẫn bạn cách cấu hình Logstash để trích xuất các trường dữ liệu cần thiết từ log và viết tắt chúng. Việc này giúp bạn dễ dàng hơn trong việc thực hiện truy vấn bằng ngôn ngữ KQL (Kibana Query Language).
Cấu hình Logstash
Dưới đây là cấu hình mẫu cho Logstash:
Phần Filter
json
filter {
# Sử dụng grok để trích xuất các trường từ log
grok {
match => {
"message" => ""
{"instant":{"epochSecond":%{NUMBER:epoch_sec},"nanoOfSecond":%{NUMBER:nano_sec},"thread":"%{DATA:thread}","level":"%{WORD:level}","loggerName":"%{DATA:logger_name}","message":"%{GREEDYDATA:log_message}","endOfBatch":%{GREEDYDATA:end_of_batch},"loggerFqcn":"%{DATA:logger_fqcn}","contextMap":{"traceId":"%{DATA:trace_id}","spanId":"%{DATA:span_id}","className":"%{DATA:class_name}","clientIp":"%{IP:client_ip}","clientMessageId":"%{DATA:client_message_id}","clientTime":"%{TIMESTAMP_ISO8601:client_time}","duration":%{NUMBER:duration},"methodName":"%{DATA:method_name}","path":"%{DATA:path}","stackTrace":"%{GREEDYDATA:stack_trace}"},"threadId":%{NUMBER:thread_id},"threadPriority":%{NUMBER:thread_priority},"logType":"%{WORD:log_type}","application":"%{DATA:application}","localIp":"%{IP:local_ip}"}
""
}
}
# Tạo các trường viết tắt
mutate {
add_field => {
"ts" => "%{epoch_sec}"
"ip" => "%{client_ip}"
"msgId" => "%{client_message_id}"
"duration" => "%{duration}"
"method" => "%{method_name}"
"path" => "%{path}"
"app" => "%{application}"
"localIp" => "%{local_ip}"
"logType" => "%{log_type}"
}
remove_field => ["instant", "thread", "level", "logger_name", "message", "endOfBatch", "logger_fqcn", "contextMap", "threadId", "threadPriority"]
}
}
Giải thích Cấu hình
-
Input: Logstash sẽ đọc dữ liệu từ một file JSON. Hãy nhớ thay đổi đường dẫn
"/path/to/your/logfile.log"
thành đường dẫn thực tế của file log bạn sử dụng. -
Filter: Phần này sử dụng
grok
để phân tích log và trích xuất thông tin cần thiết. Sau đó, chúng ta sử dụngmutate
để tạo các trường mới viết tắt, giúp tiết kiệm không gian lưu trữ và dễ dàng quản lý thông tin.
Output
Dữ liệu sẽ được ghi vào Elasticsearch với tên index có định dạng ngày tháng. Ngoài ra, Logstash cũng sẽ xuất dữ liệu ra stdout để bạn có thể kiểm tra.
Cấu hình Logstash với Grok
Nếu bạn muốn sử dụng grok để phân tích log trước khi lấy ra các trường cần thiết, cấu hình dưới đây có thể được sử dụng:
Phần Filter
json
filter {
# Sử dụng grok để trích xuất các trường từ log
grok {
match => {
"message" => "..."
}
}
# Tạo các trường viết tắt
mutate {
add_field => {
"ts" => "%{epoch_sec}"
"ip" => "%{client_ip}"
"msgId" => "%{client_message_id}"
"duration" => "%{duration}"
"method" => "%{method_name}"
"path" => "%{path}"
"app" => "%{application}"
"localIp" => "%{local_ip}"
"logType" => "%{log_type}"
}
remove_field => ["instant", "thread", "level", "logger_name", "message", "endOfBatch", "logger_fqcn", "contextMap", "threadId", "threadPriority"]
}
}
Template JSON cho Log
json
{
"template": {
"mappings": {
"properties": {
"ts": {
"type": "date",
"format": "epoch_second"
},
"ip": {
"type": "ip"
},
"msgId": {
"type": "keyword"
},
"duration": {
"type": "integer"
},
"method": {
"type": "keyword"
},
"path": {
"type": "keyword"
},
"app": {
"type": "keyword"
},
"localIp": {
"type": "ip"
},
"logType": {
"type": "keyword"
},
"loggerName": {
"type": "keyword"
},
"level": {
"type": "keyword"
},
"clientTime": {
"type": "date",
"format": "strict_date_optional_time||epoch_millis"
},
"stackTrace": {
"type": "text"
}
}
}
}
}
Giải thích Template JSON
- mappings: Phần này định nghĩa các trường và kiểu dữ liệu mà bạn sẽ gửi lên Elasticsearch. Mỗi trường được xác định rõ ràng để đảm bảo Elasticsearch có thể hiểu và phân tích đúng cách.
- ts: Thời gian log dưới dạng epoch_second.
- ip: Địa chỉ IP của client.
- msgId: ID message dưới dạng keyword.
- duration: Thời gian xử lý dưới dạng integer.
- method: Phương thức HTTP dưới dạng keyword.
- path: Đường dẫn API dưới dạng keyword.
- app: Tên ứng dụng dưới dạng keyword.
- localIp: Địa chỉ IP cục bộ dưới dạng ip.
- logType: Loại log với các giá trị REQUEST/RESPONSE dưới dạng keyword.
- loggerName và level: Thông tin về logger và mức độ log.
- clientTime: Thời gian từ client với định dạng hỗ trợ nhiều kiểu dữ liệu và stackTrace: Kiểu text cho thông tin lỗi.
Bài viết này cung cấp cho bạn những kiến thức cần thiết để tối ưu hóa việc xử lý log trong hệ thống của bạn. Hãy thực hiện theo từng bước và tùy chỉnh cấu hình cho phù hợp với nhu cầu cụ thể của bạn.
source: viblo