Skip to main content

Log hệ thống


Cấu trúc Logging trong Linux


Các file log quan trọng

FileNội dungDistro
/var/log/syslogLog tổng hợp hệ thốngDebian/Ubuntu
/var/log/messagesLog tổng hợp hệ thốngRHEL/CentOS
/var/log/auth.logSSH, sudo, loginDebian/Ubuntu
/var/log/secureSSH, sudo, loginRHEL/CentOS
/var/log/kern.logKernel messagesDebian
/var/log/dmesgBoot + hardware messagesTất cả
/var/log/apt/history.logLịch sử cài đặt packageDebian/Ubuntu
/var/log/cronCron job executionRHEL/CentOS
/var/log/nginx/access.logHTTP request logs
/var/log/nginx/error.logNginx errors

Đọc log cơ bản

# Xem log real-time
tail -f /var/log/syslog # follow real-time
tail -f /var/log/nginx/access.log # HTTP access log
tail -F /var/log/app.log # follow kể cả khi file bị rotate

# Xem cuối file
tail -n 200 /var/log/auth.log # 200 dòng cuối
tail -n 500 /var/log/syslog | less # scroll qua less

# Tìm trong log
grep "Failed password" /var/log/auth.log # login SSH thất bại
grep -i "error" /var/log/nginx/error.log # nginx errors
grep -E "error|warn|fatal" /var/log/app.log # OR nhiều pattern
grep -n "FATAL" /var/log/app.log # với số dòng
grep -A 5 -B 5 "FATAL" /var/log/app.log # 5 dòng trước/sau match

# Lọc theo thời gian (nếu log có timestamp)
grep "Jan 15 10:" /var/log/syslog # giờ 10h ngày 15 tháng 1

dmesg — Kernel Ring Buffer

dmesg                           # tất cả kernel message từ boot
dmesg | tail -50 # 50 dòng cuối
dmesg -T # với timestamp dễ đọc (human-readable)
dmesg -w # watch/follow real-time
dmesg | grep -i error # kernel errors
dmesg | grep -i "out of memory" # OOM killer
dmesg | grep -i "i/o error" # disk I/O errors
dmesg | grep -i "eth\|ens\|enp" # network interface messages

journalctl — systemd Journal

Lọc theo service

journalctl -u nginx                             # log của nginx service
journalctl -u nginx -f # follow real-time
journalctl -u nginx -n 100 # 100 dòng cuối
journalctl -u nginx -u sshd # nhiều service cùng lúc

Lọc theo thời gian

journalctl --since "1 hour ago"
journalctl --since "2024-01-15 10:00"
journalctl --since "2024-01-15 10:00" --until "2024-01-15 11:00"
journalctl --since today
journalctl --since yesterday
journalctl -u nginx --since "30 minutes ago"

Lọc theo mức độ (Priority)

journalctl -p err                   # error và nghiêm trọng hơn
journalctl -p warning # warning trở lên
journalctl -p 0..3 # emergency (0) đến error (3)

# Mức độ: 0=emerg, 1=alert, 2=crit, 3=err, 4=warning, 5=notice, 6=info, 7=debug

Lệnh journalctl hữu ích khác

journalctl -xe                      # lỗi gần nhất với context đầy đủ
journalctl -k # kernel log (tương đương dmesg)
journalctl -b # log từ lần boot hiện tại
journalctl -b -1 # log từ lần boot trước
journalctl --list-boots # danh sách các lần boot
journalctl --disk-usage # dung lượng journal đang chiếm
journalctl --vacuum-time=7d # xoá log cũ hơn 7 ngày
journalctl --vacuum-size=500M # giới hạn 500MB

Log Analysis thực tế

Phát hiện brute force SSH

# Đếm số lần login fail theo IP
grep "Failed password" /var/log/auth.log \
| awk '{print $11}' \
| sort | uniq -c | sort -rn \
| head -20

# Tương tự với journalctl
journalctl -u sshd | grep "Failed password" \
| awk '{print $11}' \
| sort | uniq -c | sort -rn

Phân tích nginx access log

# Top 10 IP nhiều request nhất
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# Top 10 URL nhiều request nhất
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -10

# Đếm HTTP status codes
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# Request 5xx trong 1 giờ qua
grep "$(date +'%d/%b/%Y:%H')" /var/log/nginx/access.log | grep '" 5'

Monitor log real-time với nhiều file

# Theo dõi nhiều file cùng lúc
tail -f /var/log/nginx/error.log /var/log/nginx/access.log

# Với multitail (cần cài)
sudo apt install multitail
multitail /var/log/nginx/error.log /var/log/syslog

Log Rotation

logrotate tự động xoay vòng (rotate), nén, và xoá log cũ.

# Xem cấu hình
cat /etc/logrotate.conf
ls /etc/logrotate.d/ # config cho từng service

# Chạy thủ công (test)
sudo logrotate -d /etc/logrotate.conf # dry run
sudo logrotate -f /etc/logrotate.conf # force rotate ngay
# Ví dụ config logrotate cho ứng dụng tùy chỉnh
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily # rotate hàng ngày
missingok # không lỗi nếu file không tồn tại
rotate 14 # giữ 14 bản cũ
compress # nén bằng gzip
delaycompress # nén bản trước đó (không nén bản hiện tại)
notifempty # không rotate nếu file rỗng
create 640 www-data adm # tạo file mới với permission
postrotate
systemctl reload myapp
endscript
}

Tập trung Log (Centralized Logging)

Từ khoá tìm hiểu thêm

ELK Stack: Elasticsearch + Logstash + Kibana

Loki + Grafana: Giải pháp nhẹ hơn ELK, phổ biến trong Kubernetes

CloudWatch Logs: Giải pháp managed trên AWS

Log levels: DEBUG < INFO < WARNING < ERROR < CRITICAL