Home / Linux, Systems, and Infrastructure / Memahami Logging di …

Memahami Logging di Linux: journald, rsyslog, dan logrotate

Logging adalah fondasi observabilitas sistem. Tanpa log yang konsisten, diagnosis kegagalan layanan, audit keamanan, dan pemantauan performa menjadi buntu. Linux modern membagi kerja logging ke tiga komponen: systemd-journald sebagai penyimpan journal biner terstruktur, rsyslog sebagai penulis berkas teks, dan logrotate sebagai pengelola daur hidup berkas. Artikel ini menjelaskan pembagian tugas tersebut berdasarkan systemd 259, rsyslog 8.2512, dan logrotate 3.22.

Ringkasan

  • systemd-journald mengumpulkan log kernel, unit systemd, dan stdout/stderr sebagai journal biner terindeks.
  • rsyslog membaca socket syslog lalu menulis /var/log/*.log mengikuti aturan facility dan priority.
  • Hanya pesan yang lewat /dev/log yang muncul di berkas teks; stdout unit systemd tidak otomatis masuk.
  • logrotate.timer menjalankan rotasi harian; rotate, compress, dan postrotate menentukan daur hidup.
  • Retensi journal diatur lewat SystemMaxUse, SystemKeepFree, dan MaxRetentionSec di journald.conf.

Dua Jalur Log yang Sering Tertukar

Ini titik yang paling sering disalahpahami. Saya memverifikasinya langsung pada sistem uji.

Jalur A — lewat /dev/log, muncul di /var/log/*.log. Aplikasi yang memanggil syslog() atau logger(1) menulis ke /dev/log. Pada sistem systemd, /dev/log adalah symlink ke /run/systemd/journal/dev-log yang dikelola journald. rsyslog menangkap lalu memfilter dan menulis ke berkas teks.

Jalur B — hanya ke journal, tidak muncul di /var/log/*.log. Proses yang menulis ke stdout atau stderr, seperti unit systemd dan polkitd, dikumpulkan journald langsung. Pesan ini tidak pernah menyentuh /dev/log.

Bukti empiris pada sistem uji: pesan logger muncul di /var/log/syslog, sedangkan pesan polkitd yang hanya ada di journal tidak pernah muncul di berkas itu. Konsekuensinya, /var/log/syslog tidak lengkap. Untuk investigasi modern, journalctl lebih andal daripada grep di berkas teks.

Alur logging Linux: kernel lewat /dev/kmsg, unit systemd lewat stdout/stderr, dan aplikasi lewat syslog atau logger menuju journald. Aplikasi menulis ke /dev/log yang dibaca journald dan rsyslog. journald menyimpan journal biner ke /var/log/journal dan /run/log/journal, sedangkan rsyslog menulis /var/log/*.log yang lalu dirotasi logrotate. Garis merah putus-putus menandai stdout unit systemd yang berhenti di journal dan tidak pernah masuk berkas teks
Hanya trafik /dev/log yang mendarat di /var/log/*.log; stdout/stderr unit systemd berhenti di journal.

AspekJalur A (/dev/log)Jalur B (stdout/stderr)
Sumbersyslog(), logger(1)Unit systemd, daemon
Masuk journalYaYa
Masuk /var/log/*.logYaTidak
KelengkapanHanya trafik /dev/logSeluruh stdout/stderr unit
Tool querygrep, awk, lessjournalctl

systemd-journald: Penyimpan Journal Terstruktur

systemd-journald menerima pesan dari kernel lewat /dev/kmsg (dikelola ReadKMsg=yes), dari stdout/stderr unit systemd, dari aplikasi via syslog(), dan dari audit kernel (dikelola Audit=yes). Opsi lengkapnya ada di journald.conf(5).

Setiap entri menyimpan metadata terstruktur seperti _SYSTEMD_UNIT, _PID, _UID, _COMM, _EXE, PRIORITY, SYSLOG_FACILITY, MESSAGE, dan timestamp mikrodetik. Inilah yang memungkinkan filter presisi, sesuatu yang mustahil pada syslog teks polos.

Journal disimpan sebagai berkas biner di dua lokasi. Pilihan Storage= di journald.conf bernilai volatile, persistent, auto, atau none.

LokasiTipeKapan dipakai
/run/log/journal/Volatile (RAM)Early boot sebelum /var ter-mount, atau Storage=volatile
/var/log/journal/Persistent (disk)Setelah /var tersedia, saat Storage=persistent

Pada Ubuntu, Storage=persistent sudah menjadi bawaan. Verifikasi kondisi sebenarnya:

bash
journalctl --disk-usage
# Archived and active journals take up 3.9G in the file system.

ls -l /var/log/journal/*/
# -rw-r----- 1 root systemd-journal 25165824 system.journal

Perhatikan kepemilikan berkas: root:systemd-journal dengan mode 0640. Grup systemd-journal, adm, dan wheel punya hak baca, sedangkan pengguna biasa hanya dapat melihat log miliknya sendiri. Ini berbeda dari model /var/log/*.log yang hanya dapat dibaca grup adm.

Membatasi Ukuran dan Retensi

Untuk server dengan disk terbatas, dua opsi ini paling penting. SystemMaxUse= membatasi total ruang, sedangkan SystemKeepFree= menyisakan ruang untuk keperluan lain; journald mengambil nilai yang lebih kecil dari keduanya. MaxRetentionSec=0 sebagai bawaan berarti retensi berbasis waktu tidak aktif, sehingga log bisa bertahan sangat lama tanpa batas waktu.

ini
# /etc/systemd/journald.conf.d/99-retensi.conf
[Journal]
SystemMaxUse=2G
SystemKeepFree=1G
MaxRetentionSec=30day

Untuk memeriksa konfigurasi hasil penggabungan semua drop-in, bukan menebak isinya:

bash
systemd-analyze cat-config systemd/journald.conf

Terapkan dengan systemctl restart systemd-journald. Hindari journalctl --verify untuk keperluan ini; perintah tersebut memvalidasi integritas berkas journal dan FSS, bukan sintaks konfigurasi.

rsyslog: Penulis Berkas Teks

rsyslog berjalan sebagai layanan terpisah dengan hak akses yang diturunkan lewat $PrivDropToUser syslog. Konfigurasi global di /etc/rsyslog.conf menetapkan pemilik berkas dan mode secara default:

conf
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$RepeatedMsgReduction on
$PrivDropToUser syslog

Aturan penyaringan per facility ada di /etc/rsyslog.d/50-default.conf:

conf
auth,authpriv.*          /var/log/auth.log
*.*;auth,authpriv.none   -/var/log/syslog
kern.*                   -/var/log/kern.log
mail.*                   -/var/log/mail.log
*.emerg                  :omusrmsg:*

Penjelasan selektor ada di rsyslog.conf(5).

SelektorArti
*.infoSemua facility pada priority info dan lebih penting
*.=infoHanya priority info, bukan yang lebih penting
*.!infoSemua priority kecuali info ke atas
mail.*Semua priority pada facility mail
local0.*Facility kustom untuk aplikasi

Mengoreksi Pemahaman soal fsync dan Tanda Minus

Ini sering disalahartikan. Menurut rsyslog.conf(5), rsyslog tidak melakukan sync setelah setiap tulisan sebagai bawaan. Tanda minus di depan jalur berkas secara eksplisit menonaktifkan sync, dan mengaktifkannya secara global butuh $ActionFileEnableSync atau parameter sync pada omfile, dengan biaya performa.

Jadi di 50-default.conf, auth.log tanpa tanda minus bukan berarti selalu ter-fsync. Tanda minus hanya menegaskan bawaan yang sudah berlaku. Jangan memakai tanda minus sebagai tanda “aman”.

logrotate: Daur Hidup Berkas

Rotasi dijalankan oleh logrotate.timer dengan OnCalendar=daily, sehingga program ini dieksekusi setiap hari, sementara keputusan rotasi tetap mengikuti direktif weekly atau daily di konfigurasi. Bawaan di /etc/logrotate.conf:

conf
weekly
rotate 4
su root adm
create
include /etc/logrotate.d

Per-aplikasi, konfigurasi diletakkan di /etc/logrotate.d/. Contoh bawaan untuk rsyslog:

conf
/var/log/syslog
/var/log/auth.log
{
    rotate 4
    weekly
    missingok
    notifempty
    compress
    delaycompress
    sharedscripts
    postrotate
        /usr/lib/rsyslog/rsyslog-rotate
    endscript
}
DirectiveFungsi
rotate 4Simpan 4 generasi lama sebelum dihapus
missingokLanjut tanpa error jika berkas tidak ada
notifemptyJangan rotasi berkas kosong
compressKompres generasi lama dengan gzip
delaycompressTunda kompresi satu siklus agar berkas tidak sedang dibuka
sharedscriptsJalankan postrotate sekali untuk seluruh blok
postrotatePerintah setelah rotasi; di sini memicu reopen pada rsyslog

Detail lengkap direktif ada di logrotate(8).

Praktik Operasional

Menyelidiki Layanan

bash
journalctl -u nginx.service -b 0      # boot ini saja
journalctl -u nginx -n 50 -f          # ikuti realtime
journalctl -u nginx -p err..crit      # filter prioritas
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx -o json-pretty    # untuk parser

Opsi lengkap ada di journalctl(1).

Memperkecil Journal

bash
journalctl --rotate --vacuum-time=7d
journalctl --disk-usage

Validasi Sebelum Restart

bash
rsyslogd -N1 -f /etc/rsyslog.conf     # sintaks rsyslog
logrotate --debug /etc/logrotate.conf # dry-run, tidak mengubah berkas
systemd-analyze cat-config systemd/journald.conf

Kesimpulan

Membahami pembagian tugas ketiga komponen mencegah salah diagnosa. Journald unggul untuk query karena metadata terstruktur dan mencakup semua sumber, termasuk stdout unit systemd. rsyslog tetap relevan untuk kompatibilitas tooling lawas dan pipeline SIEM yang memang membaca berkas teks, dengan tetap dipahami bahwa isinya tidak lengkap. logrotate menjaga agar /var/log tidak memenuhi disk. Validasi selalu lewat rsyslogd -N1, logrotate --debug, dan systemd-analyze cat-config sebelum menyentuh produksi.

Jangan nonaktifkan systemd-journal-flush.service. Layanan ini memindahkan log volatile dari /run/log/journal/ ke /var/log/journal/ saat boot. Menonaktifkannya membuat log early boot hilang permanen.