ฉันจะเรียกคืน `/ dev / log` ในโฮสต์ systemd + rsyslog ได้อย่างไร


10

เมื่อวันที่ RHEL7, systemd-journaldใช้เวลากว่าหลายหน้าที่ฯ rsyslogdของของสิ่งที่ได้กระทำครั้งโดย ไม่ว่าจะด้วยข้อผิดพลาดหรือความขัดแย้งระหว่างสอง daemons เหล่านี้บางครั้ง/dev/logจะหายไป เป็นผลให้โปรแกรมอาศัยโทรจะไม่ทำงานอย่างถูกต้องรวมทั้งตัวอย่างเช่นsyslog(3) loggerฉันจะเรียกคืน/dev/logซ็อกเก็ตได้อย่างไร

คำตอบ:


13

การถามและตอบคำถามของฉันเองเพราะ Google ไม่มีประโยชน์กับมันมากนัก

ปกติกับrsyslogdที่imuxsockโมดูลจะสร้าง/dev/logซ็อกเก็ตในตัวเองยกเลิกการเชื่อมโยงรายการก่อนหน้านี้ก่อนที่จะสร้างมัน เมื่อrsyslogdจะหยุดการทำงาน (อาจจะเป็นเพราะการเริ่มต้นใหม่ที่ล้มเหลวเนื่องจากการตั้งค่าความผิดพลาด) rsyslogd /dev/logลบ

อย่างไรก็ตาม rsyslog ที่ให้มาพร้อมกับRHEL7คาดว่าจะใช้ร่วมกับsystemdและimuxsockโมดูลจะเปิดและลบ/run/systemd/journal/syslogซ็อกเก็ตจริง ในขณะที่/dev/logอุปกรณ์ที่มีการสร้างขึ้นโดยระบบการให้บริการไฟล์ที่ทริกเกอร์systemd-journald.socketjournald

เห็นได้ชัดว่า$imjournalมีการใช้งานโมดูลหรือไม่

โดยรวมถ้า/dev/logหายไป:

  1. รีสตาร์ท systemd-journald.socket:

    systemctl restart systemd-journald.socket
    
  2. จากนั้นรีสตาร์ท rsyslogd

    systemctl start rsyslogd
    

UPDATE: ฉันเชื่อว่าrestart rsyslogdอาจลบซ็อกเก็ตอีกครั้งหากrsyslogdทำงานอยู่


2
ขอบคุณมากสำหรับสิ่งนี้! ฉันเพิ่งเสียเวลาหลายชั่วโมงในการติดตามสาเหตุที่การบันทึกไม่ทำงานสำหรับบริการ ในที่สุดฉันก็ติดตามมันไปยังส่วนที่ขาดหายไป / dev / log ซึ่งนำฉันไปสู่โซลูชันของคุณ
Chad Huneycutt

4

systemctl restart systemd-journald.socket && systemctl restart rsyslogแก้ปัญหาไม่ได้ทำงานสำหรับฉันบน Ubuntu 16.04

แต่ฉันต้องสร้างใหม่/dev/logเป็น symlink ไปที่/run/systemd/journal/dev-log:

ln -s /run/systemd/journal/dev-log /dev/log

ใช่การเชื่อมโยงด้วยตนเองควรทำงานได้เช่นกัน แต่มันก็ค่อนข้างจำไม่ได้ คำถาม: บน Ubuntu systemd-journald.socketมีอยู่เป็นบริการหรือไม่? Q2: อาจrestart rsyslogdเป็นปัญหาได้หรือไม่ บางทีมันควรจะเป็นอย่างนั้นstart rsyslogd?
Otheus

Q1: ใช่มันมีอยู่ Q2: ไม่มีrestartคำสั่งอีกต่อไปมีและservice /etc/init.d/rsyslog
11181

โดยผมคิดว่ามันเป็นที่ชัดเจนฉันหมายถึงrestart rsyslogd systemctl restart rsyslogdUbuntu ยังใช้สคริปต์เริ่มต้นสำหรับ rsyslog หรือไม่
Otheus

@Ousus /etc/init.d/rsyslog stopตามด้วย/etc/init.d/rsyslog startไม่ได้ช่วย มิได้systemctl stop syslog.socket rsyslog.service && systemctl start syslog.socket rsyslog.serviceในระบบของฉันมีทั้งและ/lib/systemd/system/rsyslog.service /etc/init.d/rsyslogอย่างไรก็ตามฉันไม่อยากใช้เวลากับปัญหานี้มากขึ้น
11181

0

สำหรับฉันแล้วการมีปัญหากับการใช้งานโมดูล imuxsock ใน rsyslog ทำงานกับ systemd

ในเอกสารประกอบ imuxsockพวกเขาดำเนินการตามวิธีที่โมดูลควรทำงานกับ systemd ขั้นตอนที่ 1 คือที่ที่ฉันเห็นปัญหา:

ขั้นตอนที่ 1: เลือกชื่อของซ็อกเก็ตระบบ

  1. หากผู้ใช้ไม่ได้เลือกอย่างชัดเจนเพื่อตั้ง SysSock.Use = "ปิด" ดังนั้นซ็อกเก็ตผู้ฟังเริ่มต้น (aka“ ซ็อกเก็ตบันทึกระบบ” หรือชื่อ“ ซ็อกเก็ตระบบ”) จะถูกตั้งค่าเป็น / dev / log มิฉะนั้นหากผู้ใช้ตั้งค่า SysSock.Use = "ปิด" ไว้อย่างชัดเจนแล้ว rsyslog จะไม่ฟัง / dev / log หรือซ็อกเก็ตใด ๆ ที่กำหนดโดยพารามิเตอร์ SysSock.Name และส่วนที่เหลือของส่วนนี้ไม่ได้ใช้

  2. หากผู้ใช้ระบุ sysSock.Name = "/ path / to / custom / socket" (และไม่ได้ตั้งค่า SysSock.Use = "off" อย่างชัดเจน) ชื่อซ็อกเก็ตผู้ฟังเริ่มต้นจะถูกเขียนทับด้วย / path / to / custom / socket .

  3. มิฉะนั้นถ้า rsyslog ทำงานภายใต้ systemd AND / run / systemd / journal / syslog อยู่ (และผู้ใช้ยังไม่ได้ตั้งค่า SysSock.Use = "ปิด" อย่างชัดเจน) ชื่อซ็อกเก็ตผู้ฟังเริ่มต้นจะถูกเขียนทับด้วย / run / systemd / journal / syslog

ระบบควรเข้าสู่ขั้นตอนที่ 3 และเปลี่ยนเส้นทางเริ่มต้นเป็น "/ run / systemd / journal / syslog" แต่แทนที่จะเป็น "/ var / log" แทน นี่หมายความว่าโมดูล imuxsock จะพยายาม (และประสบความสำเร็จในบางครั้ง) เพื่อสร้างซ็อกเก็ตที่ / dev / log ซึ่งควรจะมีลิงค์สัญลักษณ์ที่สร้างขึ้นแทน systemd-journald-dev-log.socket ในกรณีที่มันไม่สามารถสร้างซ็อกเก็ตจริงลิงก์สัญลักษณ์จะยังคงถูกลบออก

เอกสารนั้นเป็นผลลัพธ์ของปัญหานี้ที่รายงานใน rsyslog github หากคุณต้องการข้ามการอภิปรายและข้ามไปที่การเปลี่ยนแปลงโปรดดูPR # 1และPR # 2ตามลำดับ

โซลูชันของฉันคือเพียงกำหนดค่าโมดูล imuxsock เพื่อใช้เส้นทาง systemd ใน /etc/rsyslog.conf ของฉัน:

module(load="imuxsock"
    SysSock.Name="/run/systemd/journal/syslog")

ดูเหมือนว่าจะแก้ไขปัญหาของฉันแล้วและดูเหมือนเป็นโซลูชันที่ดีที่นี่เนื่องจากจะอธิบายว่าทำไมลิงก์สัญลักษณ์อาจหายไปอีกครั้งหลังจากที่คุณสร้างด้วยตนเอง

หากคุณดูระบบของคุณและ "/ run / systemd / journal / syslog" จะไม่ปรากฏที่ "syslog.socket" เพื่อดูว่ามันเริ่มต้นได้สำเร็จหรือไม่ซึ่งเป็นสิ่งที่รับผิดชอบในการสร้างซ็อกเก็ต

systemctl status syslog.socket

อาจเป็นได้ว่า rsyslog.service เวอร์ชันของคุณไม่ได้กำหนด syslog.service เป็นนามแฝงที่จำเป็นเนื่องจาก syslog.socket พยายามใช้บริการดังกล่าว นอกจากนี้ยังเป็นไปได้ที่บริการการบันทึกหลายรายการพยายามที่จะใช้นามแฝง syslog.service ซึ่งในกรณีสุดท้ายที่จะเปิดใช้งานจะชนะ

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