มี nginx access_log และ error_log เข้าสู่ STDOUT และ STDERR ของกระบวนการหลัก


137

มีวิธีการบันทึกกระบวนการหลักเป็น STDOUT STDERR แทนไฟล์หรือไม่?

ดูเหมือนว่าคุณสามารถส่งไฟล์พา ธ ไปยังคำสั่ง access_log เท่านั้น:

access_log  /var/log/nginx/access.log

และเช่นเดียวกันสำหรับ error_log:

error_log /var/log/nginx/error.log

ฉันเข้าใจว่านี่อาจไม่ใช่คุณสมบัติของ nginx ฉันสนใจในโซลูชันที่กระชับซึ่งใช้ tail เป็นต้น เป็นที่ดีกว่าแม้ว่ามันจะมาจากกระบวนการหลักแม้ว่าฉันจะใช้ nginx อยู่เบื้องหน้าก็ตาม


14
ใช้ Nginx ภายในคอนเทนเนอร์ Docker หรือไม่ ชำระเงินคำตอบนี้
czerasz

คำตอบที่ยอมรับ (ของแพทริค) ใช้ได้กับอิมเมจ Nginx Docker อย่างเป็นทางการ (hub.docker.com/_/nginx)
Farshid T

คำตอบ:


199

แก้ไข:ดูเหมือนว่า Nginx ขณะนี้สนับสนุนerror_log stderr;ตามที่กล่าวไว้ในคำตอบของอานนท์

/dev/stdoutคุณสามารถส่งบันทึกไปยัง ในnginx.conf:

daemon off;
error_log /dev/stdout info;

http {
  access_log /dev/stdout;
  ...
}

แก้ไข: อาจต้องเรียกใช้ln -sf / proc / self / fd / dev /หากใช้งานคอนเทนเนอร์นักเทียบท่าบางอย่างจากนั้นใช้/dev/fd/1หรือ/dev/fd/2


2
เมื่อฉันพยายามทำสิ่งนี้ฉันได้รับข้อผิดพลาดต่อไปนี้: 2014/07/29 10:19:09 [Emerg] 13742 # 0: open () "/ dev / stdout" ล้มเหลว (13: ปฏิเสธการอนุญาต)
Jon Tirsen

1
จอนคุณอยู่ในระบบอะไร? ในระบบของฉัน / dev / stdout เป็น symlink ที่อ่านได้ทั่วโลกไปยัง / dev / fd / 1 ซึ่งผู้ใช้ของฉันเป็นเจ้าของและอ่าน + เขียนได้
Patrick

1
ฉันพบว่าสิ่งนี้ล้มเหลวENXIOเมื่อ stdout เปิดให้กับซ็อกเก็ตแทนที่จะเป็นไฟล์ มีตั๋วเคอร์เนลต้นน้ำที่ระบุว่านี่เป็นความตั้งใจและโดยเจตนา: bugzilla.kernel.org/show_bug.cgi?id=1360 - ดังนั้นแม้ว่าคำตอบนี้จะเพียงพอในบางกรณี แต่ก็ไม่ครอบคลุมช่วงที่เป็นไปได้ทั้งหมด ความล้มเหลว
Charles Duffy

1
หายไปสองสามชั่วโมงโดยไม่ประสบความสำเร็จใด ๆ พยายามเปลี่ยนทุกอย่าง (โหมด daemon ผู้ใช้เวอร์ชัน nginx เป็นต้น) มันไม่ได้ผลสำหรับฉัน "" "open ()" / dev / stderr "ล้มเหลว (6: ไม่มีอุปกรณ์หรือที่อยู่ดังกล่าว)" "" (ปัญหาเดียวกันกับ stdout แต่ nginx ควรส่งออกstderrตามเอกสาร)
Ivan Kleshnin

1
ภายในนักเทียบท่าคุณอาจได้รับอนุญาตถูกปฏิเสธหากกระบวนการของคุณไม่ทำงานเป็นรูทในคอนเทนเนอร์ มีการแก้ไขสำหรับสิ่งนี้ในเวอร์ชันถัดไป
Dobes Vandermeer

54

หากคำถามเกี่ยวข้องกับนักเทียบท่า ... อิมเมจนักเทียบท่า nginx อย่างเป็นทางการทำได้โดยการสร้างซอฟต์ลิงค์ไปทาง stdout / stderr

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

REF: https://microbadger.com/images/nginx


5
คำตอบนี้เป็นส่วนใหญ่ที่ถูกต้อง แต่เศร้าไม่ได้สำหรับอัลไพน์ภาพ (ดูgithub.com/nginxinc/docker-nginx/blob/master/stable/alpine/... ) เพียงสำหรับคนอื่น ๆ เช่นเจสซีจะใช้คำสั่งนี้ หากคุณเป็นผู้ใช้อัลไพน์เพียงแค่สร้าง Dockerfile ของคุณเองด้วย FROM nginx:alpine RUN ln -sf /dev/stdout /var/log/nginx/access.log \ && ln -sf /dev/stderr /var/log/nginx/error.log CMD ["nginx-debug", "-g", "daemon off;"]
jonashackt

1
คำตอบของ Patrick ใช้ได้กับภาพ nginx อย่างเป็นทางการ ( hub.docker.com/_/nginx ) ทั้ง debian (ล่าสุด) และฐานอัลไพน์
Farshid T

ลิงก์ REF ของคุณดูเหมือนจะตายแล้ว
peedee

@jonashackt ฉันใช้ภาพอัลไพน์และฉันพบว่ามันเข้าสู่ระบบ stdout ด้วย
Qiulang

คลิกที่เวอร์ชัน ( hub.docker.com/_/nginx ) เพื่อดูไฟล์นักเทียบท่าที่มีบรรทัดข้างต้น (ก่อนบรรทัด 100)
qräbnö

24
Syntax: error_log file | stderr | syslog:server=address[,parameter=value] | memory:size [debug | info | notice | warn | error | crit | alert | emerg];
Default:    
error_log logs/error.log error;
Context:    main, http, stream, server, location

http://nginx.org/en/docs/ngx_core_module.html#error_log

อย่าใช้: /dev/stderr สิ่งนี้จะทำลายการตั้งค่าของคุณหากคุณจะใช้ systemd-nspawn


5

เมื่อเรียกใช้ Nginx ในคอนเทนเนอร์ Docker โปรดทราบว่าไดรฟ์ข้อมูลที่ติดตั้งอยู่เหนือ dir บันทึกนั้นเอาชนะวัตถุประสงค์ในการสร้าง softlink ระหว่างไฟล์บันทึกและ stdout / stderr ใน Dockerfile ของคุณตามที่อธิบายไว้ในคำตอบของ @Boeboeคำตอบ

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


3

ในภาพนักเทียบท่าของ PHP-FPM ฉันเห็นแนวทางดังกล่าว:

# cat /usr/local/etc/php-fpm.d/docker.conf
[global]
error_log = /proc/self/fd/2

[www]
; if we send this to /proc/self/fd/1, it never appears
access.log = /proc/self/fd/2

1

เพื่อวัตถุประสงค์ในการดีบัก:

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout debug;"

สำหรับวัตถุประสงค์คลาสสิก

/usr/sbin/nginx -g "daemon off;error_log /dev/stdout info;"

จำเป็นต้อง

ภายใต้วงเล็บเซิร์ฟเวอร์บนไฟล์กำหนดค่า

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