Linux : Log dan journalctl untuk Troubleshooting

Revision as of 07:02, 6 November 2026 by Maintenance script (talk | contribs) (Protected "Linux : Log dan journalctl untuk Troubleshooting": Proteksi editorial: edit/move sysop ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)))
(diff) ← Older revision | Latest revision (diff) | Newer revision β†’ (diff)

Log itu rekaman kejadian, bukan hiasan terminal. Masalahnya, satu kejadian sering ditulis di beberapa tempat sekaligus, dan sebagian catatan bisa hilang sebelum kamu sempat membacanya.

🎯 Tujuan

Setelah membaca dan mempraktikkan artikel ini, kamu bisa:

  • menjelaskan dari mana log Linux datang dan ke mana perginya
  • membedakan journal sementara (di RAM) dan journal permanen (di disk)
  • membaca log dengan filter waktu, unit, dan tingkat kepentingan
  • menemukan tanda bahwa log justru sedang dibuang sistem
  • menyiapkan rotasi log supaya disk tidak penuh sendiri

Hasil akhir: kamu punya satu kebiasaan baru β€” sebelum mengubah konfigurasi apa pun, susun dulu kronologi kejadian dari log.

πŸ“ Konteks nyata

Bayangkan pos satpam sekolah. Setiap tamu datang, satpam mencatat: jam berapa, siapa, keperluan apa. Kalau suatu hari ada barang hilang, buku itu yang dibuka pertama kali β€” bukan kamera, bukan dugaan.

Log Linux bekerja seperti buku itu. Sayangnya sekolah kita punya beberapa buku sekaligus: satu di meja satpam (kernel), satu di ruang TU (journald), satu lagi salinan di lemari arsip (rsyslog). Kalau kamu hanya membuka satu buku, kesimpulanmu bisa salah.

πŸ”₯ Kasus nyata: sebuah SMK kehilangan data nilai karena server CBT restart sendiri di tengah ujian. Panitia membuka /var/log/syslog dan menemukan file itu kosong sejak boot terakhir. Selama dua hari mereka menuduh PLN dan mengganti PSU. Penyebab sebenarnya: journal hanya disimpan di RAM, jadi restart menghapus seluruh riwayat sebelum mati. Tidak ada bukti, tidak ada tersangka β€” hanya kecurigaan.

🧠 Konsep singkat

πŸ”Ή Empat lapis catatan

Pesan log tidak langsung ditulis ke satu file. Ia melewati beberapa lapis, dan tiap lapis punya cara sendiri menyimpan atau membuang.

Lapis Isi Tempat Hilang kalau
Kernel ring buffer pesan kernel, driver, disk, OOM RAM (dibaca dmesg) reboot
systemd-journald semua pesan terstruktur + metadata /run/log/journal atau /var/log/journal reboot (jika volatile)
rsyslog salinan teks untuk dibaca manusia /var/log/syslog, /var/log/auth.log rotasi
logrotate pemutar dan pemampat file teks *.log.1.gz kebijakan retensi

Jadi journald dan rsyslog bukan saingan. Journald menyimpan cepat dan terstruktur; rsyslog menyalin ke teks yang mudah dibaca dan dikirim ke server lain.

πŸ”Ή Empat lubang kehilangan log

Hampir semua kasus "lognya tidak ada" masuk ke salah satu dari empat lubang ini.

  • Volatile. Journal hanya di RAM karena direktori /var/log/journal belum ada. Reboot = riwayat hilang.
  • Rate limit. Journald membuang pesan kalau satu layanan terlalu banyak bicara. Aplikasi yang error berjuta kali justru pesannya dibuang.
  • Rotasi terlalu rajin. rotate 1 atau maxsize kecil membuat bukti kemarin sudah terhapus hari ini.
  • Jam salah. Server dengan zona waktu atau RTC keliru menulis kejadian di jam yang tidak kamu cari.

πŸ“Š Angka penting: journald membatasi 10.000 pesan per 30 detik untuk tiap layanan. Lewat dari itu, pesan dibuang dan hanya muncul satu baris pemberitahuan.

πŸ”Ή Kenapa journal sering hilang setelah reboot

Di Debian, journald memakai Storage=auto. Artinya: permanen kalau direktori /var/log/journal ada, sementara kalau tidak ada. Banyak instalasi minim memang tidak membuat direktori itu.

Karena itu Debian juga memasang rsyslog. File /var/log/syslog dan /var/log/auth.log tetap ada β€” tapi isinya teks biasa, tanpa metadata unit dan tanpa ID boot.

πŸ“Š Angka penting: batas ukuran journal default 10% dari kapasitas filesystem, dipotong maksimal 4 GB. Ruang yang disisakan untuk sistem 15%. Satu file journal maksimal 1/8 dari batas itu, dipotong 128 MB.

πŸ”Ή Membaca log seperti menyusun kronologi

Jangan langsung grep seluruh isi. Urutannya begini:

  1. Kapan. Tentukan jendela waktu: --since dan --until.
  2. Siapa. Persempit ke unit, PID, atau nama program: -u, _PID=, -t.
  3. Seberapa parah. Saring level: -p warning hanya menampilkan warning ke atas.
  4. Apa isinya. Baru cari kata kunci dengan -g atau --grep.

Empat langkah ini mengubah lautan teks menjadi beberapa baris yang bisa kamu tunjuk saat rapat.

🧩 Istilah penting

Istilah Arti awam Contoh
Unit satu pekerjaan yang dikelola systemd ssh.service
Priority tingkat kepentingan pesan, 0 paling gawat err = 3
Boot ID nomor unik satu sesi hidup sistem journalctl -b -1
Cursor penanda posisi di dalam journal dipakai untuk lanjut membaca
Structured field metadata yang menempel pada pesan _PID, _UID
Vacuum membersihkan journal lama agar disk lega --vacuum-size=100M
Rotasi memindahkan log lama, membuat file baru app.log.1.gz
Rate limit pembatas jumlah pesan per waktu 10.000 per 30 detik

Tingkat kepentingan (priority) perlu dihafal karena sering dipakai menyaring:

Level Angka Kapan dipakai
emerg 0 sistem tidak bisa dipakai
alert 1 tindakan segera
crit 2 kegagalan kritis
err 3 operasi gagal
warning 4 ada yang tidak beres
notice 5 kejadian normal yang penting
info 6 catatan biasa
debug 7 detail untuk pengembang

πŸ’‘ Tips: -p warning berarti "warning dan semua yang lebih gawat" (0 sampai 4). Kalau ingin rentang tertentu, tulis -p 3..4.

πŸ”§ Praktik: menyiapkan log yang bisa dipercaya

Praktik ini aman dijalankan di VM Debian. Semua uji memakai logger dan satu file contoh, tidak menyentuh layanan produksi.

  1. Potret awal. Catat kondisi journal sebelum diubah.
journalctl --disk-usage
ls -ld /var/log/journal
grep -vE '^\s*#|^\s*$' /etc/systemd/journald.conf
journalctl --list-boots --no-pager

Kalau /var/log/journal tidak ada, journal-mu volatile. Kalau --list-boots hanya menampilkan satu baris (0), riwayat tidak bertahan melewati reboot.

  1. Buat penanda waktu. Setiap praktik dimulai dengan penanda supaya kamu tahu batas pencariannya.
logger -t lab-log -p user.info "mulai praktik $(date -Is)"
journalctl -t lab-log -o short-iso --no-pager

-t mengisi SYSLOG_IDENTIFIER, -p user.info menentukan facility dan level. Nama lab-log inilah yang nanti dipakai menyaring.

  1. Uji tingkat kepentingan. Kirim lima level, lalu saring.
for p in debug info notice warning err; do logger -t lab-log -p user.$p "contoh level $p"; done
journalctl -t lab-log -p warning --no-pager
journalctl -t lab-log -p 3..4 --no-pager

Perintah pertama menampilkan warning dan err saja. Perintah kedua menampilkan rentang err sampai warning. Bandingkan hasilnya β€” inilah beda "satu level" dan "rentang".

  1. Jadikan journal permanen. Ini langkah yang mencegah kasus SMK tadi terulang.
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo mkdir -p /etc/systemd/journald.conf.d
sudo tee /etc/systemd/journald.conf.d/10-lab.conf >/dev/null <<'EOF'
[Journal]
Storage=persistent
SystemMaxUse=200M
EOF
sudo systemctl restart systemd-journald
journalctl --flush
journalctl --disk-usage

systemd-tmpfiles dipakai supaya pemilik dan ACL direktori benar (grup systemd-journal). --flush memindahkan isi RAM ke disk saat itu juga.

⚠️ Hati-hati: jangan menyalin 10-lab.conf ke server produksi tanpa tahu kapasitas disk. SystemMaxUse=200M wajar untuk VM belajar, tetapi server dengan audit panjang butuh angka lain.

  1. Bongkar lubang rate limit. Kirim pesan jauh lebih banyak dari batas, lalu hitung yang selamat.
for i in $(seq 1 12000); do logger -t lab-banjir "pesan $i"; done
journalctl -t lab-banjir --since "-10 min" --no-pager | wc -l
journalctl -b --no-pager | grep -i "suppress" | tail -3

Jumlah yang tercatat akan jauh di bawah 12.000, dan akan muncul pemberitahuan berapa pesan yang dibuang. Inilah bukti bahwa "log tidak mencatat error" belum tentu berarti "tidak ada error".

  1. Baca log secara terstruktur. Journal menyimpan metadata, bukan hanya teks.
journalctl -u ssh -o json-pretty -n 1 --no-pager
journalctl -F _COMM | head -20
journalctl _PID=1 -n 3 --no-pager
journalctl -g "gagal|error" -b -n 20 --no-pager

-F menampilkan semua nilai yang pernah muncul pada satu field. Ini cara cepat tahu nama program apa saja yang menulis log.

  1. Siapkan rotasi file teks. Journal punya batas sendiri, file teks tidak.
sudo mkdir -p /var/log/lab-app
sudo sh -c 'for i in $(seq 1 2000); do echo "baris $i $(date -Is)"; done > /var/log/lab-app/app.log'
sudo tee /etc/logrotate.d/lab-app >/dev/null <<'EOF'
/var/log/lab-app/app.log {
    daily
    rotate 3
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root adm
}
EOF
sudo logrotate -d /etc/logrotate.d/lab-app
sudo logrotate -f /etc/logrotate.d/lab-app
ls -l /var/log/lab-app/
zgrep -c . /var/log/lab-app/app.log.1.gz

-d adalah mode debug: logrotate menampilkan rencananya tanpa mengubah file. -f memaksa rotasi sekarang, berguna untuk uji tanpa menunggu timer harian.

  1. Rumah tangga. Setelah yakin, rapikan ukuran dan periksa integritas.
journalctl --vacuum-size=100M
journalctl --verify
systemctl list-timers logrotate.timer

--vacuum-size hanya menghapus file journal yang sudah diarsipkan. File yang sedang aktif ditulis tidak disentuh, jadi angka akhir bisa sedikit di atas target.

πŸ”Ή Perintah harian yang cukup dihafal

  • journalctl -b -1 β€” lihat sesi boot sebelum yang sekarang, kunci utama saat server baru restart.
  • journalctl -u nginx --since today β€” hanya satu layanan, hanya hari ini.
  • journalctl -p err -b β€” semua error pada boot ini.
  • journalctl -f -u ssh β€” ikuti log langsung seperti tail -f.
  • zgrep "kata" /var/log/syslog.*.gz β€” cari di file lama yang sudah dipadatkan.

πŸ§ͺ Uji cepat: jalankan logger -t cek -p user.err "uji" lalu journalctl -t cek -p err. Kalau pesan muncul, jalur tulis dan filter prioritasmu bekerja.

🏭 Dipakai di dunia kerja

  • Sekolah/lab komputer: server CBT restart saat ujian. Dengan journal permanen, kamu bisa membuktikan apakah proses ujian mati karena kehabisan memori atau karena dimatikan manual.
  • Kantor administrasi: aplikasi internal "kadang gagal" tanpa pola. Log terstruktur menunjukkan kegagalan selalu terjadi pada menit yang sama, saat backup berjalan dan disk penuh.
  • ISP dan NOC: ribuan perangkat mengirim log ke satu syslog server. Tanpa rate limit dan rotasi yang benar, server log sendiri yang tumbang lebih dulu.
  • Rumah sakit dan keuangan: jejak akses harus bisa ditunjukkan berbulan-bulan kemudian. Retensi log adalah syarat audit, bukan sekadar kerapian.
  • Industri: PLC dan HMI mencatat alarm ke log lokal. Saat lini produksi berhenti, urutan alarm menentukan apakah penyebabnya sensor atau operator.
  • Cloud dan container: setiap container menulis ke journal atau stdout, lalu dikumpulkan ke sistem terpusat. Tanpa itu, container yang sudah dihapus membawa bukti hilang bersamanya.

βœ… Verifikasi

Yang diperiksa Perintah Bukti benar
Riwayat boot tersimpan journalctl --list-boots lebih dari satu baris
Penanda praktik terbaca journalctl -t lab-log -o short-iso jam format ISO
Filter level bekerja journalctl -p warning -b -n 5 tidak ada baris info
Journal permanen ls /var/log/journal ada file .journal
Batas ukuran aktif journalctl --disk-usage tidak jauh di atas 200 MB
Rotasi berjalan ls /var/log/lab-app/ ada .1.gz
Timer rotasi hidup systemctl list-timers logrotate.timer kolom NEXT terisi
File journal utuh journalctl --verify berakhir PASS

⚠️ Kesalahan umum & troubleshooting

Gejala Penyebab Perbaikan
Hanya satu boot terlihat journal volatile buat /var/log/journal, set Storage=persistent
No journal files were found user tidak di grup pembaca pakai sudo atau tambah ke grup adm
Error aplikasi tidak tercatat pesan dibuang rate limit cari kata Suppressed, naikkan RateLimitBurst
Aplikasi tetap menulis ke file lama file dipindah, proses masih pegang pakai copytruncate atau kirim HUP di postrotate
.gz hasil rotasi kosong delaycompress menunda kompresi normal, tunggu siklus berikutnya
stat of ... failed path salah ketik perbaiki path atau tambahkan missingok
--since tidak menemukan kejadian jam atau zona waktu keliru cek timedatectl, tulis waktu lengkap
--vacuum-size kurang menyusut hanya file arsip dihapus jalankan --rotate lalu vacuum
/var/log penuh log tanpa batas SystemMaxUse, logrotate, vacuum
Pesan terpotong di terminal pager memotong baris panjang geser panah kiri/kanan atau pakai --no-pager

⚠️ Hati-hati: pesan "Suppressed 8.231 messages from lab-banjir" bukan peringatan kosong. Selama jendela waktu itu, kejadian penting bisa ikut terbuang bersama pesan berulang.

πŸ”₯ Kasus nyata: sebuah warnet menyimpulkan "tidak ada error" karena file log aplikasi kasir bersih. Kenyataannya aplikasi menulis puluhan ribu baris per menit saat gagal koneksi, dan journald membuang hampir semuanya. Setelah RateLimitBurst dinaikkan sementara dan pesan dikelompokkan, terlihat kegagalan selalu terjadi saat modem berpindah IP.

πŸ”₯ Kasus nyata: teknisi magang memutar log aplikasi dengan memindahkan file, tetapi aplikasi tetap menulis ke file lama yang sudah tidak terlihat di direktori. Selama tiga hari tidak ada log baru, dan tim menyangka aplikasi berhenti mencatat. Solusinya satu baris: copytruncate.

πŸ” Catatan keamanan & etika

  • Log memuat alamat IP, email, nama file, dan kadang token di dalam URL. Perlakukan sebagai data pribadi, bukan bahan obrolan grup.
  • Jangan pernah chmod 777 file log. Default Debian sudah benar: 0640 dengan pemilik syslog dan grup adm.
  • Anggota grup adm dan systemd-journal bisa membaca seluruh journal. Beri hanya kepada yang memang bertugas.
  • Root bisa menghapus atau mengubah journal. Kalau butuh bukti yang tahan diubah, aktifkan sealed journal dan simpan salinan ke mesin lain.
  • Saat meminta bantuan, kirim potongan log yang relevan saja. Log mentah sering memuat hash password, kunci API, dan data siswa.
  • Retensi itu keputusan, bukan bawaan. Simpan cukup lama untuk kebutuhan audit, lalu hapus dengan sadar.
  • Membaca log milik pengguna atau guru lain hanya untuk tugas yang sah. Rasa ingin tahu bukan alasan.
  • Uji rotasi dan vacuum di VM. Di server produksi, jalankan logrotate -d dulu, jangan langsung -f.

πŸ“Œ Kesimpulan

Log bukan satu file, tapi rantai: kernel mencatat, journald menyusun, rsyslog menyalin, logrotate membatasi. Rantai itu putus di titik terlemahnya β€” biasanya journal yang masih volatile, atau rate limit yang membuang justru pesan paling penting.

Kebiasaan yang layak dibawa ke dunia kerja: tentukan jendela waktu, persempit ke unit, saring level, baru cari kata kunci. Sesudah itu, pastikan buktinya memang tersimpan sebelum kamu butuh.

Langkah berikutnya: buka journalctl --list-boots di VM-mu. Kalau hanya ada satu baris, jadikan journal permanen hari ini β€” sebelum ada masalah yang perlu dijelaskan.

πŸ”— Materi terkait

πŸ“š Referensi