คำตอบอื่น ๆ อธิบายตามที่ผู้เขียนกล่าวว่า "การบันทึกแบบคลาสสิค" ใน Linux นั่นไม่ใช่ว่าสิ่งต่าง ๆ จะทำงานในระบบจำนวนมากในทุกวันนี้
เคอร์เนล
กลไกเคอร์เนลเปลี่ยนไป
เคอร์เนลสร้างเอาต์พุตไปยังบัฟเฟอร์ในหน่วยความจำ แอปพลิเคชันซอฟต์แวร์สามารถเข้าถึงได้สองวิธี ระบบย่อยเข้าสู่ระบบมักจะเข้าถึงมันเป็นหลอก FIFO /proc/kmsg
ชื่อ แหล่งข้อมูลบันทึกนี้ไม่สามารถใช้ร่วมกันระหว่างเครื่องอ่านบันทึกได้เนื่องจากเป็นแบบอ่านครั้งเดียว หากกระบวนการจำนวนมากใช้ร่วมกันกระบวนการเหล่านั้นจะได้รับเพียงส่วนหนึ่งของสตรีมข้อมูลบันทึกเคอร์เนล มันเป็นแบบอ่านอย่างเดียว
อีกวิธีในการเข้าถึงเป็น/dev/kmsg
อุปกรณ์ตัวละครที่ใหม่กว่า นี่คืออินเตอร์เฟสการอ่าน - เขียนที่สามารถแบ่งใช้ระหว่างกระบวนการไคลเอ็นต์จำนวนมาก หากมีหลายกระบวนการที่ใช้ร่วมกันพวกเขาทั้งหมดอ่านสตรีมข้อมูลที่สมบูรณ์แบบเดียวกันโดยไม่ได้รับผลกระทบจากกันและกัน หากพวกเขาเปิดเพื่อเข้าถึงการเขียนพวกเขายังสามารถฉีดข้อความลงในสตรีมบันทึกของเคอร์เนลราวกับว่าพวกเขาถูกสร้างขึ้นโดยเคอร์เนล
/proc/kmsg
และ/dev/kmsg
จัดเตรียมข้อมูลบันทึกในรูปแบบที่ไม่ใช่ RFC-5424
การประยุกต์ใช้งาน
แอปพลิเคชันมีการเปลี่ยนแปลง
syslog()
ฟังก์ชั่นของไลบรารี GNU C ในความพยายามหลักในการเชื่อมต่อกับAF_LOCAL
ซ็อกเก็ตดาตาแกรมที่มีชื่อ/dev/log
และเขียนรายการบันทึกไว้ ( syslog()
ฟังก์ชั่นไลบรารี BSD C ปัจจุบันใช้/var/run/log
เป็นชื่อซ็อกเก็ตและลอง/var/run/logpriv
ก่อน) แอปพลิเคชันสามารถมีรหัสของตัวเองเพื่อทำสิ่งนี้โดยตรง ฟังก์ชั่นห้องสมุดเป็นเพียงรหัส (เพื่อเปิดเชื่อมต่อเขียนและปิดซ็อกเก็ต) ดำเนินการในบริบทกระบวนการของแอปพลิเคชันหลังจากทั้งหมด
แอปพลิเคชันยังสามารถส่งข้อความ RFC 5424 ผ่านทาง UDP ไปยังเซิร์ฟเวอร์ RFC 5426 ในพื้นที่หากมีใครกำลังฟังบนซ็อกเก็ตAF_INET
/ AF_INET6
เดตาแกรมบนเครื่อง
ต้องขอบคุณแรงกดดันจากโลก daemontools ในช่วงสองทศวรรษที่ผ่านมาdæmonsจำนวนมากรองรับการทำงานในโหมดที่พวกเขาไม่ได้ใช้syslog()
ฟังก์ชั่นไลบรารีGNU C หรือซ็อกเก็ต UDP แต่เพียงคายบันทึกข้อมูลออกไปยังข้อผิดพลาดมาตรฐานใน แฟชั่นยูนิกซ์สามัญ
การจัดการบันทึกด้วย nosh และครอบครัว daemontools โดยทั่วไป
ด้วยชุดเครื่องมือ daemontools ตระกูลมีความยืดหยุ่นในการบันทึก แต่โดยทั่วไปทั่วทั้งครอบครัวความคิดคือdæmon "main" แต่ละอันมีdæmonที่เกี่ยวข้องกับ "การบันทึก" "main" dæmonsทำงานเหมือนกับกระบวนการที่ไม่ใช่dæmonและเขียนข้อความบันทึกลงในข้อผิดพลาดมาตรฐาน (หรือเอาต์พุตมาตรฐาน) ซึ่งระบบย่อยการจัดการบริการจัดให้มีการเชื่อมต่อผ่านไพพ์ (ซึ่งเปิดค้างไว้เพื่อให้ข้อมูลบันทึกไม่สูญหาย บริการเริ่มต้นใหม่) ไปที่อินพุตมาตรฐานของ "การบันทึก" dæmon
ทั้งหมดของ "เข้าสู่ระบบ" dæmonsเรียกใช้โปรแกรมที่ล็อกอยู่ที่ไหนสักแห่ง โดยทั่วไปโปรแกรมนี้คล้ายmultilog
หรือcyclog
อ่านจากอินพุตมาตรฐานและไฟล์บันทึกการเขียน (nanosecond timestamped) ในไดเร็กตอรี่ที่มีการ จำกัด ขนาด, หมุนโดยอัตโนมัติ, เอกสิทธิ์เฉพาะการเขียน, โดยทั่วไปแล้วสิ่งเหล่านี้ทั้งหมดทำงานภายใต้การอุปถัมภ์ของบัญชีผู้ใช้ที่ไม่มีสิทธิพิเศษแต่ละบัญชี
ดังนั้นหนึ่งจบลงด้วยระบบการบันทึกการกระจายส่วนใหญ่ที่มีข้อมูลบันทึกการให้บริการของแต่ละการประมวลผลแยกต่างหาก
หนึ่งสามารถเรียกใช้สิ่งที่ต้องการklogd
หรือsyslogd
หรือrsyslogd
ภายใต้การจัดการบริการ daemontools ครอบครัว แต่โลก daemontools ตระหนักเมื่อหลายปีก่อนว่าโครงสร้างการจัดการบริการด้วย "การบันทึก" dæmonsยืมตัวเองค่อนข้างเรียบร้อยเพื่อทำสิ่งต่าง ๆ ในแบบที่เรียบง่าย ไม่จำเป็นต้องทำให้แฟนสตรีมของบันทึกทั้งหมดเป็นหนึ่งใน mish-mash ที่แยกวิเคราะห์ข้อมูลบันทึกจากนั้นให้แฟนสตรีมกลับไปที่ไฟล์บันทึกแยกต่างหาก จากนั้น (ในบางกรณี) ใส่กลไกการหมุนบันทึกภายนอกที่ไม่น่าเชื่อถือที่ด้านข้าง โครงสร้าง daemontools-family เป็นส่วนหนึ่งของการจัดการบันทึกมาตรฐานของมันทำการหมุนบันทึกการเขียน logfile และการแยกกระแส
ยิ่งกว่านั้น: โมเดลการโหลดเชนของสิทธิ์การดร็อปด้วยเครื่องมือทั่วไปในบริการทั้งหมดหมายความว่าโปรแกรมการบันทึกไม่จำเป็นต้องมีสิทธิ์ผู้ใช้ขั้นสูง และโมเดล UCSPI นั้นหมายความว่าพวกเขาต้องการเพียงแค่ดูแลความแตกต่างเช่นการส่งกระแสข้อมูลกับดาต้าแกรม
ชุดเครื่องมือ nosh เป็นตัวอย่างนี้ ในขณะที่หนึ่งสามารถทำงานrsyslogd
ภายใต้มันออกมาจากกล่องและเพียงแค่จัดการเคอร์เนล/run/log
และ UDP เข้าสู่ระบบในทางเก่า; มันยังให้มากขึ้น "daemontools พื้นเมือง" วิธีการในการเข้าสู่ระบบสิ่งเหล่านี้:
klogd
บริการที่อ่านจาก/proc/kmsg
และก็เขียนว่ากระแสบันทึกข้อผิดพลาดมาตรฐานของมัน klog-read
นี้จะกระทำโดยโปรแกรมที่ง่ายชื่อ การบันทึกที่เกี่ยวข้องจะฟีดสตรีมการบันทึกบนอินพุตมาตรฐานลงใน/var/log/sv/klogd
ไดเรกทอรีบันทึก
local-syslog-read
บริการที่อ่านจากดาต้าแกรม/dev/log
( /run/log
บน BSDs) และก็เขียนว่ากระแสบันทึกข้อผิดพลาดมาตรฐานของมัน syslog-read
นี้จะกระทำโดยโปรแกรมชื่อ การบันทึกที่เกี่ยวข้องจะฟีดสตรีมการบันทึกบนอินพุตมาตรฐานลงใน/var/log/sv/local-syslog-read
ไดเรกทอรีบันทึก
udp-syslog-read
บริการที่ฟังบนพอร์ต UDP syslog อ่านสิ่งที่มันจะถูกส่งไปมันและก็เขียนว่ากระแสบันทึกข้อผิดพลาดมาตรฐานของมัน syslog-read
อีกครั้งโปรแกรมคือ การบันทึกที่เกี่ยวข้องจะฟีดสตรีมการบันทึกบนอินพุตมาตรฐานลงใน/var/log/sv/udp-syslog-read
ไดเรกทอรีบันทึก
- (บน BSDs)
local-priv-syslog-read
บริการที่อ่านดาตาแกรมจาก/run/logpriv
และเขียนสตรีมบันทึกนั้นไปยังข้อผิดพลาดมาตรฐาน syslog-read
อีกครั้งโปรแกรมคือ การบันทึกที่เกี่ยวข้องจะฟีดสตรีมการบันทึกบนอินพุตมาตรฐานลงใน/var/log/sv/local-priv-syslog-read
ไดเรกทอรีบันทึก
ชุดเครื่องมือยังมาพร้อมกับexport-to-rsyslog
เครื่องมือที่สามารถตรวจสอบหนึ่งหรือหลายไดเรกทอรีบันทึก (ใช้ระบบเคอร์เซอร์บันทึกไม่ล่วงล้ำ) และส่งรายการใหม่ในรูปแบบ RFC 5424 ผ่านเครือข่ายไปยังเซิร์ฟเวอร์ RFC 5426 ที่กำหนด
การจัดการบันทึกด้วย systemd
systemd systemd-journald
มีโปรแกรมการจัดการบันทึกเดียวเสาหิน สิ่งนี้ทำงานเป็นบริการที่จัดการโดย systemd
- มันอ่าน
/dev/kmsg
ข้อมูลบันทึกเคอร์เนล
- มันอ่าน
/dev/log
(ลิงก์สัญลักษณ์ไปที่/run/systemd/journal/dev-log
) สำหรับข้อมูลบันทึกแอปพลิเคชันจากsyslog()
ฟังก์ชั่นของไลบรารี GNU C
- มันฟังบน
AF_LOCAL
ซ็อกเก็ตกระแสที่/run/systemd/journal/stdout
สำหรับข้อมูลบันทึกที่มาจากบริการที่มีการจัดการ systemd
- มันฟังบน
AF_LOCAL
ซ็อกเก็ตเดตาแกรมที่/run/systemd/journal/socket
สำหรับข้อมูลบันทึกที่มาจากโปรแกรมที่พูดถึงโปรโตคอลวารสารเฉพาะ systemd (เช่นsd_journal_sendv()
et al.)
- มันผสมสิ่งเหล่านี้เข้าด้วยกัน
- มันเขียนถึงชุดของทั้งระบบและต่อผู้ใช้ไฟล์ที่บันทึกในหรือ
/run/log/journal/
/var/log/journal/
- ถ้ามันสามารถเชื่อมต่อ (เป็นไคลเอนต์) ไปยัง
AF_LOCAL
ซ็อกเก็ตดาตาแกรมที่/run/systemd/journal/syslog
มันเขียนข้อมูลวารสารที่นั่นถ้ามีการกำหนดค่าการส่งต่อไปยัง syslog
- หากกำหนดค่ามันจะเขียนข้อมูลเจอร์นัลไปยังเคอร์เนลบัฟเฟอร์โดยใช้
/dev/kmsg
กลไกที่เขียนได้
- หากกำหนดค่าไว้จะบันทึกข้อมูลเจอร์นัลไปยังเทอร์มินัลและอุปกรณ์คอนโซลด้วย
สิ่งไม่ดีเกิดขึ้นทั่วทั้งระบบหากโปรแกรมนี้ขัดข้องหรือหยุดให้บริการ
systemd เองจัดการสำหรับเอาท์พุทมาตรฐานและข้อผิดพลาดของบริการ (บางส่วน) ที่จะแนบกับ/run/systemd/journal/stdout
ซ็อกเก็ต ดังนั้นผู้ที่เข้าสู่ระบบข้อผิดพลาดมาตรฐานในแบบปกติมีการส่งออกของพวกเขาไปยังวารสาร
สิ่งนี้แทนที่ทั้งหมด klogd, syslogd, syslog-ng และ rsyslogd
สิ่งเหล่านี้จำเป็นต้องเป็น systemd-specific บนระบบ systemd /dev/log
พวกเขาไม่ได้ที่จะเป็นจุดสิ้นสุดของเซิร์ฟเวอร์ แต่พวกเขาใช้หนึ่งในสองวิธี:
- พวกมันจะเป็นจุดสิ้นสุดของเซิร์ฟเวอร์
/run/systemd/journal/syslog
ซึ่ง (ถ้าคุณจำได้) systemd-journald
จะพยายามเชื่อมต่อและเขียนข้อมูลวารสาร สองสามปีที่ผ่านมาหนึ่งจะกำหนดค่าimuxsock
วิธีการป้อนข้อมูลของ rsyslogd ให้ทำเช่นนี้
- พวกเขาอ่านโดยตรงจาก systemd journal โดยใช้ systemd-specific library ที่เข้าใจรูปแบบไบนารีวารสารและที่สามารถตรวจสอบไฟล์เจอร์นัลและไดเรกทอรีสำหรับรายการใหม่ที่ถูกเพิ่มเข้ามา ทุกวันนี้มีการกำหนดค่า
imjournal
วิธีการป้อนข้อมูลของ rsyslogd ให้ทำเช่นนี้