0
0
Lập trình
Harry Tran
Harry Tran106580903228332612117

[AWS Log Insight] Hướng dẫn chi tiết về các patterns và use cases phổ biến để lọc logs hiệu quả trên AWS Log Insights

Đăng vào 3 tuần trước

• 4 phút đọc

Mở đầu

Trong quá trình quản lý hệ thống, việc theo dõi logs là một trong những nhiệm vụ quan trọng, đặc biệt là khi hệ thống gặp sự cố hoặc cần phân tích hành vi người dùng. Đối với những hệ thống chạy trên nền tảng AWS, AWS CloudWatch trở thành một công cụ không thể thiếu trong việc quản lý và phân tích logs. Bài viết này sẽ giới thiệu về AWS Log Insights, một tính năng mạnh mẽ của CloudWatch, giúp bạn thực hiện phân tích và lọc logs một cách hiệu quả. Chúng ta sẽ cùng khám phá một số patterns và use cases hữu ích thường được áp dụng trong các tình huống thực tế.

Kiến thức nền tảng

Cú Pháp Truy Vấn

CloudWatch Logs Insights sử dụng một ngôn ngữ truy vấn đặc biệt cho phép người dùng thực hiện nhiều tác vụ như thao tác số học, so sánh, sử dụng regular expressions (regex), và nhiều lệnh khác để lọc logs. Cú pháp cơ bản của truy vấn bao gồm:

  • Ký tự (|): Dùng để kết nối nhiều lệnh trong một truy vấn.
  • Chú thích: Được bắt đầu bằng ký tự thăng (#).

Một số lệnh phổ biến

  • filter: Dùng để lọc kết quả theo một pattern nhất định.
  • limit: Giới hạn số lượng kết quả trả về.
  • sort: Sắp xếp kết quả theo thứ tự nhất định.

Ví dụ đơn giản

Khi tester vào trang homepage và gặp lỗi 5xx, developer sẽ cần sử dụng truy vấn sau để tìm kiếm logs có chứa từ "ERROR":

Copy
fields @timestamp, @message, @logStream, @log
| filter @message like "ERROR"
| sort @timestamp desc
| limit 10

Truy vấn này sẽ tìm kiếm các logs chứa từ "ERROR" và sắp xếp theo thời gian giảm dần. Bạn có thể sử dụng khoảng thời gian cụ thể như sau:

Copy
| filter @timestamp between 1627824000000 and 1627910399999

Sử dụng pattern để nhóm logs

Lệnh pattern cho phép bạn nhóm các logs có cấu trúc tương tự. Ví dụ, nếu bạn có những logs sau:

Copy
ERROR 2024-08-25T12:34:56 Unable to connect to database server at db.example.com
INFO 2024-08-25T12:35:00 User JohnDoe logged in from IP 192.168.1.1
WARN 2024-08-25T12:36:22 Memory usage is at 85% on server web01
INFO 2024-08-25T12:36:45 User JaneDoe logged in from IP 192.168.1.2
ERROR 2024-08-25T12:37:01 Unable to connect to database server at db.example.com

Bạn có thể sử dụng lệnh pattern như sau:

Copy
fields @message
| pattern @message /(?<level>[A-Z]+) (?<timestamp>\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}) (?<message>.+)/
| display level, timestamp, message

Kết quả sẽ hiển thị các log được xác định rõ ràng với các trường như mức độ (level), thời gian (timestamp) và nội dung thông điệp (message).

Lệnh parse

Lệnh parse cho phép bạn trích xuất dữ liệu từ một trường log để tạo ra các trường mới. Ví dụ, để trích xuất thông tin người dùng và địa chỉ IP từ một log dài:

Copy
fields @message
| parse @message "User * logged in from IP *" as username, ip_address
| display username, ip_address

Lệnh stats

Lệnh stats giúp bạn thực hiện các thao tác thống kê như count, sum, avg. Ví dụ, bạn có thể ước lượng lưu lượng truy cập của người dùng theo từng giờ:

Các lệnh khác

  • display: Hiển thị các trường cụ thể trong kết quả truy vấn.
  • fields: Lựa chọn và hiển thị các trường cụ thể từ dữ liệu log.
  • diff: So sánh các sự kiện log giữa hai khoảng thời gian khác nhau để phát hiện sự khác biệt.

Một vài usecases

Trong quá trình làm việc thực tế, có nhiều tình huống mà chúng ta cần sử dụng logs để tìm lỗi hoặc phân tích các vấn đề. Dưới đây là một số truy vấn hữu ích:

1. Truy vấn lỗi theo màn hình chứa lỗi:

Copy
fields @timestamp, @message
| filter extra.url like /products\/sales/ and @message like /Error/
| sort @timestamp desc
| limit 120

2. Tính số request dựa trên path:

Copy
fields @timestamp, @message
| parse @message "request=\"GET *\"" as request
| stats count(*) as num_request by request
| sort num_request desc
| limit 20

3. Thống kê số lượng request theo thời gian:

Copy
filter @message like /homepage/
| stats count(*) as num_request by bin(1h)
| sort num_request desc

4. Truy vấn slow query từ logs của RDS:

Copy
parse @message /# Time:\s(?<Time>.*?)\sUser@Host: (?<User>.*)\[.*?\]\s@ \s\.(?<Host>.*?). Id: \d*\s# Query_time: (?<Query_time>.*?)\s Lock_time: (?<Lock_time>.*?)\sRows_sent: (?<Rows_sent>.*?)\sRows_examined: (?<Rows_examined>.*?)\s(?<Query>.*)/
| filter User like 'db_user'
| filter Query_time > 4
| sort Query_time desc

5. Thống kê số lượng slow query trong mỗi 10 phút:

Copy
parse @message /# Time:\s(?<Time>.*?)\sUser@Host: (?<User>.*)\[.*?\]\s@ \s\.(?<Host>.*?). Id: \d*\s# Query_time: (?<Query_time>.*?)\s Lock_time: (?<Lock_time>.*?)\sRows_sent: (?<Rows_sent>.*?)\sRows_examined: (?<Rows_examined>.*?)\s(?<Query>.*)/ 
| filter Query_time > 5
| stats count(*) as count_total by bin(10m) as block_time
| sort count_total desc

Lưu ý quan trọng

Khi thực hiện lọc logs, hãy luôn thu hẹp phạm vi thời gian để giảm thiểu chi phí không đáng có. Việc quét quá nhiều logs có thể gây tốn kém. Hãy cẩn trọng và lập kế hoạch cho việc điều tra logs của bạn.

Kết luận

AWS CloudWatch Log Insights là một công cụ mạnh mẽ giúp bạn quản lý và phân tích logs hiệu quả. Bằng việc sử dụng cú pháp và lệnh truy vấn phù hợp, bạn có thể nhanh chóng phát hiện và xử lý các vấn đề trong hệ thống của mình. Hy vọng rằng bài viết này đã cung cấp thông tin bổ ích cho bạn. Nếu bạn có thêm bất kỳ truy vấn hay nào, hãy bình luận để chúng ta cùng học hỏi nhé!
source: viblo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào