Một điều tôi chưa từng thấy ai làm, vì những lý do mà tôi không thể tưởng tượng được, là thay đổi định dạng tệp nhật ký Apache thành phiên bản dễ phân tích cú pháp hơn với thông tin thực sự quan trọng với bạn.
Ví dụ: chúng tôi không bao giờ sử dụng xác thực cơ bản HTTP, vì vậy chúng tôi không cần phải đăng nhập các trường đó. Tôi đang quan tâm đến từng yêu cầu phải mất bao lâu để phục vụ, vì vậy chúng tôi sẽ thêm rằng trong. Đối với một dự án, chúng tôi cũng muốn biết (về cân bằng tải của chúng tôi) nếu bất kỳ máy chủ đang phục vụ yêu cầu chậm hơn so với những người khác, vì vậy chúng tôi đăng nhập tên của máy chủ chúng tôi ủy quyền trở lại.
Đây là một đoạn trích từ cấu hình apache của một máy chủ:
# We don't want to log bots, they're our friends
BrowserMatch Pingdom.com robot
# Custom log format, for testing
#
# date proto ipaddr status time req referer user-agent
LogFormat "%{%F %T}t %p %a %>s %D %r %{Referer}i %{User-agent}i" standard
CustomLog /var/log/apache2/access.log standard env=!robot
Điều bạn không thể thực sự nói từ điều này là giữa mỗi trường là một ký tự tab theo nghĩa đen (\ t). Điều này có nghĩa là nếu tôi muốn thực hiện một số phân tích trong Python, có thể hiển thị các trạng thái không 200 chẳng hạn, tôi có thể làm điều này:
for line in file("access.log"):
line = line.split("\t")
if line[3] != "200":
print line
Hoặc nếu tôi muốn làm 'ai đang hotlinking hình ảnh?' nó sẽ là
if line[6] in ("","-") and "/images" in line[5]:
Đối với số lượng IP trong nhật ký truy cập, ví dụ trước:
grep -o "[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}" logfile | sort -n | uniq -c | sort -n
trở thành một cái gì đó như thế này:
cut -f 3 log | uniq -c | sort -n
Dễ đọc và dễ hiểu hơn, và ít tốn kém hơn về mặt tính toán (không có regex), trên nhật ký 9 GB, tạo ra sự khác biệt rất lớn trong thời gian sử dụng. Khi điều này thực sự gọn gàng là nếu bạn muốn làm điều tương tự cho các Tác nhân người dùng. Nếu nhật ký của bạn được phân cách bằng dấu cách, bạn phải thực hiện một số tìm kiếm biểu thức chính quy hoặc tìm kiếm chuỗi bằng tay. Với định dạng này, thật đơn giản:
cut -f 8 log | uniq -c | sort -n
Chính xác như trên. Trong thực tế, bất kỳ tóm tắt nào bạn muốn làm về cơ bản là giống hệt nhau.
Tại sao tôi lại dành CPU của hệ thống của mình cho awk và grep khi bị cắt sẽ thực hiện chính xác những gì tôi muốn các đơn đặt hàng có cường độ nhanh hơn?