Tôi muốn có tệp nhật ký tùy chỉnh cho mọi người dùng truy cập máy chủ ảo.
Tên người dùng có trong biến môi trường "SSL_CLIENT_S_DN_CN" (đến từ xác thực chứng chỉ ứng dụng khách).
Vì vậy, đầu tiên tôi đã thử một cái gì đó như
Nhật ký tùy chỉnh /var/log/apache2/by_user/%{SSL_CLIENT_S_DN_CN}x.log \
"%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
rõ ràng là không hoạt động vì mô-đun nhật ký không tự mở rộng biến trong đường dẫn tệp.
vấn đề của tôi là tương tự như cái này đây, nhưng tôi cần thay thế dựa trên yêu cầu, không chỉ một lần khi Apache tải cấu hình trang web.
mod_macro dường như chỉ thực hiện mở rộng một lần khi cấu hình được tải, vì vậy phương pháp này không giải quyết được sự cố của tôi.
Tôi cũng đã thử tạo nhật ký trong tập lệnh bên ngoài (logtest) bằng tính năng "ống nhật ký", nhưng điều này dẫn đến "lỗi trong mệnh đề điều kiện":
CustomLog "|/usr/local/bin/logtest" "/var/log/apache2/by_user/%{SSL_CLIENT_S_DN_CN}x.log" \
"%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
Có thể lấy thứ gì đó giống như macro đang được thực thi cho mọi yêu cầu để tôi có thể tạo các tệp nhật ký riêng cho mọi người dùng không?
CHỈNH SỬA:
Tôi hiện có một giải pháp tạm thời bằng cách sử dụng "nhật ký đường ống" như thế này:
conf trang web apache:
Nhật ký tùy chỉnh "|/usr/local/bin/apache_logger" "%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
tập lệnh bash nằm ở /usr/local/bin/apache_logger:
#!/bin/bash
trong khi đọc STDIN
làm
# định dạng: [DẤU THỜI GIAN] IP TÊN NGƯỜI DÙNG TLS GIAO THỨC CYPHER KÍCH THƯỚC "YÊU CẦU"
DẤU THỜI GIAN=$(echo "$STDIN" | cut -d" " -f1-2)
IP=$(echo "$STDIN" | cut -d" " -f3)
USER=$(echo "$STDIN" | cut -d" " -f4)
TLS=$(echo "$STDIN" | cut -d" " -f5)
CYPHER=$(echo "$STDIN" | cut -d" " -f6)
GIAO THỨC=$(echo "$STDIN" | cut -d" " -f7)
YÊU CẦU=$(echo "$STDIN" | cut -d" " -f8-10)
SIZE=$(echo "$STDIN" | cut -d" " -f11)
echo "$TIMESTAMP $IP $USER $TLS $CYPHER $PROTOCOL $REQUEST $SIZE" >> /var/log/apache2/by_user/$USER.log
xong
thoát 0
Điều này dường như làm việc như mong đợi cho bây giờ. Tuy nhiên, sẽ thật tuyệt nếu điều này có thể được thực hiện mà không cần các cuộc gọi tập lệnh bên ngoài đắt tiền.