1. Sử dụng lệnh tail để theo dõi phần cuối file
Lệnh tail là công cụ phổ biến nhất để kiểm tra các sự kiện mới nhất trong log. Nó mặc định hiển thị 10 dòng cuối cùng của tệp tin.
| Tham số | Mô tả | Ví dụ thực tế |
|---|---|---|
-n <số_dòng> |
Hiển thị N dòng cuối. Nếu dùng +N, nó sẽ hiển thị từ dòng thứ N đến hết. |
tail -n 50 /var/log/auth.logXem 50 bản ghi đăng nhập gần nhất. |
-f |
Theo dõi thay đổi của file theo thời gian thực (dựa trên File Descriptor). | tail -f /var/log/apache2/access.logGiám sát lưu lượng truy cập web đang diễn ra. |
-F |
Theo dõi theo tên file. Nếu file bị xóa hoặc xoay vòng (logrotate), lệnh vẫn tiếp tục bám theo file mới. | tail -F /var/log/syslogLựa chọn an toàn nhất cho môi trường Production khi log thường xuyên bị cắt. |
-s <giây> |
Thiết lập khoảng thời gian chờ giữa các lần kiểm tra cập nhật (mặc định là 1s). | tail -f -s 2 /tmp/debug.logKiểm tra cập nhật mỗi 2 giây để tiết kiệm tài nguyên. |
Lưu ý quan trọng: Sự khác biệt giữa -f và -F rất quan trọng trong quản trị hệ thống. -f sẽ dừng lại nếu file log được đổi tên (ví dụ từ app.log thành app.log.1), trong khi -F sẽ tự động nhận diện file app.log mới vừa được tạo ra.
# Kết hợp với grep để lọc lỗi nghiêm trọng
tail -F /var/log/mysql/error.log | grep -i "critical"
# Hiển thị từ dòng thứ 500 đến hết file
tail -n +500 production.log
2. Sử dụng lệnh head để kiểm tra phần đầu file
Ngược lại với tail, lệnh head giúp bạn xem những nội dung đầu tiên của file, thường dùng để kiểm tra cấu hình hoặc các log khởi tạo hệ thống.
| Tham số | Mô tả | Ví dụ |
|---|---|---|
-n <số_dòng> |
Lấy N dòng đầu tiên của file. | head -n 15 /var/log/boot.log |
-c <byte> |
Lấy số lượng byte nhất định từ đầu file (có thể dùng đơn vị K, M). | head -c 512 /var/log/dmesg |
-v |
Hiển thị tên file ở dòng đầu tiên của kết quả. | head -v -n 5 *.log |
3. Xem log linh hoạt với lệnh less
Lệnh less vượt trội hơn cat hay more nhờ khả năng điều hướng hai chiều (lên/xuống) và không tải toàn bộ file vào bộ nhớ RAM, rất hữu ích cho các file log dung lượng lớn hàng GB.
| Tính năng | cat | more | less (Khuyên dùng) |
|---|---|---|---|
| Tốc độ tải | Chậm (tải hết file) | Trung bình | Cực nhanh (tải theo nhu cầu) |
| Cuộn trang | Không hỗ trợ | Chỉ cuộn xuống | Lên và xuống linh hoạt |
| Tìm kiếm | Không | Cơ bản | Nâng cao (Highlight kết quả) |
Các phím tắt điều hướng trong less:
G: Nhảy đến cuối file.g: Quay lại đầu file./keyword: Tìm kiếm từ khóa từ trên xuống.?keyword: Tìm kiếm từ khóa từ dưới lên.n: Chuyển đến kết quả tìm kiếm tiếp theo.F: Chuyển sang chế độ theo dõi thời gian thực (nhưtail -f). NhấnCtrl+Cđể thoát chế độ này.q: Thoát lệnh.
4. Truy vấn log hệ thống với journalctl
Trên các hệ điều hành sử dụng Systemd, log được quản lý tập trung bởi journald dưới dạng binary. Bạn cần lệnh journalctl để đọc chúng.
# Theo dõi log của một dịch vụ cụ thể theo thời gian thực
journalctl -u docker.service -f
# Xem 100 dòng log gần nhất của hệ thống
journalctl -n 100
# Lọc log theo khoảng thời gian
journalctl --since "2023-10-01" --until "2023-10-02 12:00:00"
# Xem log của một Process ID (PID) nhất định
journalctl _PID=1024
5. Các phương pháp xóa hoặc làm rỗng log an toàn
Khi ổ cứng đầy, bạn cần xử lý các file log lớn mà không muốn làm gián đoạn các ứng dụng đang ghi vào đó.
Sử dụng lệnh truncate
Đây là cách an toàn nhất vì nó không thay đổi Inode của file, giúp ứng dụng vẫn giữ được liên kết ghi log.
# Xóa trắng hoàn toàn dung lượng file log
truncate -s 0 /var/log/nginx/access.log
# Cắt file log chỉ còn giữ lại 500MB đầu tiên
truncate -s 500M /var/log/app_debug.log
Giữ lại một phần log mới nhất
Nếu bạn muốn xóa log nhưng vẫn giữ lại khoảng 50MB dữ liệu cuối cùng để phân tích:
# Lưu 50MB cuối vào file tạm
tail -c 50M current_log.log > keep_this.tmp
# Làm rỗng file log gốc (giữ nguyên Inode)
truncate -s 0 current_log.log
# Đổ lại dữ liệu đã lưu vào file gốc
cat keep_this.tmp > current_log.log
# Xóa file tạm
rm keep_this.tmp
Cảnh báo: Tránh sử dụng lệnh rm sau đó tạo lại file bằng touch cho các dịch vụ đang chạy (như Nginx, MySQL), vì ứng dụng sẽ không thể ghi tiếp vào file mới cho đến khi dịch vụ được khởi động lại hoặc nhận tín hiệu reload.