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/*.logmengikuti aturan facility dan priority. - Hanya pesan yang lewat
/dev/logyang muncul di berkas teks; stdout unit systemd tidak otomatis masuk. - logrotate.timer menjalankan rotasi harian;
rotate,compress, danpostrotatemenentukan daur hidup. - Retensi journal diatur lewat
SystemMaxUse,SystemKeepFree, danMaxRetentionSecdi 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.

| Aspek | Jalur A (/dev/log) | Jalur B (stdout/stderr) |
|---|---|---|
| Sumber | syslog(), logger(1) | Unit systemd, daemon |
| Masuk journal | Ya | Ya |
Masuk /var/log/*.log | Ya | Tidak |
| Kelengkapan | Hanya trafik /dev/log | Seluruh stdout/stderr unit |
| Tool query | grep, awk, less | journalctl |
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.
| Lokasi | Tipe | Kapan 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:
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.journalPerhatikan 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.
# /etc/systemd/journald.conf.d/99-retensi.conf
[Journal]
SystemMaxUse=2G
SystemKeepFree=1G
MaxRetentionSec=30dayUntuk memeriksa konfigurasi hasil penggabungan semua drop-in, bukan menebak isinya:
systemd-analyze cat-config systemd/journald.confTerapkan 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:
$FileOwner syslog
$FileGroup adm
$FileCreateMode 0640
$RepeatedMsgReduction on
$PrivDropToUser syslogAturan penyaringan per facility ada di /etc/rsyslog.d/50-default.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).
| Selektor | Arti |
|---|---|
*.info | Semua facility pada priority info dan lebih penting |
*.=info | Hanya priority info, bukan yang lebih penting |
*.!info | Semua 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:
weekly
rotate 4
su root adm
create
include /etc/logrotate.dPer-aplikasi, konfigurasi diletakkan di /etc/logrotate.d/. Contoh bawaan untuk rsyslog:
/var/log/syslog
/var/log/auth.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}| Directive | Fungsi |
|---|---|
rotate 4 | Simpan 4 generasi lama sebelum dihapus |
missingok | Lanjut tanpa error jika berkas tidak ada |
notifempty | Jangan rotasi berkas kosong |
compress | Kompres generasi lama dengan gzip |
delaycompress | Tunda kompresi satu siklus agar berkas tidak sedang dibuka |
sharedscripts | Jalankan postrotate sekali untuk seluruh blok |
postrotate | Perintah setelah rotasi; di sini memicu reopen pada rsyslog |
Detail lengkap direktif ada di logrotate(8).
Praktik Operasional
Menyelidiki Layanan
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 parserOpsi lengkap ada di journalctl(1).
Memperkecil Journal
journalctl --rotate --vacuum-time=7d
journalctl --disk-usageValidasi Sebelum Restart
rsyslogd -N1 -f /etc/rsyslog.conf # sintaks rsyslog
logrotate --debug /etc/logrotate.conf # dry-run, tidak mengubah berkas
systemd-analyze cat-config systemd/journald.confKesimpulan
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.