Sau bài này bạn làm được: đặt timezone đúng ý nghĩa nghiệp vụ vs UTC; hiểu chrony tracking offset và slew vs step; cấu hình journald không nuốt ổ; viết/vận hành rule logrotate an toàn (copytruncate vs copy); liên hệ clock skew với chứng chỉ TLS và log correlation.


UTC trên server, local TZ chỉ khi cần hiển thị

Best practice: OS clock ở UTC; app log có thể annotate local TZ nếu cần. Điều này giảm “bài toán mùa hè” khi so sánh log giữa region.

timedatectl
timedatectl list-timezones | grep -i ho
sudo timedatectl set-timezone UTC

chrony: đồng bộ NTP hiện đại

chronyc tracking
chronyc sources -v

Step vs slew: nếu offset quá lớn, chrony có thể nhảy thời gian — gây log timestamp nhảy và TTL kỳ lạ. Phòng datacenter thường theo dõi stratum và reachability NTP.

VM / container: clock thường lấy từ host — guest “chỉnh giờ tay” có thể gây conflict; ưu tiên sync từ hypervisor/doc.


TLS và log correlation phụ thuộc đồng hồ

Chứng chỉ notBefore/notAfter so với clock sai → lỗi “cert not yet valid” hoặc “expired” oan. Khi debug TLS, luôn kiểm tra date -u trên cả client và server.


journald: Storage= và giới hạn dung lượng

/etc/systemd/journald.conf:

[Journal]
Storage=persistent
SystemMaxUse=500M
MaxRetentionSec=2week

Volatile storage: Storage=volatile — reboot mất log, nhưng cứu disk nhỏ.

journalctl --disk-usage
sudo journalctl --vacuum-size=200M

logrotate: copy vs copytruncate vs create

DirectiveHành viRủi ro
create + postrotate signalapp reopen file mớicần app hỗ trợ signal
copytruncatecopy rồi truncate file cũrace mất log ngắn; fd vẫn trỏ inode cũ
rename + signalatomic renamephổ biến cho nginx/apache đúng cấu hình

Ví dụ snippet minh hoạ (đừng copy mù):

/var/log/myapp/*.log {
  weekly
  rotate 12
  compress
  delaycompress
  missingok
  notifempty
  sharedscripts
  postrotate
    /bin/kill -USR1 `cat /var/run/myapp.pid` 2>/dev/null || true
  endscript
}

rsyslog / syslog-ng — khi log cần ship đi xa

journald có thể forward tới syslog; từ đó ship tới Loki/Elastic. Kiến trúc cụ thể tùy observability — ở đây chỉ nhấn: một dòng log nên có request id từ app để correlate.


log2timeline mindset (rất ngắn)

Khi incident: thu thập mtime của file cấu hình, journal range, auth.log — timeline giúp trả lời “ai đổi gì lúc nào”.


Liên hệ bài trước / sau


Câu hỏi hay gặp

1. “systemd-timesyncd vs chrony?”
Tuỳ distro default; quan trọng là một nguồn truth và monitoring offset.

2. “Logrotate chạy lúc nào?”
/etc/cron.daily/logrotate hoặc timer — kiểm tra distro; đừng giả định nửa đêm.

3. “Journal mất sau reboot dù đã persistent?”
Filesystem read-only hoặc /var/log/journal không tạo được — journalctl sẽ bái.


Bài tiếp theo trong loạt

Phần 12: Sao lưu, phục hồi và playbook incident — đóng loạt bằng checklist thực chiến.