Apache in Docker: ฉันจะ“ access.log” ได้อย่างไร?


17

ฉันเพิ่งเริ่มต้นใช้งานนักเทียบท่าและรวยตอนนี้ฉันกำลังพยายามหาวิธีตั้งค่าสภาพแวดล้อม Apache 2 / PHP ชุดแรกของฉัน ถึงตอนนี้ฉันใช้ Linux VM แบบเต็มโดยที่ฉันใช้ล็อกไฟล์ที่เขียนไปยัง / var / log / apache2 จากนั้นใช้ "logrotate" เพื่อกระโดดไปยังไฟล์ใหม่ในแต่ละวัน

Logfiles ส่วนใหญ่จะใช้สำหรับการตรวจจับข้อผิดพลาดทันที (เช่นเข้าสู่เซิร์ฟเวอร์และใช้น้อยกว่าเพื่อเปิดไฟล์ access.log และ error.log ปัจจุบัน) และสำหรับ fail2ban

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

ดังนั้น: วิธีใดที่ใช้กันมากที่สุดในการทำงานกับ / จำลอง / แทนที่ access.log / error.log ในสถานการณ์นั้น อะไรคือโซลูชันทั่วไปสำหรับทั้งสภาพแวดล้อมการผลิตและการพัฒนา

ความคิดของฉันรวมถึงการใช้การแบ่งปัน NFS (ช้าและอาจทำให้เกิดการชนกันของชื่อไฟล์ถ้าไม่ระวัง) และlogstash (ไม่แน่ใจว่าคุ้มค่ากับความพยายามและสามารถใช้งานได้สำหรับไซต์ขนาดเล็กหรือแม้แต่สภาพแวดล้อม dev)? เกิดขึ้นกับการแก้ปัญหาที่ดีกว่า?

ไม่แน่ใจว่ามันทำให้ความแตกต่าง แต่ขณะนี้ฉัน basing ภาพหางของฉันในPHP: 5.6 Apache

คำตอบ:


13

คุณยังสามารถใช้docker exec -it <your container name> /bin/bashคำสั่งเพื่อเข้าสู่คอนเทนเนอร์ของคุณและทำงานปกติของคุณ หรือบางทีคุณสามารถเปลี่ยน/bin/bashเป็นคำสั่งหรือสคริปต์.shของคำสั่งของคุณเพื่อดำเนินการได้

เพื่อให้ไฟล์ของคุณใช้งานไม่ได้ docker cp <container name:/path/to/file> </your local machine/path/>

และสำหรับงานประจำวันของคุณคุณสามารถใช้cronเพื่อ cronjob คำสั่งเหล่านั้น ฉันขอแนะนำให้คุณใช้ชื่อแทนคำสั่ง docker บ่อยๆ เพื่อให้ฉันสามารถใช้นักเทียบท่าอย่างมีความสุขด้วยปุ่มไม่กี่

docker logs <container name/id>คำสั่งสำหรับการดูบันทึกจากการดำเนินการของภาพนักเทียบท่า มันแสดงเอาท์พุทเปลี่ยนเส้นทางไปยัง stdout


นอกจากนี้docker attach <container name>เป็นวิธีที่ดีในการดู stdout จากคอนเทนเนอร์ของคุณ แต่โปรดระวังว่าถ้าคุณทำ ctrl + d หรือ ctrl + c มันจะยกเลิก (sigkill) งานต่อเนื่องของคุณ ctrl+p+qดังนั้นคุณต้องถอดออกได้อย่างถูกต้องโดยใช้ปุ่มหลบหนี หากคุณต้องการเชลล์ลงในคอนเทนเนอร์ของคุณฉันชอบใช้execคำสั่งด้านบน
Fony Lew

6

วิธีการเกี่ยวกับการเขียนการเข้าถึงและบันทึกข้อผิดพลาดไปยัง stderr และ stdout?

https://mail-archives.apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

https://gist.github.com/afolarin/a2ac14231d9079920864

RUN ln -sf / dev / stdout /var/log/nginx/access.log

RUN ln -sf / dev / stderr /var/log/nginx/error.log

การบันทึกแบบรวมศูนย์ด้วยELKจะช่วยให้สามารถตรวจสอบเชิงรุกได้มากขึ้น แต่คุณคิดถึงสิ่งนั้นอยู่แล้ว


1

จนถึงตอนนี้ฉันได้พบ " บันทึกนักเทียบท่า " ที่ถูกกล่าวถึงหลายครั้ง

ฉันเป็นนักเทียบท่ามือใหม่แน่นอนที่อาจแก้ไขปัญหาของฉัน - แต่จนถึงตอนนี้ฉันยังไม่เข้าใจแนวคิดเบื้องหลังคำสั่งนั้นอย่างเต็มที่

นักเทียบท่าดูเหมือนจะเก็บเอาต์พุต stdout ทั้งหมดในไฟล์ JSONใน / var / lib / docker / container / และให้โอกาสฉันในการ acess ผ่านคำสั่งบันทึก

จนถึงตอนนี้ฉันไม่แน่ใจว่าจะใช้เอาต์พุตจริงได้อย่างไร


1

บางทีคุณลักษณะนี้อาจไม่มีอยู่เมื่อถามคำถาม แต่ด้วยอาร์กิวเมนต์ -v ของ run คุณสามารถเมานต์ไดเรกทอรีบนโฮสต์ไปยังไดเรกทอรีในคอนเทนเนอร์

docker run -v [host_dir]:[container_dir]

วิธีนี้ไฟล์บันทึก (หรืออื่น ๆ ) จะอยู่รอดเมื่อคอนเทนเนอร์ถูกลบและคุณสามารถเข้าถึงไฟล์ได้ราวกับว่ามีการติดตั้ง apache บนโฮสต์มากกว่าในคอนเทนเนอร์

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


1
นักเทียบท่ามีปริมาณเมานท์เชื่อมโยงสามปีที่ผ่านมา
womble

0
root@my_docker:~ # ls -l /var/log/apache2/
total 0
lrwxrwxrwx 1 root root 11 Jul 17 04:55 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Jul 17 04:55 error.log -> /dev/stderr
lrwxrwxrwx 1 root root 11 Jul 17 04:55 other_vhosts_access.log -> /dev/stdout
root@my_docker:~ #

ภาพนักเทียบท่าที่ฉันเลือกเพียงแค่เชื่อมโยงไฟล์ * .log ทั้งหมดกับ / dev / stdout และ / dev / stderr ดังนั้นฉันจึงไม่สามารถอ่านได้

หลังจากลบไฟล์และเริ่ม apache ใหม่ฉันสามารถรับบันทึกจาก / var / log / ใน docker

docker-compose exec apache bash -c "tail -f /var/log/apache2/*.log"

0

ในไฟล์การกำหนดค่า apache คุณสามารถเพิ่ม:
CustomLog / dev / stdout
ErrorLog / dev / stderr

และเพื่อดูบันทึกใช้คำสั่งด้านล่าง:
docker log container_id

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