HỌC BẰNG THỰC HÀNH
← Lộ trình học
01 · Linux Administration

Đọc log và cấu hình journald, logrotate

Thực hiện trên server của bạn, rồi kiểm tra từng tiêu chí.

Cốt lõi

Vì sao cần học

Log là evidence đầu tiên trong mọi sự cố. Hai câu hỏi thường gặp nhất khi trực sự cố là "lỗi bắt đầu từ lúc nào?" và "trước lần reboot vừa rồi có gì bất thường?". Không lọc được log thì bạn chìm trong hàng chục nghìn dòng. Log không có giới hạn thì một ngày nào đó ổ đĩa sẽ đầy, như bạn sẽ gặp ở bài Break/Fix ổ đầy.

Mục tiêu

  • Lọc journal theo unit, mức độ (-p), thời gian (--since), lần boot (-b) và định dạng đầu ra.
  • Ghi log có tag bằng logger và tìm lại.
  • Bật journal bền vững có giới hạn dung lượng.
  • Cấu hình và kiểm thử logrotate cho log file của ứng dụng.

Điều kiện tiên quyết

  • Bài Lập lịch bằng systemd timer và cron.

Mental model

Trên RHEL hiện đại có hai đường log:

dịch vụ systemd  ── stdout/stderr ──▶ systemd-journald ──▶ /var/log/journal (nhị phân)
                                            │
                                            └──▶ rsyslog ──▶ /var/log/messages, /var/log/secure (text)
ứng dụng tự ghi file ─────────────────────────────────────▶ /var/log/<app>/*.log  ── logrotate

journald lưu log kèm metadata (unit, PID, mức độ, lần boot) nên lọc rất mạnh. Storage=persistent giữ log sau reboot trong /var/log/journal; SystemMaxUse giới hạn tổng dung lượng.

Mức độ (priority): emerg 0, alert 1, crit 2, err 3, warning 4, notice 5, info 6, debug 7. -p err hiển thị từ err trở lên (0–3).

logrotate chạy định kỳ (timer logrotate.timer), đổi tên app.log thành app.log.1, nén bản cũ, xóa bản quá hạn.

Thực hành (Guided Lab)

1. Lọc journal

journalctl -b -p warning --no-pager | tail -20
journalctl -u sshd --since "1 hour ago" --no-pager
journalctl --list-boots
journalctl -b -1 -p err --no-pager | tail
journalctl -u kdc-web -o json-pretty -n 1
journalctl -f
Giải thích lệnh và tham số
Tùy chọn của journalctlÝ nghĩa
-bChỉ log của lần boot hiện tại.
-b -1Chọn lần boot trước; -1 là giá trị của -b, không phải số dòng.
-p warning / -p errLọc mức severity này và các mức nghiêm trọng hơn. -p ở đây là priority.
-u sshdChỉ log của unit SSH.
--since "1 hour ago"Chỉ log từ một giờ trước đến hiện tại; nháy kép giữ chuỗi thời gian thành một đối số.
--list-bootsLiệt kê các lần boot có log đã lưu.
-o json-prettyChọn đầu ra JSON được căn lề.
-n 1Lấy một bản ghi gần nhất.
-fTheo dõi log mới liên tục; Ctrl+C để dừng.

tail -20 lấy 20 dòng cuối; tail không có số lấy 10 dòng. --no-pager in trực tiếp thay vì mở trình xem phân trang.

-b -1 là lần boot trước. Nếu báo không có dữ liệu, journal của bạn chưa bền vững; bước 3 sẽ sửa điều đó. Nhấn Ctrl+C để thoát -f.

2. Ghi log có tag

logger -t kdc-lab -p user.warning "Bắt đầu bài thực hành log"
journalctl -t kdc-lab --no-pager
grep kdc-lab /var/log/messages | tail -2
Giải thích lệnh và tham số

logger gửi một thông điệp vào hệ thống log: -t kdc-lab gắn tag, -p user.warning chọn facility user và mức warning. journalctl -t kdc-lab lọc theo tag đó; cùng chữ -t nhưng ở đây là bộ lọc của journalctl.

Cùng một dòng log đi vào cả journal và /var/log/messages (qua rsyslog). Một số cloud image không cài rsyslog; khi đó chỉ có journal.

3. Journal bền vững có giới hạn

sudo install -d /etc/systemd/journald.conf.d
sudo tee /etc/systemd/journald.conf.d/kdc.conf <<'EOF'
[Journal]
Storage=persistent
SystemMaxUse=200M
EOF
sudo systemctl restart systemd-journald
sudo journalctl --flush
journalctl --disk-usage
ls -ld /var/log/journal
Giải thích lệnh và tham số

journalctl --flush chuyển log runtime sang vùng lưu persistent khi đã cấu hình; --disk-usage báo dung lượng journal đang dùng. Storage=persistent và SystemMaxUse=200M là các giá trị trong file cấu hình, không phải lệnh shell.

Sau khi restart, journald vẫn ghi vào /run/log/journal (mất khi reboot) cho tới khi được yêu cầu chuyển sang đĩa. journalctl --flush làm việc đó ngay; khi boot, systemd-journal-flush.service làm tự động.

4. logrotate cho ứng dụng

sudo dnf install -y logrotate
sudo install -d -m 755 /var/log/kdc-app
for i in $(seq 1 200); do echo "$(date --iso-8601=seconds) INFO request $i"; done | sudo tee /var/log/kdc-app/app.log >/dev/null

sudo tee /etc/logrotate.d/kdc-app <<'EOF'
/var/log/kdc-app/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 root root
}
EOF
sudo logrotate -d /etc/logrotate.d/kdc-app
sudo logrotate -f /etc/logrotate.d/kdc-app
ls -l /var/log/kdc-app
Giải thích lệnh và tham số

seq 1 200 tạo dãy số từ 1 đến 200; for i in $(seq ...); do ...; done chạy một lần cho mỗi số, $i là số đang xét. >/dev/null bỏ phần tee in ra terminal, vẫn giữ phần ghi file. logrotate -d chỉ debug/xem trước, chưa xoay log; -f buộc xoay log thật dù chưa đến lịch. Với journalctl, -f lại là follow: phải đọc tùy chọn theo từng lệnh.

-d chạy thử, chỉ in việc sẽ làm. -f buộc xoay vòng ngay. delaycompress để bản gần nhất (app.log.1) chưa nén, tiện đọc khi điều tra.

Tự kiểm tra (Verification)

cat /etc/systemd/journald.conf.d/kdc.conf
journalctl --disk-usage
cat /etc/logrotate.d/kdc-app
ls -l /var/log/kdc-app
Giải thích lệnh và tham số

journalctl --disk-usage in dung lượng journal đang chiếm. ls -l xem các file log cùng kích thước; cat đọc cấu hình journald và logrotate.

Chọn server và bấm Kiểm tra kết quả.

Lỗi thường gặp

  • Sửa thẳng /etc/systemd/journald.conf: bản cập nhật package có thể ghi đè hoặc tạo .rpmnew. Dùng drop-in trong journald.conf.d/.
  • Quên restart systemd-journald sau khi đổi cấu hình, hoặc quên journalctl --flush nên /var/log/journal chưa xuất hiện.
  • Ứng dụng giữ file log đang mở: sau khi logrotate đổi tên, ứng dụng vẫn ghi vào app.log.1. Dùng copytruncate hoặc postrotate để báo ứng dụng mở lại file (thường bằng SIGHUP).
  • journalctl --since today dùng giờ của server: kiểm tra múi giờ bằng timedatectl.

Ghi chú production

  • Đặt giới hạn cho mọi nguồn log: journald (SystemMaxUse), logrotate, và log của container ở Module 05.
  • Log trên một server sẽ mất khi server mất. Module 17 sẽ gom log về hệ thống tập trung bằng OpenTelemetry Collector.
  • Đồng hồ sai làm log không ghép được giữa các máy: bật đồng bộ thời gian (chronyd, timedatectl).

Dọn dẹp

Giữ journal bền vững để dùng trong các bài Break/Fix. Muốn bỏ phần logrotate:

sudo rm -rf /etc/logrotate.d/kdc-app /var/log/kdc-app
Giải thích lệnh và tham số

rm -f xóa file và không hỏi xác nhận; -r thêm xóa đệ quy thư mục cùng nội dung, nên -rf gộp hai tùy chọn này.

Tài liệu chính thức