Xử lý log production dùng LogRotate
Khi triển khai ứng dụng lên production, một vấn đề chúng ta phải quan tâm đó là log
Làm thế nào để quản lý file log cho tốt, dễ dàng tìm kiếm khi gặp vấn đề, file log k bị phình to chiếm nhiều bộ nhớ của server
Ý tưởng ta mỗi ngày ta sẽ ghi ra 1 file log sau đó nén chúng lại để tiết kiệm không gian lưu trữ cũng như dễ dàng cho việc quản lý
File log của bạn ngày 1 nặng đặc biệt nếu hệ thống có nhiều người truy cập. Hết dung lượng trên máy chủ hệ thống sẽ k hoạt động dc nữa
Để thực hiện dc ý tưởng trên ta sẽ dùng logrotate
Config logrotate
Bước 1: Đầu tiên, chúng ta hãy tạo một file mới với tên tùy chọn vào thư mục /etc/logrotate.d/ với lệnh: sudo nano /etc/logrotate.d/<logrotate_config_file>
/home/deploy/APPNAME/current/log/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
copytruncate
}
/home/deploy/APPNAME/current/log/ là path nơi file log dc lưu trữ trên server của bạn, bạn thay thế path đó cho phù hợp vs project của mình
*.log là chúng ta sẽ rotate tất cả các file log có đuôi .log, nếu chỉ muốn rotate file production.log thì mình chỉ set là production.log thôi
Giờ chúng ta tìm hiểu các thành phần trong đoạn mã trên để biết mục đích của nó nhé
- daily : Log sẽ dc rotate hàng ngày, chúng ta có thể set hàng tuần (weekly) hàng tháng (monthly)
- missingok : Nếu file log k tồn tại thì sẽ bỏ qua
- rotate 7 : Giữ 7 file log gần nhất, các file log cũ sẽ bị xóa
- compress: File log sẽ dc nén lại, mặc định Gzip
- delaycompress : Hoãn việc nén file log cũ sang chu kỳ thực hiện rotate tiếp theo. Ví dụ chúng ta thực hiện rotate log hằng ngày, có ngày 11,12,13. hiện đã rotate log của ngày 11, sinh ra file log lưu log của ngày 10 thì sang ngày 12 log của ngày 11 ms dc nén lại. Tùy chọn này chỉ áp dụng khi chúng ta sử dụng compress
- notifempty : Sẽ k rotate nếu file log trống
- copytruncate : Copy file log sang 1 file mới sau đó làm trống file đó. Nếu k dùng copytruncate thì sẽ phải khởi động lại Rails server sau mỗi lần rotate để nó ghi tiếp log vào file log mới không thì nó sẽ ghi vào file cũ
Sau đó bạn thử bằng lệnh: sudo logrotate /etc/logrotate.d/<logrotate_config_file> rồi xem kết quả ở file state bằng lệnh: cat /var/lib/logrotate/status
Để Logrotate được thực hiện hằng ngày, bạn kiểm tra xem có file logrotate trong thư mục /etc/cron.daily/ hay không. Nếu không có, bạn cần tạo một file với nội dung sau:
#!/bin/sh
# Clean non existent log file entries from status file
cd /var/lib/logrotate
test -e status || touch status
head -1 status > status.clean
sed 's/"//g' status | while read logfile date
do
[ -e "$logfile" ] && echo "\"$logfile\" $date"
done >> status.clean
mv status.clean status
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
Rồi cho phép nó thực thi với mode executable với lệnh: sudo chmod +x /etc/cron.daily/logrotate.
Để test thử xem nó có thật sự chạy dc k? ta thên -f
sudo logrotate /etc/logrotate.d/<logrotate_config_file> -f
để ép logrotate chạy ngay cả khi nó chưa đến lúc phải thực thi
Kiểm tra file log ở folder log, đảm bảo rằng delaycompress thực sự hoạt động, ở đây logrotate đã rotate 2 lần sinh ra 2 file log mới là production.log.1 và production.log2.gz
![]()
Bạn có thể thấy production.log vẫn tồn tại vì thực chất ta sẽ copy file log sang 1 file mới sau đó làm trống file đó
Một cách khác để lưu file log: rename file log mỗi lần rotate sau đó sinh ra file log cùng tên vs tên file log cần ghi (k dùng copytrunicate) nhưng chúng ta sẽ cần khởi động lại rails server bằng cách sử dụng postrotate
/path/to/log/folder/*.log {
su deployer deployer
daily
rotate 7
missingok
dateext
compress
notifempty
olddir /path/to/old/folder
sharedscripts
postrotate
[ -e /path/to/puma/puma.pid ] && kill -HUP `cat /path/to/puma/puma.pid` && kill -USR1 `cat /path/to/puma/puma.pid` && [ -e /path/to/sidekiq/sidekiq-0.pid ] && kill -USR2 `cat /path/to/sidekiq/sidekiq-0.pid`
endscript
}
# Puma signals:
# -HUP: Reopen puma.*.log
# -USR1: Reopen <application>.log
# Sidekiq signal:
# -USR2: Reopen sidekiq log file(s)
# For multiple sidekiq indexes
# `cat /path/to/sidekiq/sidekiq-*.pid | xargs kill -USR2`
Tham khảo : https://gorails.com/guides/rotating-rails-production-logs-with-logrotate https://viblo.asia/p/rotate-rails-logs-with-logrotate-XL6lAgYmKek https://gist.github.com/namnv609/32e7d2f886ab873bba467f4062cba368 https://gist.github.com/iamdbc/f73b1984a8ffe239b5e197ad8f5e9e87
All rights reserved