การรับข้อความ Syslog ด้วย systemd Arch Linux


25

ฉันรู้สึกว่าฉันมองข้ามสิ่งที่เห็นได้ชัดเจน แต่ฉันไม่สามารถเข้าใจวิธีการรับเซิร์ฟเวอร์ Arch Linux ของฉันซึ่งใช้systemdเพื่อรับและบันทึกsyslogข้อความจากระบบระยะไกล

ฉันมีโมเด็ม Cisco 678 DSL และ WAP DD-WRT และทั้งสองสามารถกำหนดค่าให้ส่งข้อความรูปแบบ syslog ไปยังเครื่องอื่นได้ ฉันต้องการให้เครื่องนั้นเป็นเซิร์ฟเวอร์ Arch Linux ของฉัน

ฉันไปรอบ ๆ และสิ่งที่ฉันพบคือ "systemd แทนที่ syslog" หรือว่าฉันไม่จำเป็นต้องทำงานอีกต่อไปsyslogหรือสิ่งที่ไม่เกี่ยวข้องกับคำถามของฉัน

UPDATE

ฉันถามฟอรัม Archแล้วและไม่มีคำตอบที่เกี่ยวข้อง ฉันติดตั้ง syslog-ng เพื่อฟังบนพอร์ต UDP 514 syslog-ng เขียนข้อความจาก Cisco 678 ของฉันและ WAP DD-WRT ที่ฉันมี น่าเสียดายที่ข้อความไม่ได้จบลงในสมุดรายวันของ systemd แต่เป็นไฟล์แบบแฟลต ดังนั้นไม่มีวิธีแก้ปัญหาที่แน่นอน แต่มีวิธีแก้ปัญหา ฉันควรมีข้อความ syslog ในวารสารไม่ใช่ไฟล์ flat


systemd ใช้ของตัวเองเข้าสู่ระบบ นอกจากนี้ยังมีmetalogซึ่งมีอยู่ใน core repos Arch - I ส่วนตัวใช้ทั้งสาม: syslog, systemd's journal และ metalog ลองตรวจสอบ systemd journal หากฉันจำได้อย่างถูกต้อง syslog นับตั้งแต่เปลี่ยนเป็น systemd ได้รับการกำหนดค่าให้ส่งข้อความทั้งหมดและบันทึกในสมุดบันทึกของ systemd
Alexej Magura

คำตอบ:


11

คุณสามารถเขียนเซิร์ฟเวอร์ syslog คนจนค่อนข้างได้อย่างง่ายดายด้วยsocat คุณเพียงแค่ต้องการหน่วยบริการเช่นนี้:

[Service]
Restart=on-success
ExecStart=/usr/bin/socat -u UDP-RECV:514 STDOUT

มันจะส่งสิ่งที่ได้รับบนพอร์ตบริการ syslog ไปยังเจอร์นัลของ systemd บันทึกข้างต้นเป็นพูด/etc/systemd/system/syslog.serviceแล้ว

# systemctl daemon-reload
# systemctl start syslog

จากนั้นคุณเพียงต้องการแหล่งที่มาของคุณเพื่อส่งข้อความไปยังพอร์ต UDP 514 บนเซิร์ฟเวอร์การฟังของคุณ

คุณอาจต้องการปรับปรุงสิ่งนี้เพื่อแยกวิเคราะห์ข้อมูลที่ได้รับและจัดรูปแบบ แต่ไม่จำเป็นถ้าสิ่งที่คุณต้องการทำคือบันทึกสิ่งที่ได้รับ

( socatอยู่ใน Arch Linux พิเศษพื้นที่เก็บข้อมูล: pacman -S socat)


4
คำตอบที่ดี. ฉันไปกับสคริปต์ไพ ธ อนอย่างรวดเร็วเนื่องจากฉันไม่สามารถติดตั้ง socat:import socket; sock = socket.socket(type=socket.SocketKind.SOCK_DGRAM); sock.bind(("0.0.0.0", 514)); while True: print(sock.recv(1024 * 1024))
awelkie

3

มีช่องว่างเล็กน้อยที่นี่

Systemd ไม่รองรับการส่งข้อความระยะไกลผ่านส่วนประกอบ systemd-journal-gateway ที่ถูกกล่าวข้อความเหล่านี้ไม่ได้อยู่ในรูปแบบ syslog Syslog (เป็นรูปแบบ) เป็น IETF ให้สัตยาบันการจัดทำเอกสารใน RFC 5424 (ซึ่งคัดค้านรุ่นก่อนหน้า RFC 3164)

ความซับซ้อนที่เพิ่มขึ้นของการทำให้การเล่นเหล่านี้ร่วมกันได้รับการบันทึกไว้ที่นี่:

http://www.freedesktop.org/wiki/Software/systemd/syslog/

และที่นี่ (man systemd-journald.service)

   systemd-journald is a system service that collects and stores logging data.
   It creates and maintains structured, indexed journals based on logging
   information that is received from the kernel, from user processes via the
   libc syslog(3) call, from STDOUT/STDERR of system services or via its native
   API. It will implicitly collect numerous meta data fields for each log
   messages in a secure and unfakeable way. See systemd.journal-fields(7) for
   more information about the collected meta data.

โดยสรุปตรวจสอบให้แน่ใจว่าข้อความถูกส่งจาก syslog-ng ไปยัง STDOUT และสิ่งต่างๆควรจะจบลงในวารสาร

ในการติดตามนี้อีกเล็กน้อยฉันก็พบสิ่งนี้เช่นกัน:

https://github.com/intgr/pg_journal/blob/master/doc/pg_journal.md

ตำแหน่งที่มีคนกำลังเขียนการเชื่อมจาก PostgreSQL ไปยัง systemd เพื่อการบันทึก ในนี้พวกเขาอ้างว่าปัจจุบัน (ณ เวลาของไฟล์นั้น 2013/06) ข้อความหลายบรรทัดไม่ได้รับการสนับสนุนใน systemd ดังนั้นโปรดระวังเช่นกัน


2

ฉันไม่รู้การกระจายของอาร์ค ฉันมี Fedora 20 (รวมถึง systemd) และได้กำหนดค่าให้ยอมรับข้อความ syslog ระยะไกล

IMHO ฟังก์ชั่นนี้ไม่เกี่ยวข้องกับ systemd systemd-journald.service ขัดจังหวะตัวเองระหว่างเคอร์เนล / โปรแกรมผู้ใช้พื้นที่และระบบย่อย syslog มันจับ (ฉันคิดว่า) เฉพาะข้อความในเครื่องจากแหล่งข้อมูลเหล่านี้ลงในฐานข้อมูลวารสารแล้วส่งต่อไปยัง syslog ดูตัวอย่าง "man systemd-journald.service" (อย่างน้อยใน Fedora)

ในกรณีของฉันฉันเปิดใช้งานสิ่งนี้โดยการกำหนดค่า "TCP syslog receiver module" เสริมใน /etc/rsyslog.conf ie

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

นอกจากนี้ยังมีโมดูล UDP

นอกจากนี้ยังจำเป็นต้องเพิ่มกฎ (s) syslog เพื่อส่งออกไปยังไฟล์ที่ต้องการโดยตรง สำหรับเอกสารฉบับสมบูรณ์โปรดดูที่: http://www.rsyslog.com/doc/

HTH


2

ฉันติดตั้ง syslog-ng และสามารถรับข้อความบันทึก syslog แต่ต้องการฉันต้องการจริง ๆ คือการได้รับข้อความบันทึก syslog แล้วเขียนข้อความดังกล่าวเพื่อเจอร์นัล ฉันไม่พบวิธีกำหนดค่า syslog-ng เพื่อเขียนข้อความ syslog ระยะไกลไปยัง journald

ดังนั้นฉันจึงเขียนโปรแกรมเพื่อทำสิ่งนี้

https://github.com/advantageous/rsyslog-journald-repeater

./rsyslog-journald-repeater -h
Usage of ./rsyslog-journald-repeater:
-debug
    debug flag
-host string
    hostname to listen on (default "0.0.0.0")
-port int
    port to listen on (default 5514 on darwin, default 514 on Linux, Unix, etc.)

สร้างไฟล์และคำแนะนำสำหรับการทดสอบและตัวอย่างไฟล์ systemd unit ที่รวมอยู่ในโครงการ สนุก!


0

syslog-ng และ systemd journal

จากsyslog-ng

เริ่มต้นด้วย syslog-ng เวอร์ชั่น 3.6.1 system()ซอร์สเริ่มต้นบนระบบ Linux ที่ใช้ systemd ใช้ journald เป็นsystem()แหล่งมาตรฐาน

หากคุณต้องการใช้ทั้งไฟล์ journald และ syslog-ng ตรวจสอบให้แน่ใจว่าการตั้งค่าต่อไปนี้มีผล สำหรับ systemd-journald ในไฟล์ /etc/systemd/journald.conf Storage = อาจถูกตั้งค่าเป็น auto หรือ unset (ซึ่งเป็นค่าเริ่มต้นเป็น auto) และ ForwardToSyslog = จะตั้งค่าเป็น no หรือ unset (ค่าเริ่มต้นเป็น no) สำหรับ /etc/syslog-ng/syslog-ng.conf คุณต้องมี stanza ต้นทางต่อไปนี้:

 source src {
   system();
   internal();
 };

หากในมืออื่น ๆ ที่คุณต้องการไม่ได้ที่จะเก็บบันทึก journald แต่ syslog-ng ของบันทึกข้อความชุดStorage=volatileและในForwardToSyslog=yes /etc/systemd/journald.confสิ่งนี้จะเก็บ journald ใน ram ในฐานะของ syslog-ng 3.6.3, syslog-ng ใช้ journald เป็นsystem()แหล่งข้อมูลดังนั้นหากคุณตั้งค่า Storage = none, systemd journal จะลดลงข้อความทั้งหมดและไม่ส่งต่อไปยัง syslog-ng

หลังจากการเปลี่ยนแปลงรีสตาร์ทsystemd-journald.serviceและsyslog-ng.servicedaemons

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