Chuyển đến nội dung chính
Mô-đun 8 · Bài học 2 trong tổng số 430/32 trong khóa học~12 min
Bài học theo mô-đun (2/4)

Trình phân tích cú pháp nhật ký Apache

Nhật ký Apache (định dạng kết hợp) có cấu trúc chính xác:

Code
127.0.0.1 - - [10/Oct/2024:13:55:36 +0000] "GET /index.html HTTP/1.1" 200 1234

Một mẫu có nhóm được đặt tên trích xuất mọi trường trong một lần chụp:

Code
^(?<ip>\d+\.\d+\.\d+\.\d+)\s+\S+\s+\S+\s+\[[^\]]+\]\s+"(?<metodo>\w+)\s+(?<path>\S+)\s+\S+"\s+(?<status>\d+)\s+(?<size>\d+)

Nó trông quái dị nhưng đó là sự kết hợp của các mẫu đơn giản:

  • (?<ip>\d+\.\d+\.\d+\.\d+) -- nguồn IPv4.
  • \s+\S+\s+\S+ -- ID người dùng (thường là -).
  • \[[^\]]+\] -- ngày trong ngoặc vuông.
  • "(?<metodo>\w+)\s+(?<path>\S+)\s+\S+" -- yêu cầu trong dấu ngoặc kép, với phương thức, đường dẫn và phiên bản HTTP.
  • (?<status>\d+)\s+(?<size>\d+) -- mã trạng thái và byte đã gửi.

Chiến lược chung

  1. Bắt đầu từ dòng thực và ghim các dấu phân cách: dấu cách, dấu ngoặc kép, dấu ngoặc.
  2. Giữa các dấu phân cách, xác định loại mã thông báo (IP, từ, số).
  3. Gói trong các nhóm được đặt tên chỉ những gì bạn cần trích xuất.

Phân tích nhật ký phức tạp

Trong phân tích cú pháp nhật ký, các trường thường được phân tách bằng dấu cách trừ khi chúng chứa chuỗi hoặc dấu ngoặc kép (ví dụ: tác nhân người dùng). Việc sử dụng loại trừ các lớp ký tự thay vì dấu chấm ký tự đại diện sẽ ngăn việc hợp nhất nhiều cột không chính xác.

Hãy thử nó

tập thể dục#regex.m8.l2.e1
Nỗ lực: 0Đang tải…

Trích xuất IPv4 ở đầu mỗi dòng nhật ký dưới dạng nhóm được đặt tên `ip`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Neo vào đầu dòng bằng ^ và cờ m, đồng thời bọc IP trong (?<ip>...).

Giải pháp khả dụng sau 3 lần thử

Xem lại bài tập

tập thể dục#regex.m8.l2.e2
Nỗ lực: 0Đang tải…

Trích xuất phương thức HTTP và đường dẫn của yêu cầu giữa các dấu ngoặc kép, dưới dạng nhóm `methodo` và `path`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Mở bằng ", sau đó (?<metodo>\\w+)\\s+(?<path>\\S+).

Giải pháp khả dụng sau 3 lần thử

Thử thách bổ sung

tập thể dục#regex.m8.l2.e3
Nỗ lực: 0Đang tải…

Extract only the date and time part enclosed in brackets in logs, e.g. `10/Oct/2024:13:55:36 +0000`, as a named group `timestamp`.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Use \[(?<timestamp>[^\]]+)\] to prevent the engine from matching past the closing bracket.

Giải pháp khả dụng sau 3 lần thử