Log di Linux: journalctl, /var/log, rsyslog, dan logrotate
Di distribusi Linux modern, log dikumpulkan oleh journald dan dibaca dengan perintah journalctl: journalctl -u nginx menampilkan catatan satu layanan, -f aliran real-time, dan --since serta -p menyaring berdasarkan waktu dan tingkat keparahan. Log teks berada di /var/log, ditulis oleh rsyslog atau aplikasinya sendiri, dan logrotate secara berkala memampatkan serta menghapus berkas lama agar disk tidak penuh.
Ketika sebuah layanan mati di tengah malam, jawabannya hampir selalu ada di log — pertanyaannya hanya di mana mencarinya. Di distribusi modern (Ubuntu, Debian, RHEL, Fedora, Arch), peristiwa dikumpulkan oleh layanan journald dan dibaca dengan perintah journalctl. Di samping itu, banyak program menulis berkas teks biasa di /var/log, dan ukurannya diawasi oleh logrotate. Di bawah ini dibahas cara bekerja dengan log Linux melalui journalctl dalam praktik, di mana letak log lainnya, dan cara agar informasi penting tidak hilang saat rotasi.
Di mana log disimpan di Linux
Ada tiga sumber, dan berguna untuk mengingatnya sebagai peta:
- journald — jurnal biner systemd. Menerima stdout dan stderr semua layanan, pesan kernel, serta syslog. Disimpan di
/var/log/journal/(permanen) atau/run/log/journal/(sampai reboot). - /var/log — berkas teks. Ditulis oleh
rsyslog(misalnya/var/log/syslog,/var/log/auth.log) atau langsung oleh aplikasi: nginx, PostgreSQL, MySQL. - Ring buffer kernel — pesan dari driver dan perangkat keras, ditampilkan oleh
dmesgataujournalctl -k.
| Berkas | Isi |
|---|---|
/var/log/syslog (Debian/Ubuntu) | jurnal sistem umum |
/var/log/messages (RHEL/Fedora) | hal yang sama dalam keluarga Red Hat |
/var/log/auth.log atau /var/log/secure | login, sudo, SSH |
/var/log/kern.log | pesan kernel |
/var/log/dpkg.log, /var/log/apt/ | instalasi paket |
/var/log/nginx/ | access.log dan error.log web server |
/var/log/wtmp, /var/log/btmp | jurnal login biner, dibaca dengan last dan lastb |
Sebagian besar berkas di /var/log hanya bisa dibaca oleh root atau grup adm, sehingga perintah baca sering harus dijalankan dengan sudo.
journalctl: perintah dasar
Tanpa argumen, journalctl menampilkan seluruh jurnal dari catatan tertua melalui pager less. Jarang diperlukan — biasanya langsung dipersempit.
journalctl # seluruh jurnal, dari lama ke baru
journalctl -e # langsung di akhir
journalctl -n 50 # 50 baris terakhir
journalctl -r # urutan terbalik, yang terbaru di atas
journalctl --no-pager # tanpa less, cocok untuk skrip dan grep
Di dalam pager berlaku tombol less yang biasa: / — mencari, G — ke akhir, q — keluar. Baris panjang dipotong sesuai lebar layar; panah kiri dan kanan menggulir ke samping.
Log satu layanan: journalctl -u
Skenario paling umum adalah melihat apa yang ditulis satu unit systemd. Tidak perlu mencari berkas dan melakukan grep:
$ sudo journalctl -u nginx -n 20
Oct 14 03:12:41 web1 systemd[1]: Starting nginx.service - A high performance web server...
Oct 14 03:12:41 web1 nginx[1834]: nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
Oct 14 03:12:41 web1 systemd[1]: nginx.service: Control process exited, code=exited, status=1/FAILURE
Oct 14 03:12:41 web1 systemd[1]: nginx.service: Failed with result 'exit-code'.
Flag -u bisa diulang: journalctl -u nginx -u php8.2-fpm menampilkan kedua layanan bercampur menurut waktu, yang berguna jika error terjadi di perbatasan keduanya. Untuk unit pengguna (systemctl --user) gunakan journalctl --user -u nama.
Log real-time: journalctl -f
sudo journalctl -u nginx -f
Ini setara dengan tail -f: perintah menampilkan 10 catatan terakhir lalu menunggu catatan baru. Praktis dibiarkan di terminal lain saat Anda me-restart layanan atau mengulang error. Keluar dengan Ctrl+C.
Filter berdasarkan waktu dan boot
Jika Anda tahu kapan gangguan terjadi, batasi waktunya dengan --since dan --until. Keduanya menerima tanggal pasti maupun nilai relatif:
journalctl --since "2026-10-14 02:50" --until "2026-10-14 03:30"
journalctl --since "1 hour ago"
journalctl --since yesterday --until today
journalctl -u nginx --since "10 min ago"
Irisan lain yang berguna adalah per boot sistem. Jika server reboot sendiri, penyebabnya dicari di akhir sesi sebelumnya:
$ journalctl --list-boots
-2 8f1c... Sat 2026-10-12 09:01:12 UTC Sun 2026-10-13 22:47:03 UTC
-1 a7d2... Sun 2026-10-13 22:48:30 UTC Tue 2026-10-14 03:05:51 UTC
0 c3e9... Tue 2026-10-14 03:07:02 UTC Tue 2026-10-14 09:15:40 UTC
$ journalctl -b -1 -e # akhir boot sebelumnya
$ journalctl -b # hanya boot saat ini
Daftar boot hanya tersedia jika jurnal disimpan di disk. Cara mengaktifkannya dijelaskan di bagian konfigurasi journald di bawah.
Filter berdasarkan tingkat keparahan: journalctl -p
Setiap catatan memiliki prioritas syslog dari 0 sampai 7. Flag -p menampilkan tingkat yang diminta beserta yang lebih penting:
| Kode | Nama | Kapan dipakai |
|---|---|---|
| 0 | emerg | sistem tidak dapat digunakan |
| 1 | alert | perlu tindakan segera |
| 2 | crit | kesalahan kritis |
| 3 | err | kesalahan |
| 4 | warning | peringatan |
| 5 | notice | kejadian penting tetapi normal |
| 6 | info | pesan informasi |
| 7 | debug | debugging |
journalctl -p err -b # semua error sejak boot
journalctl -p warning..err -u ssh # rentang tingkat untuk satu layanan
Perintah journalctl -p err -b adalah pemeriksaan pertama yang baik setelah reboot atau pembaruan: dalam hitungan detik ia menunjukkan apa yang salah.
Pencarian dan filter lainnya
journald menyimpan field terstruktur pada setiap catatan, dan Anda bisa memfilter berdasarkan field itu tanpa grep:
journalctl _PID=1834 # berdasarkan nomor proses
journalctl _COMM=sshd # berdasarkan nama program
journalctl _UID=1000 # berdasarkan pengguna
journalctl /usr/sbin/sshd # berdasarkan path berkas yang dijalankan
journalctl -k # hanya pesan kernel (seperti dmesg)
journalctl -t CRON # berdasarkan identifier syslog
journalctl -g "Out of memory" # pencarian teks, regular expression
Flag -g (--grep) tersedia sejak systemd 237; pada sistem lama gunakan pipeline biasa journalctl --no-pager | grep .... Filter pada field yang berbeda digabung dengan «DAN», sehingga journalctl -u nginx -p err --since today hanya menampilkan error nginx hari ini.
Format keluaran
Flag -o mengubah format. Pilihan yang paling berguna:
-o short-iso— waktu dalam ISO 8601, mudah dibandingkan dengan log aplikasi.-o verbose— semua field catatan, termasuk_SYSTEMD_UNIT,_PID,_BOOT_ID.-o jsonataujson-pretty— untuk diproses skrip ataujq.-o cat— hanya teks pesan, tanpa tanggal dan host.
journalctl -u myapp -o json --since today | jq -r '.MESSAGE'
Konfigurasi journald: penyimpanan dan ukuran
Pengaturan berada di /etc/systemd/journald.conf (penggantian sebaiknya ditaruh di /etc/systemd/journald.conf.d/*.conf). Parameter utamanya adalah Storage:
persistent— jurnal ditulis ke disk di/var/log/journaldan bertahan setelah reboot.volatile— hanya di memori, di/run/log/journal.auto(default) — ke disk jika direktori/var/log/journalada.
Pada sebagian image minimal direktori itu tidak ada, dan riwayat hilang setelah reboot. Untuk mengaktifkan penyimpanan permanen:
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
Agar jurnal tidak menghabiskan seluruh disk, tetapkan batasnya:
# /etc/systemd/journald.conf.d/size.conf
[Journal]
Storage=persistent
SystemMaxUse=500M
MaxRetentionSec=1month
Secara default, SystemMaxUse adalah 10% dari ukuran sistem berkas, tetapi tidak lebih dari 4 GB.
Cara membersihkan jurnal journalctl
$ journalctl --disk-usage
Archived and active journals take up 1.8G in the file system.
sudo journalctl --vacuum-size=300M # sisakan tidak lebih dari 300 MB
sudo journalctl --vacuum-time=2weeks # hapus catatan yang lebih tua dari dua minggu
sudo journalctl --rotate # tutup berkas aktif agar ikut bisa dihapus
Sebaiknya jangan menghapus berkas di /var/log/journal dengan rm: vacuum melakukan hal yang sama dengan rapi dan tidak menyentuh berkas yang sedang aktif.
rsyslog: log teks klasik
rsyslog adalah daemon yang menerima pesan syslog (termasuk yang diteruskan dari journald) dan membaginya ke berkas-berkas sesuai aturan. Konfigurasinya ada di /etc/rsyslog.conf dan /etc/rsyslog.d/*.conf. Satu aturan terdiri dari selektor sumber.tingkat dan aksi:
# /etc/rsyslog.d/50-default.conf (fragmen)
auth,authpriv.* /var/log/auth.log
*.*;auth,authpriv.none -/var/log/syslog
kern.* -/var/log/kern.log
Tanda minus sebelum path berarti penulisan tanpa sinkronisasi ke disk setelah setiap baris — lebih cepat, tetapi saat terjadi crash beberapa baris terakhir bisa hilang. Setelah mengubah konfigurasi, periksa sintaksnya lalu restart layanan:
sudo rsyslogd -N1
sudo systemctl restart rsyslog
Alasan utama rsyslog dipertahankan di samping journald adalah pengiriman log ke server pusat. Satu baris sudah cukup untuk mengirim semuanya lewat TCP:
# /etc/rsyslog.d/90-remote.conf
*.* @@logs.example.com:514
Satu karakter @ berarti UDP, dua @@ berarti TCP. Jika server utama hancur, salinan log tetap ada di mesin lain. Untuk menulis pesan sendiri ke log sistem dari skrip, gunakan logger:
logger -t backup -p user.err "Backup database gagal"
journalctl -t backup -n 5
logrotate: rotasi log
Log teks terus bertambah sampai ada yang memotongnya. Tugas ini dikerjakan oleh logrotate: sekali sehari (melalui cron atau timer logrotate.timer) ia mengganti nama berkas aktif, memampatkan yang lama, dan menghapus yang paling tua. Pengaturan umum ada di /etc/logrotate.conf, sedangkan aturan per program di /etc/logrotate.d/.
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 myapp adm
postrotate
systemctl reload myapp > /dev/null 2>&1 || true
endscript
}
| Direktif | Arti |
|---|---|
daily / weekly / size 100M | kapan dirotasi |
rotate 14 | berapa banyak berkas lama yang disimpan |
compress, delaycompress | memampatkan dengan gzip, tetapi arsip terbaru tetap tidak dimampatkan |
missingok, notifempty | tidak protes jika berkas tidak ada, tidak merotasi berkas kosong |
create 0640 user group | hak akses untuk berkas baru |
copytruncate |
Pertanyaan umum
Mengapa journalctl hanya menampilkan catatan sejak boot terakhir?
Jurnal disimpan di memori (/run/log/journal). Buat direktori /var/log/journal atau atur Storage=persistent di journald.conf, lalu restart systemd-journald.
Bagaimana cara memberi pengguna biasa akses membaca log sistem tanpa sudo?
Tambahkan pengguna itu ke grup systemd-journal (atau adm di Debian dan Ubuntu): sudo usermod -aG systemd-journal nama, lalu login ulang.
Bisakah melihat jurnal sistem lain, misalnya dari disk yang terpasang?
Bisa, dengan menunjuk direktori jurnalnya memakai flag -D: journalctl -D /mnt/var/log/journal. Flag --file membaca satu berkas .journal tertentu.
Apakah rsyslog masih perlu jika ada journald?
Tidak selalu. Ia berguna jika alat lama membutuhkan berkas teks atau jika log perlu dikirim ke server pusat; pada banyak image minimal ia tidak lagi dipasang.
Bagaimana cara mengekspor log sebuah layanan ke berkas untuk dikirim ke rekan kerja?
Jalankan journalctl -u nama --since today --no-pager > service.log — hasilnya berupa berkas teks biasa.
Topik ini dibahas mendalam dengan praktik di kursus “Linux: с нуля до уверенного администрирования”.
Ke kursus