Bagaimana cara mengembalikan `/ dev / log` di host systemd + rsyslog?

10

Di RHEL7, systemd-journaldambil alih banyak tanggung jawab dari apa yang pernah dilakukan oleh rsyslogd. Entah karena bug atau konflik antara kedua daemon ini, terkadang /dev/logakan hilang. Akibatnya, program yang mengandalkan syslog(3)panggilan tidak akan berfungsi dengan baik, termasuk, misalnya logger,. Bagaimana saya bisa mengembalikan /dev/logsoket?

Otheus
sumber

Jawaban:

13

Bertanya dan menjawab pertanyaan saya sendiri karena Google tidak terlalu membantu dalam hal ini.

Biasanya, with rsyslogd, imuxsockmodul akan membuat /dev/logsocket sendiri, memutuskan tautan entri sebelumnya sebelum membuatnya. Ketika rsyslogddihentikan (mungkin karena restart yang gagal karena konfigurasi yang salah), rsyslogd menghapus /dev/log .

Namun, rsyslog yang dipasok dengan RHEL7diharapkan akan digunakan bersama systemd, dan imuxsockmodul akan benar-benar membuka dan menghapus /run/systemd/journal/syslogsoket. Sementara itu, /dev/logperangkat dibuat oleh file layanan sistem systemd-journald.socketyang memicu journald.

Ternyata, apakah $imjournalmodul digunakan atau tidak , berikut ini berfungsi.

Singkatnya, jika /dev/logmenghilang:

  1. restart systemd-journald.socket:

    systemctl restart systemd-journald.socket
    
  2. kemudian mulai ulang rsyslogd

    systemctl start rsyslogd
    

PEMBARUAN: Saya yakin restart rsyslogdmungkin menghapus ulang soket jika rsyslogdsudah berjalan.

Otheus
sumber
2
Terima kasih banyak untuk ini! Saya baru saja kehilangan beberapa jam melacak mengapa logging tidak berfungsi untuk layanan. Saya akhirnya melacaknya ke / dev / log yang hilang, yang membawa saya ke solusi Anda.
Chad Huneycutt
4

The systemctl restart systemd-journald.socket && systemctl restart rsyslogsolusi tidak bekerja untuk saya pada Ubuntu 16.04.

Sebagai gantinya, saya harus membuat ulang /dev/logsebagai symlink ke /run/systemd/journal/dev-log:

ln -s /run/systemd/journal/dev-log /dev/log
11181
sumber
Ya, menautkan secara manual juga akan berfungsi. Tapi agak sulit untuk diingat. Pertanyaan: Di Ubuntu apakah systemd-journald.socketada layanan? Q2: mungkin restart rsyslogdmasalahnya? Mungkin seharusnya begitu start rsyslogd?
Otheus
T1: ya, itu ada. T2: tidak ada restartperintah lagi, ada servicedan /etc/init.d/rsyslog.
11181
Dengan restart rsyslogdsaya pikir itu aku jelas berarti systemctl restart rsyslogd. Apakah Ubuntu masih menggunakan skrip init untuk rsyslog?
Otheus
@Ous /etc/init.d/rsyslog stopdiikuti oleh /etc/init.d/rsyslog starttidak membantu. Juga tidak systemctl stop syslog.socket rsyslog.service && systemctl start syslog.socket rsyslog.servicePada sistem saya ada keduanya /lib/systemd/system/rsyslog.servicedan /etc/init.d/rsyslog. Bagaimanapun, saya lebih suka tidak menghabiskan lebih banyak waktu untuk masalah ini.
11181
0

Bagi saya ini akhirnya menjadi masalah dengan bagaimana modul imuxsock yang digunakan dalam rsyslog bekerja dengan systemd.

Dalam dokumentasi imuxsock mereka mempelajari bagaimana modul seharusnya bekerja untuk systemd. Langkah 1 adalah tempat saya melihat masalah:

Langkah 1: Pilih nama soket sistem

  1. Jika pengguna belum secara eksplisit memilih untuk menetapkan SysSock.Use = "off" maka soket pendengar default (alias, "soket log sistem" atau hanya "soket sistem") nama diatur ke / dev / log. Jika tidak, jika pengguna telah secara eksplisit mengatur SysSock.Use = "off", maka rsyslog tidak akan mendengarkan / dev / log ATAU soket apa pun yang ditentukan oleh parameter SysSock.Name dan sisa bagian ini tidak berlaku.

  2. Jika pengguna telah menetapkan sysSock.Name = "/ path / ke / custom / socket" (dan tidak secara eksplisit mengatur SysSock.Use = "off"), maka nama soket pendengar default ditimpa dengan / path / ke / custom / socket .

  3. Kalau tidak, jika rsyslog berjalan di bawah systemd AND / run / systemd / journal / syslog ada, (DAN pengguna belum secara eksplisit mengatur SysSock.Use = "off") maka nama soket pendengar default ditimpa dengan / run / systemd / journal / syslog.

Sistem seharusnya jatuh ke Langkah 3 dan mengubah jalur default menjadi "/ run / systemd / journal / syslog" tetapi sebaliknya itu tetap "/ var / log". Ini berarti bahwa modul imuxsock akan mencoba (dan kadang-kadang berhasil) untuk membuat socket di / dev / log di mana seharusnya ada tautan simbolik yang dibuat oleh systemd-journald-dev-log.socket. Dalam hal gagal membuat soket asli, tautan simbolik masih akan dihapus.

Dokumentasi itu adalah hasil dari masalah ini yang dilaporkan pada rsyslog github. Jika Anda ingin melewatkan diskusi dan langsung beralih ke perubahan, lihat PR # 1 dan PR # 2 masing-masing.

Solusi saya adalah mengkonfigurasi modul imuxsock untuk menggunakan jalur systemd di /etc/rsyslog.conf saya:

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

Ini tampaknya telah memperbaiki masalah saya dan terdengar seperti solusi yang baik di sini karena ini akan menjelaskan mengapa tautan simbolis mungkin hilang lagi setelah Anda membuatnya secara manual.

Jika Anda melihat sistem Anda dan "/ run / systemd / journal / syslog" tidak ada lihat "syslog.socket" untuk melihat apakah itu mulai berhasil karena itulah yang bertanggung jawab untuk membuat soket.

systemctl status syslog.socket

Bisa jadi versi rsyslog.service Anda tidak mendefinisikan syslog.service sebagai alias yang diperlukan ketika syslog.socket mencoba mengaktifkan layanan itu. Ada kemungkinan juga bahwa beberapa layanan logging mencoba alias syslog.service yang dalam kasus terakhir diaktifkan akan menang.

Adam
sumber