ฉันต้องการมีไฟล์บันทึกที่กำหนดเองสำหรับผู้ใช้ทุกคนที่เข้าถึงโฮสต์เสมือน
ชื่อผู้ใช้มีอยู่ในตัวแปรสภาพแวดล้อม "SSL_CLIENT_S_DN_CN" (มาจากการรับรองความถูกต้องของใบรับรองไคลเอ็นต์)
ก่อนอื่นฉันลองทำบางอย่างเช่น
บันทึกที่กำหนดเอง /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"
ซึ่งเห็นได้ชัดว่าใช้งานไม่ได้เนื่องจากโมดูลบันทึกไม่ขยายตัวแปรในเส้นทางของไฟล์ด้วยตัวมันเอง
ปัญหาของฉันคล้ายกับ นี้ที่นี่แต่ฉันต้องการการทดแทนตามคำขอ ไม่ใช่เพียงครั้งเดียวเมื่อ Apache โหลดการกำหนดค่าไซต์
mod_macro ดูเหมือนว่าจะทำการขยายเพียงครั้งเดียวเมื่อโหลดการกำหนดค่า ดังนั้นวิธีการนี้จึงไม่สามารถแก้ปัญหาของฉันได้
ฉันยังลองทำการสร้างบันทึกในสคริปต์ภายนอก (logtest) โดยใช้คุณสมบัติ "log pipe" แต่สิ่งนี้นำไปสู่ "ข้อผิดพลาดในเงื่อนไขข้อ":
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"
เป็นไปได้ไหมที่จะได้รับบางอย่าง เช่น มาโครที่กำลังดำเนินการสำหรับทุกคำขอ เพื่อที่ฉันจะได้สร้างไฟล์บันทึกแยกต่างหากสำหรับผู้ใช้ทุกคน
แก้ไข:
ฉันมีวิธีแก้ไขชั่วคราวโดยใช้ "piped logs" ดังนี้:
apache ไซต์ conf:
CustomLog "|/usr/local/bin/apache_logger" "%t %h %{SSL_CLIENT_S_DN_CN}x %{SSL_PROTOCOL}x %{SSL_CIPHER}x %H \"%r\" %b"
สคริปต์ทุบตีอยู่ที่ /usr/local/bin/apache_logger:
#!/bin/bash
ในขณะที่อ่าน STDIN
ทำ
# รูปแบบ: [TIMESTAMP] IP USERNAME TLS CYPHER PROTOCOL ขนาด "คำขอ"
TIMESTAMP=$(echo "$STDIN" | ตัด -d" " -f1-2)
IP=$(echo "$STDIN" | ตัด -d" " -f3)
USER=$(echo "$STDIN" | ตัด -d" " -f4)
TLS=$(echo "$STDIN" | ตัด -d" " -f5)
CYPHER=$(echo "$STDIN" | ตัด -d" " -f6)
โปรโตคอล=$(echo "$STDIN" | ตัด -d" " -f7)
REQUEST=$(echo "$STDIN" | ตัด -d" " -f8-10)
SIZE=$(echo "$STDIN" | ตัด -d" " -f11)
echo "$TIMESTAMP $IP $USER $TLS $CYPHER $PROTOCOL $REQUEST $SIZE" >> /var/log/apache2/by_user/$USER.log
เสร็จแล้ว
ทางออก 0
ดูเหมือนว่าจะทำงานตามที่คาดไว้ในตอนนี้ คงจะดีไม่น้อยหากสามารถทำได้โดยไม่ต้องใช้การเรียกสคริปต์จากภายนอกที่มีราคาแพง