กำลังเขียนบันทึก Apache2 ไปยัง stdout / stderr?


29

ฉันใช้ Apache2 ในคอนเทนเนอร์ docker และต้องการเขียนอะไรลงดิสก์เขียนบันทึกไปยัง stdout และ stderr ฉันได้เห็นวิธีต่าง ๆ ในการทำเช่นนี้ ( Supervisord และ stdout / stderr , Apache access to stdout ) แต่สิ่งเหล่านี้ดูเหมือนจะเป็นแฮ็ก ไม่มีวิธีการทำเช่นนี้โดยค่าเริ่มต้น?

เพื่อความชัดเจนฉันไม่ต้องการตัดบันทึกเนื่องจากจะทำให้สิ่งต่าง ๆ ถูกเขียนไปยังดิสก์ในคอนเทนเนอร์


คุณไม่ต้องการให้บันทึกเหล่านั้นสามารถเข้าถึงได้ง่ายสำหรับการแก้ไขปัญหา / แก้ไขจุดบกพร่องหรือไม่ ทำไมไม่เพียงแค่เขียนมันไปยังเซิร์ฟเวอร์ (s) syslog แทน?
HTTP500

@ HTTP500 - ถูกจับที่ด้านนอกของคอนเทนเนอร์นักเทียบท่า
Matt

หากคุณใช้: จาก php: 5.6-apache, ซึ่งมีบันทึกไปยัง stdout และ stderr แล้ว
Martlark

คำตอบ:


30
  ErrorLog /dev/stderr
  TransferLog /dev/stdout

ทำงานบน Ubuntu และ CentOS สำหรับฉัน


ไฟล์ไหนที่ควรเข้าไป ฯลฯ กรุณา
Alexander Mills

นี้ไปในตัวคุณdomain.confยื่นหรือถ้าคุณไม่ได้ใช้.htaccess conf
Tyler Christian

25

วิธีการเกี่ยวกับการวางสิ่งนี้ลงใน Dockerfile หลังจากติดตั้งแพ็คเกจ apache2 แล้วหรือยัง?

RUN ln -sf /proc/self/fd/1 /var/log/apache2/access.log && \
    ln -sf /proc/self/fd/1 /var/log/apache2/error.log

สมมติว่านี่เป็นเส้นทางของบันทึก มันใช้สำหรับ Ubuntu 14.04 และใช้ได้กับ Ubuntu 16.04

หมายเหตุ: หากคุณมั่นใจว่ามีการเชื่อมโยงสัญลักษณ์/dev/stdoutหรือ/proc/stderrมีอยู่คุณอาจใช้ลิงก์เหล่านั้นได้ ฉันชอบพา ธ ไปยังไฟล์จริงเนื่องจากรับประกันว่ามีอยู่


ใช้งานได้ดีกับ Ubuntu 16.04 :)
OkieOth

1
ห่านั่นเป็นแฮ็คที่แยบยล! Apache พยายามเปิดไฟล์ปกติ แต่ถูกเปลี่ยนเส้นทางผ่าน symlink ไปยัง stdout ของตัวเองจากมุมมองของตัวเอง
joonas.fi

1
แค่อยากจะบอกว่าขอบคุณ ... apache httpd 2.4 docker container อย่างเป็นทางการไม่สามารถเขียนบันทึกหลังจากเปิดใช้ ssl การเพิ่มบรรทัดเหล่านี้ + ssl_request_log ไปยัง Dockerfile ที่ดึงมาจาก httpd2.4 ทำงาน
j.con

3
คุณสามารถย่อ / proc / self / fd / 1 เป็น / dev / stdout พวกมันเหมือนกันหมด
ชัคอดัมส์

@ChuckAdams - มันเป็นลิงค์ที่นุ่มนวลและโดยทั่วไปจะมี แต่ไม่มีการรับประกันเมื่อสร้างภาพที่มีอยู่ โดยเฉพาะอย่างยิ่งลดภาพไมโคร ในขณะที่เคอร์เนลจะทำการส่งออก / proc / self / fd / 1 & 2 เสมอ
แมตต์

1

ไม่ใช่คำตอบที่ถามมาโดยเฉพาะ แต่อาจเป็นวิธีที่ดีกว่าขึ้นอยู่กับสถานการณ์ของคุณคือการไม่เข้าสู่ระบบไปยัง stdout / stderr เลย เพียงไพพ์ล็อกเพื่อ cat ในรูปแบบ JSON สิ่งนี้จะลบความจำเป็นในการแยกความแตกต่างของกระแสข้อมูลเนื่องจาก json อาจมีข้อมูลที่จำเป็นในการแยกแยะความแตกต่าง เช่นบางสิ่งบางอย่างตามสายของต่อไปนี้ สิ่งนี้สามารถถูกกลืนเข้าไปในสิ่งที่คล้ายกับ graylog

GlobalLog "| cat - " gelf
ErrorLog "| cat - " 

LogFormat "{ \"apache_log\": \"ACCESS\", \"app_name\": \"apache\",  \"Connection\": \"%{X-Forwarded-Proto}i:%{X-Forwarded-Port}i \", \"X-Forwarded-For\": \"%{X-Forwarded-For}i\",  \"version\": \"1.1\", \"vhost\": \"%V\", \"short_message\": \"%r\", \"timestamp\": %{%s}t, \"level\": 6, \"user_agent\": \"%{User-Agent}i\", \"source_ip\": \"%a\", \"duration_usec\": %D, \"duration_sec\": %T, \"request_size_byte\": %O, \"http_status\": %s, \"http_request_path\": \"%U\", \"http_request\": \"%U%q\", \"http_method\": \"%m\", \"http_referer\": \"%{Referer}i\", \"X-Powered-By\": \"%{X-Powered-By}i\" }" gelf

ErrorLogFormat "{ \"app_name\": \"apache\",  \"apache_log\": \"ERROR\", \"time\":\"%{%Y-%m-%d}tT%{%T}t.%{msec_frac}tZ\", \"function\" : \"[%-m:%l]\" , \"process\" : \" [pid %P:tid %T] \" , \"message\" : \"%M\" ,\ \"referer\"\ : \" %{Referer}i \" }"

นอกจากนี้ยังมีโมดูลการบันทึก gelf ดังนั้นคุณสามารถสตรีมโดยตรงจาก apache ไปยังเซิร์ฟเวอร์ประเภท graylog เช่นกันหากคุณต้องการ

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