1. Logrotate là gì?
Logrotate là một tiện ích trong hệ điều hành Linux được sử dụng để quản lý và thực thi các file nhật ký (log files). Trong môi trường hệ thống Linux, các ứng dụng và dịch vụ thường ghi lại các thông điệp và sự kiện vào các file nhật ký để theo dõi hoạt động của chúng.
Mục đích chính của logrotate
là giữ cho kích thước của các file nhật ký không tăng lên quá mức và đảm bảo rằng không gian đĩa không bị lấp đầy bởi các file nhật ký lớn. Nó thực hiện điều này bằng cách chuyển các file nhật ký cũ sang các file mới và giữ một số lượng hạn chế các file nhật ký. logrotate
cũng có thể thực hiện các tác vụ khác như nén các file nhật ký, sao lưu trước khi thực thi và thực hiện các hành động khác như gửi thông báo khi quá trình thực thi được thực hiện.
logrotate
thường được cấu hình thông qua file cấu hình của nó, thường là /etc/logrotate.conf
hoặc các file cấu hình riêng cho từng ứng dụng trong thư mục /etc/logrotate.d/
. Cấu hình quy định các thiết lập như file nhật ký cần thực thi, tần suất thực thi, số lượng file giữ lại, và các tùy chọn khác.
Để thực hiện thực thi log bằng logrotate
, bạn có thể sử dụng lệnh logrotate
hoặc cài đặt nó như một dịch vụ lên hệ thống để tự động thực hiện quá trình thực thi theo lịch trình được đặt trước.
2. Cách sử dụng Logrotate.
Để sử dụng logrotate
để thực thi log dựa trên kích thước file nhật ký, bạn cần tạo một file cấu hình cho ứng dụng hoặc dịch vụ cụ thể mà bạn muốn áp dụng thực thi.
Dưới đây là một quy trình thực hiện cơ bản:
Tạo một file cấu hình cho ứng dụng/dịch vụ:
Tạo hoặc mở một file cấu hình trong thư mục /etc/logrotate.d/
.
Chẳng hạn, để tạo một file cấu hình cho Apache, bạn có thể sử dụng lệnh sau:
sudo nano /etc/logrotate.d/apache2
Đối với mỗi ứng dụng hoặc dịch vụ, bạn cần một file cấu hình riêng.
Thêm nội dung cấu hình vào file:
Dưới đây là một ví dụ cơ bản của nội dung file cấu hình cho thực thi dựa trên kích thước:
/var/log/apache2/*.log {
size 100M
rotate 5
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/etc/init.d/apache2 reload > /dev/null
endscript
}
- Trong đó:
/var/log/apache2/*.log
: Xác định tất cả các file nhật ký bạn muốn thực thi trong thư mục nhất định.size 100M
: Xác định kích thước file nhật ký trước khi thực hiện thực thi. Trong ví dụ này, thực thi sẽ được kích hoạt khi kích thước lớn hơn 100 megabytes.rotate 5
: Giữ lại 5 bản sao phụ của các file nhật ký đã thực thi.missingok
: Cho phéplogrotate
tiếp tục nếu không có file nhật ký nào tồn tại.notifempty
: Không thực thi nếu file nhật ký trống.compress
vàdelaycompress
: Nén các file nhật ký sau khi thực thi.sharedscripts
: Chia sẻ các tác vụ thực thi giữa tất cả các scripts trongpostrotate
vàendscript
.
- Kiểm tra cấu hình: Bạn có thể kiểm tra cấu hình
logrotate
bằng lệnh sau:
logrotate -d /etc/logrotate.conf
- Lệnh này sẽ mô phỏng quá trình thực thi và hiển thị thông tin chi tiết về những gì sẽ xảy ra.
- Chạy
logrotate
thủ công (tùy chọn): Bạn có thể chạylogrotate
thủ công để kiểm tra hoặc thực hiện thực thi ngay lập tức:
logrotate -f /etc/logrotate.conf
Lệnh này sẽ thực thi log ngay lập tức bằng cách bắt buộc thực hiện quy trình thực thi.
Lưu ý rằng cấu hình có thể thay đổi tùy thuộc vào ứng dụng cụ thể và các yêu cầu của bạn. Hãy tham khảo tài liệu cụ thể của ứng dụng hoặc dịch vụ để biết thêm chi tiết về cách cấu hình logrotate
cho nhu cầu cụ thể của bạn.
3. Đặt lịch cho Logrotate.
Không nhất thiết phải chạy logrotate
thủ công, nhưng việc này là tùy chọn nếu bạn muốn kiểm soát chính xác khi quá trình thực thi diễn ra. logrotate
thường được lên lịch để chạy định kỳ thông qua cron jobs (công việc định kỳ trong hệ thống cron). Nếu bạn đã cài đặt logrotate
và cấu hình của bạn được đặt đúng, thì nó sẽ tự động chạy theo lịch trình.
Các công việc cron liên quan đến logrotate
thường nằm trong thư mục /etc/cron.daily/
hoặc /etc/cron.weekly/
và được kích hoạt tự động theo lịch trình hệ thống. Do đó, các file nhật ký sẽ được thực thi theo định kỳ mà không cần sự can thiệp thủ công của bạn.
Nếu bạn muốn kiểm tra xem cron job của logrotate
đã chạy chưa, bạn có thể kiểm tra các bản ghi trong file nhật ký cron. Sử dụng lệnh như sau:
cat /var/log/syslog | grep logrotate
Hoặc tùy thuộc vào hệ điều hành, bạn có thể kiểm tra file nhật ký cron ở các vị trí khác nhau, chẳng hạn như /var/log/cron
hoặc /var/log/messages
.
Nếu bạn đã cài đặt và cấu hình logrotate
đúng cách và nó được lên lịch chạy bởi cron jobs, thì bạn không cần phải chạy thủ công. Công việc này sẽ tự động thực hiện theo lịch trình của nó.
Trong nhiều hệ điều hành Linux, logrotate
có thể được lên lịch chạy thông qua file /etc/crontab
hoặc các file cron khác trong thư mục /etc/cron.d/
.
Ví dụ, nếu bạn mở file /etc/crontab
, bạn có thể thấy một dòng giống như sau:
*/15 * * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
Dòng này thực hiện công việc của anacron, và nếu bạn không có anacron
, nó sẽ chạy các công việc trong thư mục /etc/cron.daily/
theo lịch trình hàng ngày.
Nếu bạn không thấy logrotate
trong các thư mục cron.daily
, cron.weekly
, hoặc trong /etc/cron.d/
, bạn nên kiểm tra cấu hình cron của hệ thống để đảm bảo rằng logrotate
được lên lịch chạy tự động theo lịch trình bạn mong muốn.
Bạn cũng có thể kiểm tra các file cron trong /etc/cron.d/
để xem liệu có file nào liên quan đến logrotate
không. Nếu không có, bạn có thể tạo một file cron riêng cho logrotate
nếu cần thiết.
4. Tham khảo cách mình áp dụng rotate log cho hệ thống.
Đây là thư mục log của server mà mình sẽ rotate.
tree /var/log/swift/
/var/log/swift/
├── 14.225.10.log
├── 14.225.10.log.1.gz
├── 393a99a1decf4913b970a817dd4bed50.log
├── 393a99a1decf4913b970a817dd4bed50.log.1.gz
├── acc_list
├── container.log
├── container.log.1
├── container.log.2.gz
├── container.log.3.gz
├── container.log.4.gz
├── container.log.5.gz
├── container.log.6.gz
├── container.log.7.gz
├── debug
├── ff1b11f5dca3369e4a3.log
├── ff1b11f5dca3369e4a3.log.1.gz
├── iam.log.10.gz
├── iam.log.1.gz
├── iam.log.5.gz
├── iam.log.6.gz
├── iam.log.7.gz
├── iam.log.8.gz
├── iam.log.9.gz
├── jt_ip.log
├── jt_ip.log.1.gz
├── ktovn.log
├── ktovn.log.1.gz
├── leak_segment.log.10.gz
├── leak_segment.log.1.gz
├── leak_segment.log.5.gz
├── leak_segment.log.6.gz
├── leak_segment.log.7.gz
├── leak_segment.log.8.gz
├── leak_segment.log.9.gz
├── proxy.log
├── proxy.log-2021121506.backup
├── proxy.log-2023080606.backup
├── proxy.log-2024050506.backup
├── proxy.log.2.gz
├── swift.log
├── swift.log.1
├── swift.log.2.gz
├── swift.log.3.gz
└── swift.log.4.gz
0 directories, 44 files
Mình muốn rotate log khi chúng đạt kích thước 70GB, bạn chỉ cần chỉnh lại giá trị size
trong cấu hình:
/var/log/swift/*.log
/var/log/sns-account-swift-sync.log
{
su root root
rotate 10
size 70G
missingok
notifempty
compress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Nếu bạn áp dụng cấu hình để rotate log khi file đạt 70GB, thì khi file log hiện tại đã đạt tới 200GB, việc rotate sẽ diễn ra ngay khi logrotate chạy lần tiếp theo (thường là khi cron thực thi logrotate theo lịch trình của nó).
Những điều quan trọng cần biết:
- Logrotate khi log đã quá lớn:
- Logrotate sẽ thực hiện ngay rotate file log hiện tại (200GB) vì nó đã vượt quá giới hạn
size 70G
. - Log cũ sẽ được nén lại (nếu bạn có
compress
) và lưu dưới dạng các file log cũ với tên dạnglog.1.gz
,log.2.gz
, v.v. theo số lượng rotate bạn quy định (ở đây là 10 file).
- Logrotate sẽ thực hiện ngay rotate file log hiện tại (200GB) vì nó đã vượt quá giới hạn
- Không mất log:
- Logrotate sẽ không làm mất dữ liệu hiện tại trong file log. Nó sẽ tách file log hiện tại (200GB) thành một file mới và tiếp tục ghi log vào file log mới rỗng.
- File log cũ (200GB) sẽ được nén và giữ lại theo số phiên bản mà bạn cấu hình trong
rotate 10
. Bạn sẽ không mất log, trừ khi số lượng bản sao lưu quá nhiều vượt quárotate 10
, thì các bản cũ nhất sẽ bị xóa để nhường chỗ cho các bản mới.
Vì vậy, khi cấu hình này được kích hoạt, file log 200GB sẽ không bị mất, mà chỉ được tách ra và nén lại.
Sau khi bạn chỉnh sửa cấu hình của logrotate
, bạn không cần phải khởi động lại bất kỳ dịch vụ nào. logrotate
sẽ tự động chạy theo lịch trình (thường là qua cron) để thực hiện rotate log.
Tuy nhiên, nếu bạn muốn kiểm tra ngay việc rotate log với cấu hình mới, bạn có thể chạy logrotate
thủ công để kích hoạt quá trình này:
logrotate -f /etc/logrotate.d/swift
Tùy chọn -f
(force) sẽ ép buộc logrotate
thực hiện rotate ngay lập tức, kể cả khi log chưa đạt kích thước hoặc chưa đến thời gian định trước. Sau khi chạy lệnh này, log 200GB của bạn sẽ được rotate ngay lập tức theo cấu hình bạn đã chỉnh.
Để tránh lỗi "logrotate -f /etc/logrotate.d/swift error: skipping "/var/log/sns-account-swift-sync.log" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation
có thể thêm chỉ thị su
trong file cấu hình logrotate
để chỉ định người dùng và nhóm sẽ thực thi quá trình rotate. Cách này thường là đơn giản nhất và không thay đổi quyền trên thư mục.
Thêm dòng su root root
vào cấu hình trong /etc/logrotate.d/swift
như sau:
/var/log/swift/*.log
/var/log/sns-account-swift-sync.log
{
su root root # Thêm dòng này
rotate 10
daily
size 70G
missingok
notifempty
compress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Dòng su root root
cho phép logrotate
thực hiện dưới quyền của user root
và group root
, bất kể quyền của thư mục log.
Nếu bạn muốn đảm bảo quyền truy cập cho thư mục là an toàn hơn, bạn có thể sửa lại quyền của thư mục chứa file log. Đảm bảo thư mục không có quyền ghi cho “world” hoặc nhóm không phải là root
. Bạn có thể kiểm tra và sửa lại quyền bằng cách:
sudo chmod go-w /var/log/swift
Câu lệnh này sẽ loại bỏ quyền ghi cho “group” (g) và “others” (o) đối với thư mục /var/log/swift
.
Sau đó, bạn có thể chạy lại lệnh logrotate
mà không gặp lỗi trên nữa.
Lưu ý nếu bạn sử dụng cả rotate 10
(giữ lại 10 phiên bản log cũ) và daily
(rotate log hàng ngày). Nếu log không đạt tới kích thước 100GB trong một ngày, log sẽ không rotate. Bạn có thể chỉ cần một trong hai: size
hoặc daily
, tùy vào nhu cầu của hệ thống.
/var/log/swift/*.log
/var/log/sns-account-swift-sync.log
{
rotate 10 # Giữ lại 10 phiên bản log cũ
daily # Rotate hàng ngày
size 1G # Rotate khi log đạt tới 1GB
missingok # Bỏ qua nếu file log không tồn tại
notifempty # Không rotate nếu log rỗng
compress # Nén các file log cũ
sharedscripts # Dùng chung tập lệnh postrotate cho tất cả file log
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Bạn có thể điều chỉnh lại size
nếu muốn log lớn hơn trước khi rotate.