คำตอบอื่น ๆ อธิบายตามที่ผู้เขียนกล่าวว่า "การบันทึกแบบคลาสสิค" ใน 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 ให้ทำเช่นนี้