Sunday, January 19, 2025

Tiện ích logrotate trong Linux

-

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ép logrotate 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.
    • compressdelaycompress: 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 trong postrotateendscript.
  • 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ạy logrotate 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ạng log.1.gz, log.2.gz, v.v. theo số lượng rotate bạn quy định (ở đây là 10 file).
  • 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.

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories