บันทึกการเข้าถึง“ Catch-All” กับ Apache Virtual Hosts หรือไม่


16

ฉันมีโฮสต์เสมือนมากมายตั้งอยู่บนเว็บเซิร์ฟเวอร์แต่ละแห่งมีข้อผิดพลาดและบันทึกการเข้าถึง เส้นที่เกี่ยวข้องของhttpd.confเป็นอะไรเช่นนี้:

ErrorLog /var/log/httpd-error.log
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog /var/log/httpd-access.log combined

NameVirtualHost *:80

<VirtualHost *:80>
    ServerName myhost.com
    ServerAlias www.myhost.com
    DocumentRoot /var/www/myhost.com/htdocs
    ErrorLog /var/www/myhost.com/log/error.log
    CustomLog /var/www/myhost.com/log/access.log combined
</VirtualHost>

# ... many more VirtualHosts

ขณะนี้ฉันได้รับข้อผิดพลาดแบบสุ่มใน /var/log/httpd-error.log แต่ฉันไม่ได้รับอะไรใน /var/log/httpd-access.log เป็นไปได้หรือไม่ที่มีการเข้าถึงและข้อผิดพลาดซ้ำซ้อนกับล็อกไฟล์ที่แชร์ เป็นไปได้ไหมที่จะทำสิ่งนี้โดยไม่ต้องเพิ่มรายการใหม่ให้กับ VirtualHost ทุกรายการ?

คำตอบ:


17

ดูhttp://httpd.apache.org/docs/2.2/logs.html#virtualhost

หากวางคำสั่ง CustomLog หรือ ErrorLog ไว้ในส่วนคำขอหรือข้อผิดพลาดทั้งหมดสำหรับโฮสต์เสมือนนั้นจะถูกบันทึกลงในไฟล์ที่ระบุเท่านั้น โฮสต์เสมือนใด ๆ ที่ไม่มีคำสั่งบันทึกจะยังคงมีคำขอที่ส่งไปยังบันทึกเซิร์ฟเวอร์หลัก

กล่าวอีกนัยหนึ่งถ้าคุณวางคำสั่งการบันทึกภายในส่วน VirtualHost มันจะแทนที่คำสั่งการบันทึกภายในการกำหนดค่าเซิร์ฟเวอร์หลัก หากคุณต้องการเข้าสู่ไฟล์บันทึกเดียวให้ลบการกำหนดค่าบันทึกจากส่วน VirtualHost ของคุณ

เพื่อความง่ายฉันต้องการบันทึกข้อมูล Access ทั้งหมดไปยังไฟล์บันทึกไฟล์เดียว ในภายหลังคุณสามารถประมวลผลบันทึกและแยกไฟล์บันทึกเป็นไฟล์บันทึกสำหรับโฮสต์เสมือน นอกจากนี้การเขียนไฟล์บันทึกไฟล์เดียวเป็นการใช้ทรัพยากรคอมพิวเตอร์อย่างมีประสิทธิภาพมากขึ้นจากนั้นเขียนไฟล์บันทึก 30 ไฟล์พร้อมกัน เพียงตรวจสอบให้แน่ใจว่า LogFormat ของคุณมี '% v' ซึ่งจะบันทึกชื่อของโฮสต์เสมือน

เป็นไปได้หรือไม่ที่มีการเข้าถึงและข้อผิดพลาดซ้ำซ้อนกับล็อกไฟล์ที่แชร์

คุณสามารถบันทึกข้อผิดพลาดทั้งหมดและเข้าถึง logfile ที่ใช้ร่วมกัน แต่ logfile นั้นน่าเกลียด ขั้นแรกให้ส่งข้อมูลบันทึก Apache ไปยัง syslog จากนั้นใช้ syslog เพื่อส่งไปยังไฟล์โลคัลหรือเซิร์ฟเวอร์บันทึกระยะไกล

# Send access logs to syslog
LogFormat "%v %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
CustomLog "|/usr/bin/logger -t httpd -i -p local7.notice" combined
# Send error logs to syslog
ErrorLog syslog:local7

จากนั้นใน /etc/syslog.conf

# Send all HTTP log data to this file
local7.*        /var/log/http-all.log

2

สิ่งที่ฉันทำคือเพิ่มบรรทัด CustomLog ที่สองในส่วน VirtualHost แต่ฉันต้องทำเช่นนี้สำหรับไฟล์ vhost conf ทุกไฟล์ มันใช้งานได้และอยู่ในเทมเพลตของฉันแล้วตอนนี้จึงมี vhosts ใหม่ ๆ เข้ามา

ตอนนี้ apache2 ของฉันบันทึกการเข้าชมสองที่แล้ว:

  1. ข้อมูลเฉพาะสำหรับ vhost ในไดเรกทอรีของ vhost นั้นและ
  2. ไป/var/log/apache2ในแฟ้มรวมสำหรับ vhosts ทั้งหมด

ฉันใช้ LogFormat ที่แตกต่างกับบันทึกทั้งสองนี้เพื่อรองรับตามลำดับแน่นอน /var/log/apache2บันทึกจะแยกกับ Perl และดูดเข้าไปในโครงสร้าง MySQL ปกติอย่างมากสำหรับการวิเคราะห์และการรายงาน Logrotate กวาดสัปดาห์ละครั้ง


1

ดีถ้าคุณเพียงต้องการที่จะเห็นการบันทึกสดในที่เดียวสำหรับโฮสต์เสมือนทั้งหมดที่คุณสามารถพิมพ์:

tail -f /var/www/*/access.log

ใช้กฎเดียวกันกับ cat ที่มี grep:

 cat /var/www/*/access.log | grep "something"

หรือถ้าบันทึกหมุนไฟล์ที่บีบอัดอยู่แล้ว:

gzip -d /var/www/*/access.log.2.gz

ตัวอย่างถูกทดสอบบน Debian / Ubuntu


0

ฉันไม่คิดว่ามันเป็นไปได้ อย่างน้อยเอกสารไม่ได้พูดถึงสิ่งนั้น

วิธีที่ดีที่สุดในการจำลองพฤติกรรมประเภทนี้คือการกำหนดแท็ก% v ในรูปแบบและเมื่อการหมุนบันทึกแยกสำเนาของไฟล์บันทึกเป็นไฟล์เฉพาะโฮสต์เสมือน


0

ฉันไม่ทราบว่าตำแหน่งไฟล์บันทึกของคุณเป็นไปตามรูปแบบใด ๆ ใน virtualhosts หรือไม่ แต่ถ้าเป็นเช่นนั้นฉันจะลืมให้ Apache สร้างไฟล์บันทึกที่ซ้ำกันและเพียงแค่สร้างไฟล์บันทึกเมื่อฉันต้องการ

cat /var/www/*/log/access.log > /var/www/logs/access.log

0

ฉันกำลังมองหาคำตอบสำหรับคำถามนี้เช่นกัน จนถึงตอนนี้ฉันมีสองวิธี:

  1. แมว joebert วิธีการแก้ปัญหาที่กล่าวถึง
  2. โซลูชันหางของฉันเอง: tail -f /var/log/httpd/*access_log

ฉันต้องการที่จะเห็นtail -fมุมมองในทุกกิจกรรมของเว็บเซิร์ฟเวอร์ในโฮสต์ ฉันจะค่อนข้างสามารถตัดเพียงไฟล์เดียว แต่เนื่องจากฉันไม่ชอบวิธีที่หางจัดการหลายไฟล์


รับ multitail มันมีประโยชน์ทีเดียว
จนถึง

0

คุณมี 2 ความเป็นไปได้ในการใช้ ErrorLog directive http://httpd.apache.org/docs/2.2/mod/core.html#errorlog

1) ใช้ syslog และจัดการการทำซ้ำใน [r] syslog.conf

2) ใช้ pipe ส่งรายการบันทึกไปยังแอปพลิเคชัน / สคริปต์และจัดการการทำซ้ำในแอปพลิเคชัน / สคริปต์


0

การดูบันทึกการเข้าถึงทั้งหมดจำเป็นหรือไม่ หากข้อผิดพลาดนั้นเกิดจากการร้องขอ vhost ควรมีบางสิ่งที่ถูกบันทึกไว้ในบันทึกข้อผิดพลาด vhost ในกรณีนั้น ls -t /var/www/*/log/error.log เพื่อตรวจสอบว่า vhost ตัวใดเป็นผู้ร้ายจากนั้นเฝ้าดูว่าไฟล์บันทึกการเข้าถึงดูเหมือนจะเป็นขั้นตอนแรกที่ดีในการกำจัดการอ่านบันทึกที่ไม่จำเป็นจำนวนมาก .

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.