หากคุณมีการแจกจ่าย Linux โดยไม่ได้ติดตั้ง daemon การบันทึก หรือเมื่อปิดใช้งาน logging daemon จะเกิดอะไรขึ้นกับบันทึกที่สร้างโดยloggerคำสั่ง

ฉันมี Ubuntu 20.04.2 พร้อมบริการ rsyslog เมื่อฉันปิดบริการนี้ ฉันยังคงใช้loggerคำสั่งได้ ไม่มีอะไรถูกเขียนไปยัง syslog แต่คำสั่งยังคงยอมรับอินพุตของฉันและมีรหัสออกเป็นศูนย์

เมื่อไม่มีบริการบันทึก จะเกิดอะไรขึ้นกับบันทึกที่สร้างโดยlogger?

วิธีที่สามารถloggerทำงานได้โดยไม่ต้องคำสั่งบางที่จะส่งบันทึกหรือไม่ เหตุใดจึงloggerออกได้สำเร็จหากไม่มีอะไรให้รับบันทึก

answer

'คนตัดไม้' /dev/logส่งข้อมูลไปยังซ็อกเก็ตยูนิกซ์ (มันเป็นซ็อกเก็ตแม้จะอยู่ใน /dev.)

สำหรับลีนุกซ์รุ่นส่วนใหญ่ ซ็อกเก็ตนี้ไม่ได้เป็นเจ้าของโดย syslog daemon แบบเดิมอีกต่อไป – อีกด้านของซ็อกเก็ตนี้ไม่ได้ไปที่ rsyslog โดยตรง แต่ซ็อกเก็ต /dev/log เป็นของบริการsystemd-journaldซึ่งยังคงทำงานและรับข้อความอยู่

# fuser -v /dev/log
                                 USER        PID ACCESS COMMAND
/run/systemd/journal/dev-log:    root          1 F.... systemd
                                 root        304 F.... systemd-journal

(โปรดทราบว่า init ยังเก็บซ็อกเก็ตไว้ด้วย - หาก journald หยุดทำงาน แต่มีกิจกรรมบางอย่างบนซ็อกเก็ต init จะเริ่มบริการโดยอัตโนมัติอีกครั้ง… เหมือนกับที่ 'inetd' ทำในอดีตสำหรับบริการ TCP)

Systemd-journald เก็บบันทึกใน /var/log/journal ซึ่งคุณสามารถอ่านได้โดยใช้journalctl -fแทน 'tail -f' ปกติ (อยู่ในรูปแบบไบนารีที่จัดทำดัชนี) โดยปกติ ข้อความผ่าน /dev/log จะยังคงเขียนต่อไปแม้ว่า rsyslogd จะหยุดทำงานก็ตาม

$ logger Hello

$ journalctl -n 1
Jul 12 18:12:26 ember root[951422]: Hello

ในระบบดังกล่าว แพ็คเกจ rsyslogd และ syslog-ng จะได้รับเฉพาะข้อความที่ส่งต่อจาก systemd-journald ไม่ใช่โดยตรงจากโปรแกรม พวกเขาทำงานโดยการฟังจากซ็อกเก็ตอื่น (ภายใน /run/systemd) ซึ่ง journald ส่งต่อข้อความทั้งหมด หรือโดยการอ่านไฟล์บันทึกไบนารีโดยตรงจาก /var/log/journal

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

หากคุณชี้ 'คนตัดไม้' ไปที่ซ็อกเก็ต Unix ซึ่งไม่ยอมรับข้อความ อันที่จริงแล้วจะแสดงข้อความแสดงข้อผิดพลาดตามที่ควรจะเป็น:

$ python -c "from socket import *; socket(AF_UNIX, SOCK_DGRAM).bind('/tmp/log')"

$ logger -u /tmp/log Hello
logger: socket /tmp/log: Connection refused