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/journalbelum 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 1ataumaxsizekecil 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:
- Kapan. Tentukan jendela waktu:
--sincedan--until. - Siapa. Persempit ke unit, PID, atau nama program:
-u,_PID=,-t. - Seberapa parah. Saring level:
-p warninghanya menampilkan warning ke atas. - Apa isinya. Baru cari kata kunci dengan
-gatau--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.
- 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.
- 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.
- 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".
- 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.
- 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".
- 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.
- 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.
- 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 sepertitail -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 777file log. Default Debian sudah benar:0640dengan pemiliksyslogdan grupadm. - Anggota grup
admdansystemd-journalbisa 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 -ddulu, 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
- Linux : Membuat Service Sendiri dengan systemd β asal-usul unit yang log-nya kamu baca.
- Linux : Praktikum Membuat Service systemd dan Diagnosa Kegagalan Start β membaca kegagalan start dengan bukti berlapis.
- Linux : Cara Membaca Penyebab Service Gagal Start dengan systemctl status dan journalctl β versi ringkas untuk satu layanan.
- Linux : Disk, Partisi, dan Filesystem (Mount dan fstab) β kenapa disk penuh membuat log berhenti tumbuh.
- Linux : Praktikum Mount, fsck, dan Perluasan Filesystem β membuktikan kapasitas filesystem sebelum menyalahkan aplikasi.
- Linux : Manajemen User, Group, dan sudo β siapa yang boleh membaca journal orang lain.
- Linux : Cek Penggunaan Disk β memantau ruang yang dipakai log.
π Referensi
journalctl(1)β manpages.debian.orgjournald.conf(5)β manpages.debian.orgsystemd-journald.service(8)β manpages.debian.orgsystemd.journal-fields(7)β manpages.debian.orglogrotate(8)β manpages.debian.orglogger(1)β manpages.debian.orgsyslog(3)β man7.orgsystemd.time(7)β manpages.debian.org