LOGROTATE là một tiện ích tuyệt vời trên Linux giúp đơn giản hóa việc quản lý log files trên hệ thống, bao gồm xoay vòng file log, di chuyển, nén, gửi tự động… Rotate (xoay vòng) ở đây có thể hiểu là tiến trình xử lý file log cũ theo quy định trước đó (xóa/nén/move) đồng thời tạo ra file log mới.
Bằng cách thiết lập đơn giản nhưng chặt chẽ thông qua file cấu hình, Logrotate hoạt động một cách tự động, không cần can thiệp thủ công.
Log files rất quan trọng đối với quản trị viên để theo dõi tình trạng của hệ thống/ứng dụng, tuy vậy nếu quá nhiều log file sẽ khiến dung lượng ổ cứng bị quá tải cũng như gây khó khăn trong việc tìm kiếm thông tin cần thiết.
HocVPS Script đã tự động tối ưu log file với Nginx, PHP, MySQL nên các bạn không cần phải lo lắng về vấn đề dung lượng nữa khi sử dụng. Một số server dùng control panel khác thường xuyên bị tình trạng đầy ổ cứng, log file có thể lên tới vài GB.
Nội dung bài viết
2.1. Lựa chọn Log file được rotate
2.3. Rotate theo dung lượng file log
2.5. Rotate theo số lượng Log file
1. Cài đặt Logrotate
Logrotate được cài đặt mặc định trên hầu hết các bản phân phối Linux. Bạn có thể kiểm tra bằng lệnh # logrotate
với kết quả trả lời phiên bản đang chạy trên server
# logrotate logrotate 3.8.7 - Copyright (C) 1995-2001 Red Hat, Inc.
Nếu chưa được cài đặt, bạn hãy cập nhật system packages và tiến hành cài đặt logrotate
Trên hệ thống Ubuntu/Debian:
# sudo apt-get update # sudo apt-get install logrotate
Trên hệ thống CentOS/Redhat:
# sudo yum update # sudo yum install logrotate
2. Cấu hình Logrotate
Cấu hình Logrotate được lưu tại /etc/logrotate.conf
, chứa thông tin thiết lập toàn bộ log files mà Logrotate quản lý, bao gồm chu kì lặp, dung lượng file log, nén file…
# see "man logrotate" for details # rotate log files weekly weekly # keep 4 weeks worth of backlogs rotate 4 # create new (empty) log files after rotating old ones create # use date as a suffix of the rotated file dateext # uncomment this if you want your log files compressed #compress # RPM packages drop log rotation information into this directory include /etc/logrotate.d # no packages own wtmp and btmp -- we'll rotate them here /var/log/wtmp { monthly create 0664 root utmp minsize 1M rotate 1 } /var/log/btmp { missingok monthly create 0600 root utmp rotate 1 } # system-specific logs may be also be configured here.
Theo như trên, log file được rotate hàng tuần, dữ liệu log được lưu trữ trong vòng 4 file, file log mới sẽ được tạo sau khi rotate file cũ. Các log file thêm hậu tố ngày trong tên file và được nén lại bằng gzip.
Thông tin cấu hình log file của từng ứng dụng cụ thể được lưu tại /etc/logrotate.d/
Ví dụ cấu hình rotate log file cho PHP-FPM /etc/logrotate.d/php-fpm
/home/*/logs/php-fpm*.log { daily compress maxage 7 missingok notifempty sharedscripts delaycompress postrotate /bin/kill -SIGUSR1 `cat /var/run/php-fpm/php-fpm.pid 2>/dev/null` 2>/dev/null || true endscript }
Ví dụ cấu hình rotate log file cho MySQL /etc/logrotate.d/mysql
:
/home/*/logs/mysql*.log { # create 600 mysql mysql notifempty daily rotate 3 maxage 7 missingok compress postrotate # just if mysqld is really running if test -x /usr/bin/mysqladmin && /usr/bin/mysqladmin ping &>/dev/null then /usr/bin/mysqladmin flush-logs fi endscript }
Ví dụ cấu hình rotate log file cho Nginx /etc/logrotate.d/nginx
/home/*/logs/access.log /home/*/logs/error.log /home/*/logs/nginx_error.log { daily missingok rotate 5 maxage 7 compress delaycompress notifempty create 640 nginx adm sharedscripts postrotate [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` endscript }
Có thể thấy, cấu hình Logrotate với cấu trúc khá đơn giản gồm chỉ định đường dẫn file log và thiết lập các cấu hình theo sau trong dấu {}
. Sau đây mình sẽ đi rõ hơn một số lựa chọn cấu hình phổ biến.
2.1. Lựa chọn Log file được rotate
Bạn có thể chỉ định cụ thể một hay nhiều file log với đường dẫn tuyệt đối của file log đó, phân biệt danh sách các log file cụ thể bằng khoảng trắng. Ví dụ:
/home/*/logs/mysql*.log /home/*/logs/access.log /home/*/logs/error.log /home/*/logs/nginx_error.log
2.2. Rotate theo thời gian
Có 4 giá trị cấu hình tương ứng với khoảng thời gian log file sẽ được rotate.
- Daily: mỗi ngày
- Weekly: mỗi đầu tuần
- Monthly: mỗi đầu tháng
- Yearly: mỗi năm
2.3. Rotate theo dung lượng file log
Ta có thể quy định tiến trình rotate dựa vào dung lượng file, ví dụ nếu file đó đạt dung lượng 100mb thì tiến hành rotate. Các đơn vị kích thước file có thể sử dụng là K, M, G.
size 100k size 100M size 100G
Cấu hình rotate dựa theo dung lượng file luôn được ưu tiên cao hơn rotate dựa vào thời gian. Khi đó, nếu 1 file log được rotate theo cấu hình dung lượng file quy định thì thời gian rotate sẽ được khởi động lại mới.
Ví dụ, log file được cấu hình rotate theo tuần weekly và theo dung lượng 100mb. Tuy vậy, đến giữa tuần log file được rotate do dung lượng file đạt 100M. Khi đó, Logrotate sẽ phải đợi sang tuần kế tiếp để thực hiện rotate log, do việc rotate theo size đã bỏ qua luôn thời gian của tuần này.
2.4. Xử lý Log file trống
Tham số missingok
: nếu file log vì lý do gì đấy bị mất hoặc không tồn tại *.log thì logrotate sẽ tự động di chuyển tới phần cấu hình log của file log khác mà không cần phải xuất ra thông báo lỗi. Ngược lại sẽ là cấu hình nomissingok
Tham số Notifempty
: không rotate log nếu file log này trống.
2.5. Rotate theo số lượng Log file
rotate [number]
Quy định số lượng log file cũ đã được giữ lại sau khi rotate. Ví dụ: rotate7
giữ lại 7 file log cũ. Trường hợp đã có đủ 7 file log cũ thì file cũ nhất sẽ bị xóa đi để chứa file log mới được tạo.
2.6. Tự động nén Log file
Tùy chọn Compress
: Logrotate sẽ nén tất cả các file log lại sau khi đã được rotate, mặc định bằng gzip.
Nếu bạn muốn sử dụng chương trình nén khác như bzip2, xz hoặc zip thì hãy đặt tên chương trình đó thành biến sau giá trị cấu hình Compresscmd xz
Tham số Delaycompress
sẽ hữu dụng trong trường hợp bạn không muốn file log cũ phải nén ngay sau khi vừa được rotate. Thay vào đó, công việc nén sẽ được delay trễ hơn bằng việc sẽ nén file log cũ đó vào lần chạy rotate kế tiếp. Tùy chọn này chỉ hoạt động đi kèm chức năng compress trong file cấu hình, tức bạn phải cấu hình compress trước đó:
compress delaycompress
Tùy chọn nocompress
không sử dụng tính năng nén đối với file log cũ
2.7. Phân quyền cho Log file
Chúng ta có thể chỉ định khi logrotate xử lý xong file log cũ sẽ tạo ra file log mới có tên tương ứng để thay thế file log hiện tại. Cấu hình tham số create
sẽ quy định việc file log mới tạo ra. Bạn cần đảm bảo đúng phân quyền cho file log mới sau khi rotate.
Note: Hoạt động tạo file này sẽ chạy trước script postrotate. Ví dụ:
create 660 appuser www-data
File log mới sẽ có owner là appuser
và thuộc group www-data
(group mà Apache thường chạy). Quyền hạn 660
cho phép cả owner và user trong cùng 1 nhóm được phép viết, sửa nội dung lên file. Điều này cho phép các ứng dụng PHP viết vào log file.
Nếu bạn không muốn tự động tạo file log mới thì sử dụng option nocreate
Tham số Dateext
sẽ giúp cài đặt hậu tố của tên log file là thời gian theo cấu trúc yyyymmdd
. Logs file mặc định có các giá trị hậu tố là các con số 1,2,3…
2.8. Thực thi lệnh trước hoặc sau khi rotate
LogRotate có thể chạy các lệnh trước hay sau quá trình rotate. Điều này thường được áp dụng để khởi động lại dịch vụ sử dụng file log nhằm không làm gián đoạn quá trình ghi log.
Để chạy một số lệnh trước khi quá trình rotate bắt đầu, ta đặt lệnh thực thi nằm giữa prerotate
và endscript
. Ví dụ:
Prerotate Touch /var/www/html/stop.txt Endscript
Để chạy lệnh sau khi quá trình rotate kết thúc, ta đặt lệnh thực thi nằm giữa postrotate
và endscript
. Ví dụ câu lệnh dưới, Apache sẽ được khởi động lại sau khi quá trình logrotate kết thúc.
Postrotate /etc/init.d/apache2 reload > /dev/null Endscript
Tùy chọn sharedscripts
Script postrotate sẽ được chạy sau khi toàn bộ các file logs được rotate. Nếu không có tùy chọn này, postrotate script sẽ được chạy sau mỗi log file được rotate.
3. Kiểm tra LogRotate
Sau khi thiết lập xong LogRotate, bạn save lại để hệ thống tự động chạy theo thiếp lập.
3.1. Debug cấu hình LogRotate
Nếu muốn kiểm tra cấu hình chuẩn chưa, bạn dùng tham số -d
(debug) đối với các file cấu hình LogRotate riêng biệt. Ví dụ, kiểm tra toàn bộ quá trình LogRotate của Nginx:
logrotate -d /etc/logrotate.d/nginx reading config file /etc/logrotate.d/nginx reading config info for /home/*/logs/access.log /home/*/logs/error.log /home/*/logs/nginx_error.log Handling 1 logs rotating pattern: /home/*/logs/access.log /home/*/logs/error.log /home/*/logs/nginx_error.log after 1 days (5 rotations) empty log files are not rotated, old logs are removed considering log /home/hocvps.com/logs/access.log log does not need rotating considering log /home/hocvps.com/logs/error.log log needs rotating considering log /home/hocvps.com/logs/nginx_error.log log does not need rotating rotating log /home/hocvps.com/logs/error.log, log->rotateCount is 5 dateext suffix '-20161216' glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]' previous log /home/hocvps.com/logs/error.log.1 does not exist renaming /home/hocvps.com/logs/error.log.5.gz to /home/hocvps.com/logs/error.log.6.gz (rotatecount 5, logstart 1, i 5), renaming /home/hocvps.com/logs/error.log.4.gz to /home/hocvps.com/logs/error.log.5.gz (rotatecount 5, logstart 1, i 4), renaming /home/hocvps.com/logs/error.log.3.gz to /home/hocvps.com/logs/error.log.4.gz (rotatecount 5, logstart 1, i 3), renaming /home/hocvps.com/logs/error.log.2.gz to /home/hocvps.com/logs/error.log.3.gz (rotatecount 5, logstart 1, i 2), renaming /home/hocvps.com/logs/error.log.1.gz to /home/hocvps.com/logs/error.log.2.gz (rotatecount 5, logstart 1, i 1), renaming /home/hocvps.com/logs/error.log.0.gz to /home/hocvps.com/logs/error.log.1.gz (rotatecount 5, logstart 1, i 0), renaming /home/hocvps.com/logs/error.log to /home/hocvps.com/logs/error.log.1 creating new /home/hocvps.com/logs/error.log mode = 0640 uid = 498 gid = 4 running postrotate script running script with arg /home/*/logs/access.log /home/*/logs/error.log /home/*/logs/nginx_error.log : " [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid` " removing old log /home/hocvps.com/logs/error.log.6.gz error: error opening /home/hocvps.com/logs/error.log.6.gz: No such file or directory
Output như trên không xuất hiện lỗi gì, cấu hình chuẩn.
3.2. Chạy LogRotate thủ công
Trong trường hợp bạn muốn chạy ngay LogRotate, hãy dùng lệnh bên dưới:
logrotate -vf /etc/logrotate.d/nginx
Trong đó:
-v
verbose hiển thị thêm thông tin so với thông thường, có ích khi bạn muốn dò lỗi logrotate-f
bắt buộc rotate ngay lập tức
mình xài hocpvs sau 3 tháng thì file logs lên 10G – 20G . mình muốn tắt chức năng logs trên hocvps thì phải làm sao ?
/var/log/172.16.1.110/* {
daily
rotate 3
create
size 1M
compress
}
chào b mình cấu hình như này cho rorate mà mk k hiểu vì sao nó có nén file và tạo file log khác nhưng những file khác 0Kb còn nó vẫn lưu vào file đầu tiên
support giúp mk với
Hình như do bạn không restart service nên nó sẽ thực hiện log trên file cũ. Ví dụ tạo file log Nginx mới thì phải restart Nginx để lưu trên file mới
Thanks Bạn, bài viết rất hữu ích.
Bạn Việt Phương cho mình hỏi: Mình tự bổ sung /etc/logrotate.d/apache với nội dung như sau:
/usr/local/apache/logs/*_log
/usr/local/apache/logs/*.log
/usr/local/apache/domlogs/*.log
{
daily
missingok
rotate 4
compress
delaycompress
notifempty
sharedscripts
}
Không hiểu sao khi chạy file này nó báo lội như sau: Operation failed!
error: /etc/logrotate.d/apache:1 lines must begin with a keyword or a filename (possibly in double quotes)
Cảm ơn đã giúp đỡ
/usr/local/apache/logs/*_log
thì là *.log chứ bạnTheo đường dẫn trên thì là 2 file:
/usr/local/apache/logs/error_log
/usr/local/apache/logs/access_log
Nó không có đuôi file.
Mình xem rất kỹ. Cảm ơn bạn hỗ trợ.
Vì lỗi báo là dòng 1 cần phải bắt đầu bằng keyword hoặc tên file
Bạn có thể sửa cấu hình Apache quy định cho ghi log vào file .log
Vì mình cũng thấy thường để file .log cho dễ phân biệt. Ví dụ
https://serversforhackers.com/c/managing-logs-with-logrotate
Còn sửa cấu hình Apache thì tìm trong file quy định cấu hình Apache, ví dụ như Nginx là /etc/nginx/nginx.conf
Cảm ơn bạn Việt Phương đã hồi âm. Mình đã điều tra ra được lý do tại sao apache của vps mình lại có đường dẫn khác mọi người là do mình cài Centos web panel nên nó quản lý như thế.
Nếu mọi người giống mình hãy thử logrotate như sau:
http://forum.centos-webpanel.com/centos-7-problems/rotation-logs-in-cwp/
Mình chưa kịp lên máy để test. Nếu có phát sinh lỗi ngoài ý muốn mình hỏi tiếp ạ.
Oh, ok noted. Bạn note bản script thì dễ rồi. Lúc đầu mình tưởng là bản Apache tự build LAMP
Nhật ký quan trọng nhất bị bỏ lỡ là nhật ký hệ thống Apache nằm trong /usr/local/apache/. Trong đó có 2 thư mục chứa log cực kỳ lớn là: domlogs & log. Giờ mình muốn cấu hình thêm logrotate cho thư mục này mình cấy hình như thế nào ad? cho em hỏi là mình logrotate xong có lấp lệnh cho apache khởi động lại hay không? ad rộng lượng làm cho em cái config logrotate /etc/logrotate.d/apache mẫu em xài luôn, cảm ơn rất nhiều…
Không nhầm thì hệ thống cài xong Apache sẽ tự thêm file /etc/logrotate.d/apache2 trong đó đã quy định cấu hình Logrotate dành cho Apache rồi
https://serversforhackers.com/c/managing-logs-with-logrotate
Bài viết hay và khá chi tiết.
Cảm ơn bạn nhé.
Sau khi mình rotate thủ công thì cái file access.log 400mb cũ bị đổi tên thành access.log.1 và có 1 file access.log mới dc tạo ra 0kb. Nhưng khi hệ thống log, thì nó vẫn log vào file access.log.1 mới sợ chứ? Cấu hình rotate của mình là mặc định của Hocvps, ko đổi gì cả, centos 7.
Mình đã send thông tin vào support@hocvps.com, nhờ bạn xem hộ với.
Trong trường hợp mà em muốn xử dụng 1 lệnh để xóa toàn bộ file logs thì phải làm sao ạ? Em dùng hocvps script ạ
Bạn xóa toàn bộ logs trong thư muc domain đi, lệnh như lệnh trong Linux thôi. File log đã đc tập trung hết 1 thư mục rồi. Khi đó các service sẽ bị stop vì không biết ghi logs vào đâu
Cảm ơn bạn, mình đành dùng crontab vậy.
/home/dangkiena3/logs/*.log {
daily
rotate 5
compress
}
File cấu hình của mình ntn theo mình hiểu là thực hiện hàng ngày, giữ lại 5 file còn lại thì nén đúng không ạ?
Mà mình chạy thì nó không làm thế, chỉ tự động thêm đuôi .1 vào các file log 🙁
Giữ(nén) 5 file còn lại thì xóa bạn à
Cảm ơn bạn. Vậy nếu mình muốn giữ 5 file (không nén), còn lại thì nén thì làm ntn ạ?
Mình không có ý tưởng gì cho vấn đề này bạn nhé. Tham số
compress
chỉ có nén hay không mà thôi