#production.log #big #back-up #s3 #rotating
Bữa trước trong lúc mình xem log server tình cờ bắt gặp quả log production.log nặng tận 17GB và có nguy cơ làm chết cả server. Sau đây mình note lại 1 chuỗi các công việc mình đã làm trước đó. 1. Lý do mình đụng tới server Server production đang chạy thì bị chết khoảng 3 phút, sau đó nó tự ...
Bữa trước trong lúc mình xem log server tình cờ bắt gặp quả log production.log nặng tận 17GB và có nguy cơ làm chết cả server. Sau đây mình note lại 1 chuỗi các công việc mình đã làm trước đó.
1. Lý do mình đụng tới server
Server production đang chạy thì bị chết khoảng 3 phút, sau đó nó tự bật dậy. Thế là phải vào đọc log server, thế nào vào xem thì mới biết là log server chưa được xử lý rotating. Làm phát 17GB file log. Thế là mình phải copy file log ra rồi nén nó lại sau đó copy nó về máy.
scp -i keypair.pem user-s1@10.1.161.xxx:/home/user-s1/production_20171216.log.gz ~/Downloads
Lúc nén thì dung lượng file giảm đi rất nhiều khoảng 1/10 thôi. Nên lúc mình download file về máy nhanh hơn rất nhiều.
2. Xử lý đọc file log 17GB
Mình đã thử đọc file log 17GB bằng sublime text, và kết quả là máy đứng luôn. Máy chỉ có RAM 8GB thì không load nổi file vào bộ nhớ mà đọc file lên. Minh chia file ra thành các file nhỏ 100000 lines mỗi file. split -l 100000 log_file_path refix_output_file_name Trước đó mình phải đếm số dòng của 1 file log: wc -l path_of_file
Sau khi chia file xong thì cứ xác định thời gian mình muốn xem log là thời gian nào, rồi open các file ở giữa, kiểu giống như binary search.
3. Back-up file log 17GB bằng cách upload lên S3
Server của mình dùng là server EC2 của amazon, nên mình chọn cách là upload file log 17GB lên S3, sau đó sẽ empty file production.log để nó ghi lại từ file rỗng.
- Check log file
# ls -la /usr/local/rails_apps/foobar/shared/log/
- Check aws đã được install hay chưa
# aws --version
- Chạy dòng lệnh sau nếu chưa được install
# sudo apt install awscli
- Configure aws
# aws configure AWS Access Key ID [None]: AKIAAKIAAKIAAKIAAKIAAKIA AWS Secret Access Key [None]: nIfHXKnIfHXKnIfHXnIfHXKnIfHXKnIfHXKnIfHXK Default region name [None]: ap-northeast-1 Default output format [None]: json
Tham khảo thêm cách configure https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-quick-configuration
- Copy file to AWS S3
#aws s3 cp /usr/local/rails_apps/foobar/shared/log/production.log s3://bucket-name/log_backup/prod.201712191841.log
- Clear log file Sau khi copy file xong, thì bạn có thể clear file để ghi log lại.
# cat /dev/null > log/production.log
Chú ý: Nên dùng lệnh trên để clear file, nếu bạn xử dụng lệnh rm rồi tạo lại file production.log thì log sẽ không ghi tiếp tục vào nữa, mà lúc đó bắt buộc phải restart lại puma.
4. Xử lý rotating log
Sau khi clear file log, thì bước tiếp theo là mình setup chế độ rotating cho log rails server của mình.
- Thêm configure cho Logrotate
# sudo vi /etc/logrotate.conf
và add đoạn này vào
/usr/local/rails_apps/foobar/shared/log/*.log { daily missingok rotate 7 compress delaycompress notifempty copytruncate }
Để biết thêm ý nghĩa của các thông số này các bạn có thể tham khảo ở link sau: https://gorails.com/guides/rotating-rails-production-logs-with-logrotate
- Check xem setting đã được add vào chưa
# cat /etc/logrotate.conf
- Run Logrotate một lần để biết chắc chắn là nó hoạt động
# sudo /usr/sbin/logrotate -f /etc/logrotate.conf
- Check xem file log rotating đã được generate ra chưa
# ls -la /usr/local/rails_apps/foobar/shared/log/
5. Automatic backup of log files to S3
Còn nếu bạn không muốn xóa log sau 7 ngày hay 30 ngày. Mà muốn giữ lại chúng để nghiên cứu hay phân tích thì bạn có thể lựa chọn là Upload lên S3 trước khi file log bị xóa. Thật may là Logrotate cũng hộ trợ cho ta làm điều này. Mọi người có thể tham khảo cách setup qua link phía dưới. https://blog.jayway.com/2014/09/12/automatic-backup-of-log-files-to-s3-from-ec2-instances/
6. Kết
Log là 1 phần rất quan trọng đối với server, nó giống như lịch sự lưu vết các hoạt động diễn ra trên server. Nhưng nó cũng rất nguy hiểm khi bạn không xử rotating, để cho file log 1 ngày 1 lớn lên, gây tắt nghẹn bộ nhớ, down server. Nên tùy từng dự án chọn cho mình cách lưu log tối ưu nhất.