แก้ไข 2016-06-02
หากคุณกำลังพยายามที่จะหา "ข้อความเข้าสู่ระบบพุ่งพรวด" /var/log/upstart/
โดยทั่วไปการตรวจสอบ นั่นคือสิ่งที่ Upstart บันทึกstdout
และstderr
จากบริการพุ่งพรวด ขอบคุณคำตอบของ leopd สำหรับการชี้เรื่องนี้
หากคุณกำลังมองหาข้อความบันทึกจากการพุ่งพรวดตัวเองที่กำหนดค่าinitctl log-priority
และปล่อยโดยinitctl emit
อ่าน!
เวอร์ชั่นสั้น
รายการบันทึกควรแสดงเป็น dmesg แม้จะมีที่พวกเขาไม่ได้/var/log
แสดงขึ้นโดยเริ่มต้นใน
หากคุณต้องการสิ่งเหล่านี้/var/log
ด้วยให้เพิ่ม$KLogPermitNonKernelFacility on
การกำหนดค่าของ rsyslogd ฉันแนะนำให้สร้างไฟล์ที่กำหนดเอง/etc/rsyslog.d/60-custom.conf
เพื่อหลีกเลี่ยงการแก้ไข/etc/rsyslog.conf
เนื่องจากจัดการโดย dpkg ตอนนี้ข้อความพุ่งพรวดควรจะแสดงขึ้นมาใน/var/log/syslog
เมื่อคุณตั้งพุ่งพรวดของlog-priority
ไปinfo
หรือเพื่อให้
รุ่นยาว
นี้เอาฉันวันที่จะติดตามลง แต่เห็นได้ชัดว่าพุ่งพรวด (1.5) จะไม่ได้เข้าสู่ระบบเพื่อ syslog, ที่อยู่, syslog()
มันไม่ได้เรียกใช้ฟังก์ชัน แต่พุ่งพรวดเข้าสู่ระบบในบัฟเฟอร์แหวนเคอร์เนลซึ่งเป็นสิ่งที่ dmesg อ่าน ตอนนี้ฉันไม่คิดว่ามันเป็นไปได้ที่กระบวนการพื้นที่ผู้ใช้จะเขียนลงในบัฟเฟอร์นั้น แต่เห็นได้ชัดว่าพวกเขาสามารถเขียนได้/dev/kmsg
และนั่นคือสิ่งที่ Upstart ทำ นั่นคือส่วนแรกของปริศนา
ส่วนที่สองคือมีความเชื่ออย่างกว้างขวางว่าข้อความที่เขียนไปยังบัฟเฟอร์วงแหวนเคอร์เนลจะถูกคัดลอกโดยอัตโนมัติไปยัง syslog โดยเคอร์เนล (อย่างน้อยนั่นคือสิ่งที่ฉันคิดเสมอ) ปรากฎว่าสิ่งนี้เกิดขึ้นจริงโดย daemon พื้นที่ผู้ใช้ตามธรรมเนียม klogd ซึ่งทำงานควบคู่กับ syslogd เห็นได้ชัดว่า rsyslogd จะแทนที่ syslogd แต่เห็นได้ชัดว่ามันจะแทนที่ klogd เช่นกัน (เรียงลำดับจาก: ดูโน้ตที่ส่วนท้าย)
ส่วนที่สามคือข้อความที่เขียนไปยังบัฟเฟอร์วงแหวนเคอร์เนลจากพื้นที่ผู้ใช้จริง ๆ แล้วดูแตกต่างจากข้อความที่เขียนจากพื้นที่เคอร์เนล: พวกเขามีสิ่งอำนวยความสะดวกที่แตกต่างกัน dmesg มีตัวเลือกไม่กี่ตัวที่โต้ตอบกับสิ่งนี้: -x
จะแสดงสิ่งอำนวยความสะดวก (และลำดับความสำคัญ) ในขณะที่-u
และ-k
บอกให้ dmesg แสดงเฉพาะข้อความส่วนอำนวยความสะดวกของผู้ใช้และข้อความส่วนอำนวยความสะดวกเคอร์เนลตามลำดับ
ตอนนี้นี่คือ clincher: โดยค่าเริ่มต้น rsyslogd จะละเว้นข้อความด้วยสิ่งอำนวยความสะดวกที่ไม่ใช่เคอร์เนลเมื่อมันอ่านข้อความจากบัฟเฟอร์วงแหวนเคอร์เนล ตัวเลือกการกำหนดค่าที่เกี่ยวข้องคือ$KLogPermitNonKernelFacility
ซึ่งจะปิดโดยค่าเริ่มต้นและจำเป็นต้องเปิดถ้าคุณต้องการ rsyslogd เพื่อประมวลผลข้อความเหล่านี้ โปรดทราบว่าการกำหนดค่าส่วนที่เหลือของ rsyslogd จะปฏิบัติต่อข้อความทั้งหมดจากบัฟเฟอร์วงแหวนเคอร์เนลว่ามีkern
สิ่งอำนวยความสะดวกโดยไม่คำนึงถึงสิ่งอำนวยความสะดวกที่มีในบัฟเฟอร์วงแหวนเคอร์เนล
ข้อมูลมากกว่านี้
syslog
รหัสสามารถเขียน syslog โดยการเรียกฟังก์ชั่น glibc ที่อธิบายไว้ในsyslog()
เห็นได้ชัดว่าฟังก์ชั่นเหล่านี้เขียนถึงman 3 syslog
/dev/log
รหัสสามารถอ่านได้จาก syslog โดยการอ่าน/dev/log
และนี่คือสิ่งที่syslogd
และสิ่งทดแทนจะทำ rsyslogd
อ่าน/dev/log
โดยใช้imuxsock
โมดูลอินพุต
บัฟเฟอร์วงแหวนเคอร์เนล
พื้นที่เคอร์เนลเขียนไปยังบัฟเฟอร์นี้โดยการเรียกใช้ฟังก์ชันเคอร์เนลprintk()
ดังนั้นบางครั้งจึงเรียกว่าบัฟเฟอร์การพิมพ์ /dev/kmsg
พื้นที่ของผู้ใช้สามารถเขียนไปโดยการเขียน พื้นที่ผู้ใช้สามารถอ่านจากบัฟเฟอร์นี้ได้หลายวิธี: สามารถอ่านได้/proc/kmsg
(สิ่งที่ dmesg ทำตามค่าเริ่มต้น) หรือสามารถอ่านได้จาก/dev/kmsg
หรือเรียกใช้การเรียกของระบบsyslog()
ซึ่งอธิบายไว้ในman 2 syslog
และแตกต่างอย่างสิ้นเชิงจากฟังก์ชัน glibc ที่syslog()
อธิบายไว้ ในman 3 syslog
. glibc จัดเตรียม wrapper ให้กับการเรียกของระบบที่เรียกsyslog()
ว่าklogctl()
เพื่อช่วยบรรเทาความสับสนนี้
ตามปกติแล้วklogd
อ่านจากหนึ่งในอินเตอร์เฟสเหล่านี้จากนั้นเรียกใช้ฟังก์ชัน glibc syslog()
เพื่อคัดลอกไปยัง syslog rsyslogd อ่านหนึ่งในอินเทอร์เฟซเหล่านี้ผ่านทางimklog
อินพุตโมดูล แต่ AFAIK ไม่รบกวนการเรียก glibc syslog()
ซึ่งเป็นสาเหตุที่ไม่เหมือนกับ klogd มันประมวลผลเอาท์พุทimklog
แบบเดียวกับที่มันประมวลผลเอาท์พุทจากโมดูลอินพุตอื่น ๆ มีข้อแม้เพิ่มเติมที่imklog
เอาต์พุตทั้งหมดมีkern
สิ่งอำนวยความสะดวกโดยไม่คำนึงถึงข้อความเครื่องมืออำนวยความสะดวกที่มีในบัฟเฟอร์วงแหวนเคอร์เนล
อ้างอิง
dmesg
แต่มันก็ไม่สมเหตุสมผลหากไม่มีบริบทที่ระบุไว้ที่นี่