Viblo Code
+3

#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ậ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 [email protected]:/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.

  1. Check log file
# ls -la /usr/local/rails_apps/foobar/shared/log/
  1. Check aws đã được install hay chưa
# aws --version
  1. Chạy dòng lệnh sau nếu chưa được install
# sudo apt install awscli
  1. 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

  1. 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
  1. 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.

  1. 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

  1. Check xem setting đã được add vào chưa
# cat /etc/logrotate.conf
  1. 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
  1. 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.


All Rights Reserved