Menerima pesan Syslog dengan systemd Arch Linux

25

Saya merasa seperti saya telah mengabaikan yang sudah jelas, tetapi saya tidak tahu bagaimana cara mendapatkan server Arch Linux saya, yang menggunakan systemd, untuk menerima dan mencatat syslogpesan dari sistem jarak jauh.

Saya memiliki modem Cisco 678 DSL dan WAP DD-WRT, dan keduanya dapat dikonfigurasi untuk mengirim pesan format syslog ke mesin lain. Saya ingin mesin itu menjadi server Arch Linux saya.

Saya sudah googled, dan yang saya temukan adalah "systemd menggantikan syslog", atau bahwa saya tidak perlu lagi menjalankan syslogatau sesuatu yang sama tidak relevan dengan pertanyaan saya.

MEMPERBARUI

Saya telah bertanya di forum Arch dan tidak mendapat jawaban yang relevan. Saya telah menginstal syslog-ng hanya untuk mendengarkan pada port UDP 514. syslog-ng menulis pesan dari Cisco 678 saya, dan WAP DD-WRT yang saya punya. Sayangnya, pesan tidak berakhir di jurnal systemd, melainkan dalam file datar. Jadi, tidak ada solusi yang tepat, tetapi sesuatu yang bisa diatasi. Saya lebih suka memiliki pesan syslog di jurnal, bukan di file datar.

Bruce Ediger
sumber
systemd menggunakan log -nya sendiri . Ada juga metalog , yang tersedia di repositori Arch inti - saya, secara pribadi, menggunakan ketiganya: syslog, jurnal systemd, dan metalog. Coba periksa jurnal systemd. Jika saya ingat dengan benar, syslog, sejak beralih ke systemd, telah dikonfigurasi untuk mengirim semua pesannya dan semacamnya ke jurnal systemd.
Alexej Magura

Jawaban:

11

Anda dapat menulis server syslog orang miskin dengan cukup mudah dengan socat . Anda hanya perlu unit layanan seperti ini:

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

Itu akan secara membabi buta mengirim apa pun yang diterima pada port layanan syslog ke jurnal systemd. Simpan di atas sebagai, katakan, /etc/systemd/system/syslog.servicelalu

# systemctl daemon-reload
# systemctl start syslog

Anda kemudian hanya perlu sumber Anda untuk mengirim pesan ke port UDP 514 di server mendengarkan Anda.

Anda mungkin ingin meningkatkan ini untuk benar-benar mem-parsing data yang diterima dan memformatnya tetapi tidak perlu jika semua yang ingin Anda lakukan adalah jurnal apa yang diterima.

( Socat dalam Arch Linux ekstra repositori: pacman -S socat)

starfry
sumber
4
Jawaban yang bagus. Saya menggunakan skrip python cepat karena saya tidak dapat menginstal 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

Jadi ada sedikit celah di sini.

Systemd mendukung pesan jarak jauh melalui komponen systemd-journal-gateway. Dikatakan bahwa pesan-pesan ini tidak dalam format syslog. Syslog (sebagai format) adalah spefikasi ratifikasi IETF yang didokumentasikan dalam RFC 5424 (yang tidak lagi digunakan dalam versi sebelumnya, RFC 3164).

Lebih banyak seluk-beluk membuat permainan ini bersama-sama didokumentasikan di sini:

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

dan di sini (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.

Singkatnya, pastikan bahwa pesan dikirim dari syslog-ng ke STDOUT dan semuanya akan berakhir di jurnal.

Dalam menindaklanjuti ini sedikit lebih saya menemukan ini juga:

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

Di mana seseorang menulis pengikatan dari PostgreSQL ke systemd untuk login. Dalam hal ini mereka mengutip bahwa saat ini (pada saat file itu, 2013/06) pesan multi-line tidak didukung di systemd, jadi hati-hati untuk itu juga.

Brian Redbeard
sumber
2

Saya tidak tahu distribusi Arch. Saya punya Fedora 20 (termasuk systemd) dan telah mengkonfigurasinya untuk menerima pesan syslog jarak jauh.

IMHO, fungsi ini tidak terkait dengan systemd. Systemd-journald.service menempatkan dirinya di antara program-program kernel / userspace dan subsistem syslog. Ia menangkap (saya pikir) hanya pesan lokal dari sumber-sumber ini ke dalam basis data jurnal dan kemudian meneruskannya ke syslog. Lihat misalnya "man systemd-journald.service" (setidaknya di Fedora).

Dalam kasus saya saya mengaktifkan ini dengan mengkonfigurasi opsional "modul penerima TCP syslog" di /etc/rsyslog.conf yaitu

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

Modul UDP juga tersedia.

Anda juga perlu menambahkan (r) aturan syslog untuk mengarahkan output ke file yang diinginkan. Untuk dokumentasi lengkap, lihat: http://www.rsyslog.com/doc/

HTH.

Robb W.
sumber
2

Saya menginstal syslog-ng dan dapat menerima pesan log syslog. Tapi ingin saya benar-benar ingin menerima pesan log syslog dan kemudian menulis pesan mengatakan ke journald. Saya tidak dapat menemukan cara untuk mengkonfigurasi syslog-ng untuk menulis pesan syslog jarak jauh ke journald.

Jadi saya menulis sebuah utilitas untuk melakukan ini.

https://github.com/untungage/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.)

Membangun file dan instruksi untuk pengujian dan sampel file systemd unit disertakan dengan proyek. Nikmati!

RickHigh
sumber
0

syslog-ng dan jurnal systemd

Dari syslog-ng

Dimulai dengan syslog-ng versi 3.6.1 system()sumber default pada sistem Linux menggunakan systemd menggunakan journald sebagai system()sumber standarnya .

Jika Anda ingin menggunakan file journald dan syslog-ng, pastikan pengaturan berikut ini berlaku. Untuk systemd-journald, dalam file /etc/systemd/journald.conf, Storage = disetel ke otomatis atau tidak disetel (yang default ke otomatis) dan ForwardToSyslog = setel ke tidak ada atau setel (setel ke tidak ada). Untuk /etc/syslog-ng/syslog-ng.conf, Anda memerlukan bait sumber berikut:

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

Sebaliknya, jika Anda ingin tidak menyimpan log jurnal, tetapi hanya log teks syslog-ng, atur Storage=volatiledan ForwardToSyslog=yesmasuk /etc/systemd/journald.conf. Ini akan menyimpan journald dalam ram. Pada syslog-ng 3.6.3, syslog-ng menggunakan journald sebagai system()sumbernya, jadi jika Anda mengatur Storage = none, jurnal systemd akan menghapus semua pesan dan tidak meneruskannya ke syslog-ng.

Setelah perubahan restart systemd-journald.servicedan syslog-ng.servicedaemon.

RickHigh
sumber