วิธีการส่งออกตัวแปรในบันทึก nginx สำหรับการแก้จุดบกพร่อง


83

ฉันกำลังทดสอบ nginx และต้องการส่งออกตัวแปรไปยังไฟล์บันทึก ฉันจะทำเช่นนั้นได้อย่างไรและไฟล์บันทึกใดที่จะใช้งาน

คำตอบ:


143

คุณสามารถส่งค่าตัวแปร nginx ผ่านทางส่วนหัว มีประโยชน์สำหรับการพัฒนา

add_header X-uri "$uri";

และคุณจะเห็นในส่วนหัวการตอบสนองของเบราว์เซอร์:

X-uri:/index.php

บางครั้งฉันทำสิ่งนี้ในระหว่างการพัฒนาท้องถิ่น

นอกจากนี้ยังมีประโยชน์ในการบอกคุณว่ามีการเรียกใช้ส่วนย่อยหรือไม่ เพียงแค่โรยข้างในข้อของคุณเพื่อดูว่าพวกเขากำลังใช้

location ~* ^.+.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt)$ {
    add_header X-debug-message "A static file was served" always;
    ...
}

location ~ \.php$ {
    add_header X-debug-message "A php file was used" always;
    ...
}

ดังนั้นการไปที่ URL เช่นhttp://www.example.com/index.phpจะเรียกส่วนหัวหลังในขณะที่ไปที่http://www.example.com/img/my-ducky.pngจะเรียกส่วนหัวเดิม


29
โปรดทราบว่าadd_headerจะทำงานเกี่ยวกับคำขอที่ประสบความสำเร็จเท่านั้น เอกสารระบุว่าสามารถใช้ได้กับการตอบกลับที่มีรหัส 200, 204, 301, 302 หรือ 304 เท่านั้นดังนั้นจึงไม่สามารถใช้เพื่อแก้ไขข้อผิดพลาด HTTP ได้
จอห์น WH สมิ ธ

31
@JohnWHSmith: ตามที่ระบุไว้ใน marat ในคำตอบนี้ ในฐานะของรุ่น 1.7.5 , Nginx เพิ่ม"always" พารามิเตอร์เพื่อadd_headerที่จะกลับหัวไม่ว่าสิ่งที่รหัสการตอบสนอง ตัวอย่างเช่นadd_header X-debug-message "A php file was used" always;ควรทำงานได้แม้กับรหัสข้อผิดพลาด 500 รายการ
yuvilio

6
นี่ไม่ได้ตอบคำถามเลย คนที่แต่งตัวประหลาดต้องการเข้าสู่ระบบเพื่อล็อกไฟล์ไม่ให้ลูกค้า
Avamander

37

คุณสามารถส่งคืนสตริงอย่างง่าย ๆ เป็นการตอบสนอง HTTP:

location /
{
    return 200 $document_root;
}

1
ถ้าคุณต้องการคืนค่าตัวแปรสองตัว
BringBackCommodore64

ไปที่สถานที่ทันทีเปิดกล่องโต้ตอบบันทึกเป็นของเบราว์เซอร์ของฉัน (ทดสอบบน Opera, Chromium) ไม่มีการตอบสนองใด ๆ
BringBackCommodore64

@ BringBackCommodore64 การเพิ่มข้อความ / html ส่วนหัวของประเภทเนื้อหาอาจช่วยได้
bitwise

ใช้บุรุษไปรษณีย์สิ่งนี้ใช้ได้โดยไม่มีส่วนหัวเพิ่มเติม ขอบคุณ!
aexl

19

คุณสามารถตั้งค่ารูปแบบบันทึกการเข้าถึงที่กำหนดเองโดยใช้log_formatคำสั่งที่บันทึกตัวแปรที่คุณสนใจ


2
ขอบคุณและฉันเดาว่าไม่มีวิธีที่ง่ายกว่าในการส่งออกตัวแปรหนึ่งตัว
lulalala

@ lulalala ไม่ใช่ที่ฉันรู้
mgorven

เป็นไปได้ที่จะตั้งค่าระดับการบันทึกในคำสั่งerror_logเพื่อdebugให้คุณสามารถเห็นค่าของตัวแปรและบล็อกที่เรียกใช้งาน ตัวอย่างerror_log file.log debug
Victor Aguilar

1
สังเกตุว่าตัวแปรที่ว่างเปล่าจะถูกแสดงเช่นเดียวกับ-ในบันทึก แต่มันว่างเปล่าในรหัส nginx คุณไม่ควรตรวจสอบ-ตลอดเวลา บางครั้งสิ่งนี้ทำให้ผู้ใช้สับสน
higuita

6

อีกตัวเลือกหนึ่งคือการรวมโมดูล echoเมื่อคุณสร้าง nginx หรือติดตั้งOpenRestyซึ่งเป็น nginx ที่มาพร้อมกับส่วนขยายจำนวนมาก (เช่น echo)

จากนั้นคุณสามารถโรยการกำหนดค่าของคุณด้วยคำสั่งเช่น:

echo "args: $args"

2
เมื่อฉันลองสิ่งนี้มันจะสะท้อนออกไปเป็นไฟล์ข้อความธรรมดาบนเซิร์ฟเวอร์ที่ขัดจังหวะการส่งออกของหน้าจริง
JaredMcAteer

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