ABDURROZAK
HOME ABOUT ME MICROSITE KONTAK PERSEMBAHAN HELP
ABDURROZAK.MY.ID // DEBIAN LINUX SERVER

ANALISIS LOGSISTEM

Panduan lengkap dan mendalam membaca, memfilter, dan menafsirkan log sistem Debian. Dari journalctl hingga log aplikasi, lengkap dengan contoh output dan teknik praktis.

TOPIK12
COMMAND100+
CONTOH50+
BACA90 MENIT
ABDUR ROZAK, S.Kom.Web Developer & Network Educator - abdurrozak.my.id
01
LOG ANALYSIS

PENGENALAN LOG SISTEM

Log adalah catatan peristiwa yang dihasilkan sistem operasi, service, dan aplikasi. Di Debian modern, ada dua dunia log yang hidup berdampingan:

  • systemd-journal (binary, terpusat, diakses via journalctl) — default untuk service systemd.
  • Log tekstual klasik di /var/log/ (syslog, auth.log, nginx, dll.) — masih banyak dipakai aplikasi tradisional.

Mengapa log sangat penting?

  • Menjadi bukti pertama saat terjadi error, serangan, atau perilaku aneh.
  • Memungkinkan korelasi waktu antar komponen (nginx ↔ php-fpm ↔ mysql).
  • Dasar untuk monitoring, alerting, dan audit keamanan.
  • Tanpa log, troubleshooting hanya tebak-tebakan.
Prinsip: Jangan langsung restart service saat error. Baca log dulu. Restart sering menghapus konteks penting di memori dan membuat jejak error hilang.
Q
Di mana lokasi log utama di Debian?
LOKASI LOG PENTING
# === systemd journal (binary) === /var/log/journal/ # persistent journal (jika diaktifkan) /run/log/journal/ # journal di RAM (volatile) # === Log tekstual klasik === /var/log/syslog # log sistem umum /var/log/auth.log # autentikasi & otorisasi (SSH, sudo, login) /var/log/kern.log # pesan kernel /var/log/daemon.log # daemon/service /var/log/mail.log # mail server /var/log/nginx/ # access.log + error.log /var/log/apache2/ # access.log + error.log /var/log/mysql/ # error.log, slow query /var/log/postgresql/ # log PostgreSQL /var/log/fail2ban.log # ban/unban IP /var/log/dpkg.log # instalasi/hapus paket /var/log/apt/ # history APT

Tidak semua file selalu ada — tergantung paket yang terinstal dan konfigurasi rsyslog/syslog-ng.

02
LOG ANALYSIS

JOURNALCTL — ALAT UTAMA SYSTEMD

journalctl adalah cara modern membaca log di Debian. Semua output service systemd, kernel, dan banyak aplikasi masuk ke journal.

Q
Command journalctl dasar yang wajib dikuasai
JOURNALCTL DASAR
journalctl # Tampilkan seluruh journal (bisa sangat panjang) journalctl -xe # -x = penjelasan tambahan, -e = lompat ke akhir (error terbaru) journalctl -f # Follow mode — seperti tail -f, real-time journalctl -n 50 # 50 baris terakhir saja journalctl -b # Hanya log sejak boot saat ini journalctl -b -1 # Log dari boot sebelumnya (berguna setelah crash/reboot) journalctl --list-boots # Daftar boot ID yang tersimpan IDX BOOT ID FIRST ENTRY LAST ENTRY -1 a1b2c3d4... Mon 2026-03-10 08:00:01 Mon 2026-03-10 22:15:33 0 e5f6a7b8... Tue 2026-03-11 07:30:00 Tue 2026-03-11 15:00:00

Penjelasan flag penting:

  • -b / --boot — Membatasi ke satu siklus boot. Sangat berguna agar tidak tercampur log boot lama.
  • -f / --follow — Streaming log baru. Tekan Ctrl+C untuk berhenti.
  • -e — Langsung ke akhir (pesan terbaru).
  • -x — Menambahkan penjelasan dari message catalog systemd (membantu memahami error).
Q
Filter berdasarkan service (unit)
FILTER PER SERVICE
journalctl -u nginx # Semua log unit nginx.service journalctl -u nginx -u php8.2-fpm # Gabungan beberapa unit sekaligus journalctl -u ssh -f # Ikuti log SSH secara live journalctl -u nginx --since '1 hour ago' journalctl -u mariadb --since '2026-03-11 10:00:00' --until '2026-03-11 12:00:00' journalctl -u nginx -p err # Hanya prioritas error ke atas untuk unit nginx

Tips: Nama unit bisa tanpa akhiran .service. Jika ragu, cek dulu dengan systemctl list-units --type=service.

Q
Filter berdasarkan prioritas (severity)

Journal memakai tingkat prioritas syslog:

  • 0 emerg — sistem tidak bisa dipakai
  • 1 alert — harus segera ditangani
  • 2 crit — kondisi kritis
  • 3 err — error
  • 4 warning — peringatan
  • 5 notice — normal tapi penting
  • 6 info — informasi
  • 7 debug — debug
FILTER PRIORITAS
journalctl -p err # err, crit, alert, emerg (prioritas 0-3) journalctl -p warning # warning ke atas (0-4) journalctl -p err -b # Hanya error sejak boot terakhir — sangat berguna saat diagnosa Mar 11 10:22:15 server nginx[1235]: [error] 1235#1235: *42 connect() failed (111: Connection refused) Mar 11 10:25:01 server sshd[2001]: error: kex_exchange_identification: Connection closed by remote host
Q
Filter waktu yang fleksibel
FILTER WAKTU
journalctl --since today journalctl --since yesterday journalctl --since '2 hours ago' journalctl --since '2026-03-11' journalctl --since '2026-03-11 09:00:00' --until '2026-03-11 11:30:00' journalctl --since '10:00' --until '11:00' # Tanpa tanggal = hari ini
Q
Output format lain (json, verbose, short)
FORMAT OUTPUT
journalctl -u nginx -o short-precise # Timestamp lebih presisi journalctl -u nginx -o verbose # Semua field metadata journalctl -u nginx -o json-pretty | head -50 # JSON — cocok untuk parsing/script journalctl -u nginx -o cat # Hanya pesan, tanpa timestamp/metadata
03
LOG ANALYSIS

LOG TRADISIONAL DI /var/log

Meski journal mendominasi, banyak aplikasi dan rsyslog masih menulis file teks di /var/log.

Q
Cara membaca log tekstual
BACA LOG TEKS
sudo tail -50 /var/log/syslog sudo tail -f /var/log/syslog # Follow real-time sudo less /var/log/auth.log # Navigasi: /cari n=next q=quit sudo head -30 /var/log/kern.log sudo cat /var/log/dpkg.log
Q
Log autentikasi (auth.log) — sangat penting untuk security
AUTH.LOG
sudo tail -30 /var/log/auth.log Mar 11 10:15:01 server sshd[2100]: Accepted publickey for admin from 192.168.1.50 port 54321 Mar 11 10:20:33 server sshd[2105]: Failed password for root from 203.0.113.10 port 22 Mar 11 10:20:35 server sshd[2105]: Failed password for root from 203.0.113.10 port 22 Mar 11 10:21:01 server sudo: admin : TTY=pts/0 ; PWD=/home/admin ; USER=root ; COMMAND=/bin/systemctl restart nginx sudo grep "Failed password" /var/log/auth.log | tail -20 sudo grep "Accepted" /var/log/auth.log | tail -10 sudo grep sudo /var/log/auth.log | tail -15

Yang perlu diwaspadai:

  • Banyak Failed password dari IP yang sama → brute force (aktifkan Fail2ban).
  • Accepted password for root → root login dengan password (sebaiknya dimatikan).
  • Perintah sudo yang tidak Anda kenali → indikasi kompromi akun.
Q
Log kernel (dmesg & kern.log)
KERNEL LOG
dmesg dmesg -T # -T = human-readable timestamp dmesg -l err,warn # Hanya error dan warning sudo tail -50 /var/log/kern.log journalctl -k -p err -b # Kernel errors sejak boot via journal

Berguna untuk: hardware error, OOM killer, driver issue, disk I/O error, USB disconnect, dll.

04
LOG ANALYSIS

TEKNIK FILTER & PENCARIAN

Q
grep — senjata utama mencari pola
GREP POWER
sudo grep -i error /var/log/syslog | tail -30 # -i = ignore case sudo grep -n -i 'failed\|error\|fatal' /var/log/nginx/error.log # -n = nomor baris, \\|=OR sudo grep -c 'Failed password' /var/log/auth.log # -c = hitung jumlah kemunculan sudo grep -r 'Out of memory' /var/log/ 2>/dev/null # -r = recursive di seluruh /var/log sudo grep -E '5[0-9]{2}' /var/log/nginx/access.log | tail -20 # Cari HTTP status 5xx sudo zgrep -i error /var/log/syslog.*.gz # Cari di dalam log yang sudah di-compress
Q
awk & sed untuk ekstraksi kolom
AWK / SED
sudo awk '{print $1,$2,$3,$5}' /var/log/auth.log | tail -10 # Ambil kolom tanggal + program sudo awk '/Failed password/ {print $11}' /var/log/auth.log | sort | uniq -c | sort -nr | head # IP yang paling sering gagal login 47 203.0.113.45 12 198.51.100.22 3 192.0.2.10 sudo sed -n '100,150p' /var/log/syslog # Tampilkan baris 100-150
Q
Membatasi output agar tidak kebanjiran
BATASI OUTPUT
journalctl -u nginx -n 100 sudo tail -100 /var/log/syslog sudo tail -n +500 /var/log/syslog | head -50 # Mulai dari baris 500, ambil 50 baris journalctl -u nginx --since '10 min ago' | wc -l # Hitung berapa baris dalam 10 menit terakhir
05
LOG ANALYSIS

LOG PER SERVICE (SPESIFIK)

Q
Nginx / Apache
WEB SERVER LOG
sudo tail -f /var/log/nginx/error.log sudo tail -f /var/log/nginx/access.log sudo tail -f /var/log/apache2/error.log sudo tail -f /var/log/apache2/access.log sudo grep -i 'error\|crit\|alert' /var/log/nginx/error.log | tail -20 sudo awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head # Distribusi status code HTTP 15230 200 890 304 120 404 45 502 12 500 journalctl -u nginx -f journalctl -u apache2 -f
Q
MariaDB / MySQL / PostgreSQL
DATABASE LOG
sudo tail -50 /var/log/mysql/error.log sudo tail -f /var/log/mysql/error.log sudo tail -50 /var/log/postgresql/postgresql-*-main.log journalctl -u mariadb -xe --no-pager | tail -40 journalctl -u postgresql -xe --no-pager | tail -40 # Slow query (jika diaktifkan) sudo tail -30 /var/log/mysql/mariadb-slow.log
Q
SSH & Fail2ban
SSH & FAIL2BAN
journalctl -u ssh -f sudo tail -f /var/log/auth.log sudo fail2ban-client status sudo fail2ban-client status sshd Status for the jail: sshd |- Currently failed: 3 |- Total failed: 128 |- Currently banned: 2 `- Banned IP list: 203.0.113.45 198.51.100.10 sudo tail -30 /var/log/fail2ban.log
Q
systemd service apa pun
SERVICE APA PUN
systemctl list-units --type=service --state=running journalctl -u NAMA_SERVICE -f journalctl -u NAMA_SERVICE -p err -b journalctl -u NAMA_SERVICE --since '1 hour ago'
06
LOG ANALYSIS

CARA MEMBACA & MENAFSIRKAN ERROR

Error di log biasanya punya pola. Belajar mengenali pola mempercepat diagnosa.

Q
Anatomi baris log yang khas
CONTOH BARIS LOG
Mar 11 10:22:15 server nginx[1235]: [error] 1235#1235: *42 connect() failed (111: Connection refused) while connecting to upstream, client: 192.168.1.50, server: example.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/run/php/php8.2-fpm.sock:"

Bedah bagian-bagiannya:

  • Mar 11 10:22:15 — Timestamp (kapan terjadi).
  • server — Hostname.
  • nginx[1235] — Program + PID.
  • [error] — Tingkat keparahan.
  • connect() failed (111: Connection refused) — Pesan error inti + errno.
  • upstream: fastcgi://unix:/run/php/... — Ke mana Nginx mencoba konek (PHP-FPM socket).

Kesimpulan dari baris ini: Nginx hidup, tapi PHP-FPM tidak listening di socket tersebut → restart/cek php-fpm.

Q
Errno Linux yang sering muncul di log
  • 111 Connection refused — Tidak ada proses listening di target (port/socket).
  • 2 No such file or directory — Path file/socket/directory salah atau belum dibuat.
  • 13 Permission denied — User proses tidak punya izin.
  • 98 Address already in use — Port sudah dipakai proses lain.
  • 110 Connection timed out — Target tidak merespons dalam waktu yang ditentukan.
  • 28 No space left on device — Disk penuh.
  • 12 Cannot allocate memory / OOM — Kehabisan memori.
Q
Korelasi antar log (teknik advanced)

Error jarang berdiri sendiri. Contoh alur 502 Bad Gateway:

  1. User dapat 502 → cek nginx/error.log → "Connection refused" ke PHP-FPM socket.
  2. Cek systemctl status php8.2-fpm → failed / inactive.
  3. Cek journalctl -u php8.2-fpm -xe → misal "Permission denied" atau config error.
  4. Perbaiki root cause, restart php-fpm, verifikasi nginx error hilang.

Selalu samakan timestamp antar log agar cerita lengkapnya terlihat.

07
LOG ANALYSIS

LOG ROTATION (logrotate)

Tanpa rotasi, log akan tumbuh tanpa batas dan memenuhi disk. Debian memakai logrotate.

Q
Cara kerja logrotate
  • Dijalankan harian via cron (/etc/cron.daily/logrotate).
  • Konfigurasi global: /etc/logrotate.conf
  • Konfigurasi per aplikasi: /etc/logrotate.d/*
CEK & UJI LOGROTATE
cat /etc/logrotate.conf ls /etc/logrotate.d/ cat /etc/logrotate.d/nginx /var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty create 0640 www-data adm sharedscripts postrotate [ -s /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid) endscript } sudo logrotate -d /etc/logrotate.d/nginx # -d = dry-run, tampilkan apa yang akan dilakukan tanpa eksekusi sudo logrotate -f /etc/logrotate.d/nginx # -f = force rotasi sekarang

Arti opsi penting:

  • daily/weekly/monthly — frekuensi rotasi.
  • rotate 14 — simpan 14 arsip lama.
  • compress — gzip file lama.
  • delaycompress — kompres mulai arsip kedua (agar masih bisa di-tail).
  • postrotate — perintah setelah rotasi (signal nginx agar buka file log baru).
Q
Mengatur journal agar tidak memenuhi disk
BATASI JOURNAL
journalctl --disk-usage Archived and active journals take up 256.0M in the file system. sudo journalctl --vacuum-time=7d # Hapus journal lebih tua dari 7 hari sudo journalctl --vacuum-size=200M # Batasi total ukuran journal ke 200MB sudo nano /etc/systemd/journald.conf # SystemMaxUse=200M # MaxRetentionSec=7day # Setelah edit: sudo systemctl restart systemd-journald
08
LOG ANALYSIS

MONITORING LOG REAL-TIME

Q
Follow beberapa log sekaligus
MULTI FOLLOW
sudo tail -f /var/log/nginx/error.log /var/log/nginx/access.log journalctl -u nginx -u php8.2-fpm -f # Dengan multitail (install dulu) sudo apt install multitail sudo multitail /var/log/nginx/error.log /var/log/auth.log
Q
Filter live dengan grep
LIVE FILTER
sudo tail -f /var/log/auth.log | grep --line-buffered 'Failed password' journalctl -f -u ssh | grep -i fail sudo tail -f /var/log/nginx/access.log | grep --line-buffered ' 5[0-9][0-9] ' # Hanya tampilkan request yang dapat status 5xx

--line-buffered penting agar grep langsung mengeluarkan baris (tanpa menunggu buffer penuh).

09
LOG ANALYSIS

KEAMANAN: MEMBACA LOG UNTUK DETEKSI ANCAMAN

Q
Pola serangan yang sering muncul di log
DETEKSI SERANGAN
# === Brute force SSH === sudo grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head -15 # === Login berhasil (audit) === sudo grep "Accepted" /var/log/auth.log | tail -20 # === Perintah sudo === sudo grep sudo /var/log/auth.log | grep COMMAND | tail -20 # === Scan vulnerability di access log === sudo grep -E 'wp-login|xmlrpc|\.env|phpmyadmin' /var/log/nginx/access.log | tail -20 # === User agent mencurigakan === sudo awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -15
Q
Integrasi dengan Fail2ban

Fail2ban membaca log (auth.log, nginx error, dll.), mendeteksi pola gagal berulang, lalu mem-ban IP via firewall.

FAIL2BAN & LOG
sudo fail2ban-client status sshd sudo tail -f /var/log/fail2ban.log sudo zgrep Ban /var/log/fail2ban.log*
10
LOG ANALYSIS

TOOLS LANJUTAN UNTUK ANALISIS LOG

Q
Tools yang sangat membantu
  • jq — parsing output JSON journalctl.
  • lnav — log viewer interaktif berwarna, support banyak format.
  • goaccess — analisis access log web secara visual di terminal/HTML.
  • multitail — follow banyak file sekaligus dengan filter.
  • logwatch — ringkasan harian log via email.
  • aide / tripwire — deteksi perubahan file (bukan log murni, tapi terkait audit).
INSTALL TOOLS
sudo apt install jq lnav multitail goaccess logwatch journalctl -u nginx -o json-pretty | jq -r '.MESSAGE' | tail -20 sudo lnav /var/log/syslog /var/log/auth.log sudo goaccess /var/log/nginx/access.log -o /tmp/report.html --log-format=COMBINED # Lalu buka /tmp/report.html di browser
Q
Centralized logging (overview)

Untuk banyak server, log sebaiknya dikirim ke satu tempat:

  • rsyslog / syslog-ng → forward ke server log pusat.
  • Promtail + Loki + Grafana — stack modern, cocok dengan Prometheus.
  • Filebeat / Fluentd / Vector → Elasticsearch / OpenSearch.
  • Graylog — all-in-one log management.

Di level single server, journalctl + file di /var/log sudah sangat cukup.

11
LOG ANALYSIS

BEST PRACTICE ANALISIS LOG

  • Jangan panik — kumpulkan log dulu sebelum mengubah apa pun.
  • Batasi rentang waktu — gunakan --since agar fokus.
  • Samakan timestamp — korelasikan antar service.
  • Cari pola berulang — error yang sama setiap detik biasanya root cause.
  • Simpan cuplikan log penting ke file saat insiden (journalctl ... > /tmp/incident.log).
  • Aktifkan persistent journal jika ingin log bertahan setelah reboot: buat /var/log/journal/ lalu restart systemd-journald.
  • Rotasi & batasi ukuran — cegah log memenuhi disk.
  • Monitor auth.log secara rutin atau otomatiskan dengan Fail2ban + notifikasi.
  • Jangan biarkan log mengandung secret (password, API key) — review konfigurasi aplikasi.
Persistent journal:
ENABLE PERSISTENT JOURNAL
sudo mkdir -p /var/log/journal sudo systemd-tmpfiles --create --prefix /var/log/journal sudo systemctl restart systemd-journald journalctl --disk-usage
12
LOG ANALYSIS

CHEAT SHEET CEPAT

CHEAT SHEET LOG
# === JOURNALCTL === journalctl -xe # error terbaru + penjelasan journalctl -f # follow semua journalctl -u SERVICE -f # follow 1 service journalctl -p err -b # error sejak boot journalctl -u SERVICE --since '1h ago' journalctl -b -1 # boot sebelumnya journalctl --disk-usage journalctl --vacuum-time=7d # === FILE LOG === sudo tail -f /var/log/syslog sudo tail -f /var/log/auth.log sudo less +G /var/log/nginx/error.log sudo grep -i error /var/log/syslog | tail -30 # === SECURITY === sudo grep "Failed password" /var/log/auth.log | tail -20 sudo grep sudo /var/log/auth.log | tail -15 sudo fail2ban-client status sshd # === KERNEL / OOM === dmesg -T | grep -i error journalctl -k -p err -b sudo dmesg | grep -i 'out of memory' # === WEB === sudo tail -f /var/log/nginx/error.log sudo awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
Ingat: Log adalah sahabat terbaik administrator. Semakin terbiasa membacanya, semakin cepat Anda menemukan akar masalah — dan semakin jarang Anda perlu "restart dulu saja".
ABDURROZAK.MY.ID // TERHUBUNG

JARINGAN SOSIAL

Temukan saya di berbagai platform digital