1. Tổng quan.
GELF TCP (Graylog Extended Log Format over TCP) là một định dạng gửi log mở rộng dựa trên TCP được sử dụng phổ biến trong hệ thống quản lý log như Graylog. GELF là viết tắt của “Graylog Extended Log Format,” và nó là một định dạng log linh hoạt được thiết kế để thu thập và gửi log từ các nguồn khác nhau đến Graylog hoặc các hệ thống quản lý log khác.
Một số đặc điểm chính của GELF TCP bao gồm:
- Mạng TCP: GELF TCP sử dụng giao thức TCP để gửi log, điều này đảm bảo tính đáng tin cậy trong việc truyền log từ nguồn đến hệ thống quản lý log.
- JSON-Based: GELF sử dụng định dạng JSON để biểu thị dữ liệu log. Điều này làm cho nó dễ dàng để biểu thị các sự kiện log có cấu trúc phức tạp và linh hoạt trong việc thêm các trường tùy chỉnh vào log.
- Hỗ trợ cho nhiều loại dữ liệu: GELF hỗ trợ nhiều loại dữ liệu log, bao gồm thông điệp log, thông tin về nguồn gốc, mức độ nghiêm trọng, và nhiều trường tùy chỉnh khác.
- Nhiều cấp độ nghiêm trọng: GELF cho phép định rõ cấp độ nghiêm trọng của mỗi thông điệp log, giúp người quản trị có khả năng ưu tiên và tùy chỉnh quy trình xử lý log.
- Phản hồi và xác thực: GELF TCP có khả năng cung cấp phản hồi cho việc gửi log và hỗ trợ xác thực để đảm bảo tính bảo mật trong quá trình truyền log.
- Sử dụng trong Graylog: GELF là định dạng log mặc định được sử dụng trong Graylog, một hệ thống quản lý log mã nguồn mở. Graylog hỗ trợ thu thập, lưu trữ, truy vấn và hiển thị log dựa trên GELF.
Sử dụng GELF TCP giúp các hệ thống quản lý log hiệu quả thu thập, lưu trữ và hiển thị thông tin từ nhiều nguồn log khác nhau trong một môi trường phân tán hoặc trên nhiều máy chủ log.
2. Thực hành.
Hãy vào System / Inputs, tại Inputs chọn GELF TCP hoặc GELF UDP tùy bạn đang đẩy log theo giao thức UDP hay TCP, sau đó bấm Launch new input.
Phần này mình để mặc định hết, chỉ tích vào Global và đặt tên cho Inputs này là CiscoARP.
Do hình kéo dài nên mình chia thành 2, chọn Launch Input.
Như vậy bạn đã tạo xong một Global inputs tên CiscoARP.
Giờ mình sử dụng đoạn code Python dưới để đẩy data_json vào server Graylog.
import json
import logging
import graypy
graylog_address = '192.168.100.114'
logs_type = 'hoanghd-demo-1'
data_json = [{"Mac Address": "00b0.e122.d162", "Ports": "Vl301", "Device": "192.168.100.254", "Address": "192.168.131.126", "Interface": "Vlan301"},
{"Mac Address": "00b0.e122.d177", "Ports": "Vl302", "Device": "192.168.100.254", "Address": "192.168.131.254", "Interface": "Vlan302"},
{"Mac Address": "00b0.e122.d15a", "Ports": "Vl303", "Device": "192.168.100.254", "Address": "192.168.132.126", "Interface": "Vlan303"},
{"Mac Address": "00b0.e122.d164", "Ports": "Vl304", "Device": "192.168.100.254", "Address": "192.168.132.254", "Interface": "Vlan304"},
{"Mac Address": "00b0.e122.d17a", "Ports": "Vl305", "Device": "192.168.100.254", "Address": "192.168.133.126", "Interface": "Vlan305"},
{"Mac Address": "00b0.e122.d140", "Ports": "Vl306", "Device": "192.168.100.254", "Address": "192.168.133.254", "Interface": "Vlan306"},
{"Mac Address": "00b0.e122.d165", "Ports": "Vl307", "Device": "192.168.100.254", "Address": "192.168.134.254", "Interface": "Vlan307"},
{"Mac Address": "000c.2927.180e", "Ports": "Gi1/0/11", "Device": "192.168.100.254", "Address": "192.168.99.253", "Interface": "Vlan99"},
{"Mac Address": "00b0.e122.d15d", "Ports": "Vl99", "Device": "192.168.100.254", "Address": "192.168.99.254", "Interface": "Vlan99"}]
def sendlog_to_graylog(graylog_address,logs_type,data_json):
send_logger = logging.getLogger(logs_type)
send_logger.setLevel(logging.DEBUG)
handler = graypy.GELFTCPHandler(graylog_address, 12201)
send_logger.addHandler(handler)
for data in data_json:
data_str = json.dumps(data)
data_with_double_quotes = data_str.replace("'", "\"")
send_logger.debug(data_with_double_quotes)
print(data_with_double_quotes)
sendlog_to_graylog(graylog_address,logs_type,data_json)
Nếu đẩy thành công bạn sẽ có thông báo 1 minute average rate: 1msg/s, tức là đã có một event đầu tiên được đẩy vào Graylog.
Bấm Show received messages bạn sẽ thấy kết quả, Graylog đã nhận được event.
Nếu bấm vào một log bất kỳ bạn sẽ thấy nội dung của log nhưng nó chưa được tách ra các trường.
Nhấp vào trường message và chọn Create extractor.
Tại Select extractor type chọn Grok pattern.
Grok pattern là một cách mạnh mẽ và linh hoạt để phân tích và cắt nhỏ các dòng log hoặc dữ liệu văn bản không cấu trúc thành các trường dữ liệu có ý nghĩa. Grok pattern được sử dụng rộng rãi trong các hệ thống quản lý log (log management) như Logstash, Graylog, Elasticsearch, và nhiều công cụ khác để tiêu biểu hóa và biến đổi dữ liệu log thành dạng có cấu trúc, dễ dàng tìm kiếm và phân tích.
Giả sử mình chọn 1 dòng log sau để phân tích.
"Mac Address": "00b0.e122.d15d", "Ports": "Vl99", "Device": "192.168.100.254", "Address": "192.168.99.254", "Interface": "Vlan99"}
Và dưới đây là nội dung Grok của mình để phân tích đoạn log trên.
\{"Mac Address": "%{DATA:mac_address}", "Ports": "%{DATA:ports}", "Device": "%{IP:device}", "Address": "%{IP:address}", "Interface": "%{WORD:interface}"\}
Bạn có thể sử dụng công cụ trực tuyến https://grokdebugger.com/ để check lại nó. Bạn sẽ có kết quả là một list chứa dictionary trong đó có danh sách các trường.
Giờ đưa đoạn grok trên vào Grok pattern và bấm Try against example.
Bạn sẽ nhận được đầu ra ở phần Extractor preview.
Hãy đặt tên cho Grok này tại Extractor title và bấm Create extractor.
Bạn sẽ có một Grok pattern tên CiscoARP như dưới.
Như vậy từ giờ trở đi các log có định dạng như đã phân tích ở trên sẽ được áp dụng Grok pattern này và bạn có kết quả như dưới.