Logrotate là gì, cách hoạt động thực sự ra sao?

Nhật ký (logs) là một công cụ hữu ích khi bạn muốn theo dõi việc sử dụng hoặc khắc phục sự cố của một ứng dụng. Tuy nhiên, khi có thêm thông tin được ghi vào, kích thước của tệp nhật ký cũng tăng lên, sử dụng thêm không gian đĩa. Theo thời gian, một tệp nhật ký có thể trở nên quá lớn và khó kiểm soát. Việc hết không gian đĩa vì một tệp nhật ký lớn là một vấn đề, nhưng một tệp nhật ký lớn cũng có thể làm chậm quá trình thay đổi kích thước hoặc sao lưu máy chủ ảo của bạn. Ngoài ra, việc tìm kiếm một sự kiện cụ thể trong hàng triệu lần nhập nhật ký cũng là một thách thức. Vì vậy, việc giữ cho các tệp nhật ký có kích thước quản lý và cắt bớt chúng khi chúng trở nên quá cũ để sử dụng là một ý tưởng tốt.

Tiện ích logrotate làm cho việc quay vòng nhật ký trở nên dễ dàng. "Quay vòng nhật ký" đề cập đến việc lưu trữ nhật ký hiện tại của một ứng dụng, bắt đầu một nhật ký mới và xóa nhật ký cũ. Hệ thống thường chạy logrotate một lần mỗi ngày, và khi chạy, nó kiểm tra các quy tắc có thể được tùy chỉnh theo từng thư mục hoặc từng nhật ký.

what is logrotate

Cách logrotate hoạt động

Hệ thống chạy logrotate theo lịch trình, thường là hàng ngày. Trên hầu hết các bản phân phối, tập lệnh chạy logrotate hàng ngày được đặt tại /etc/cron.daily/logrotate.

Một số bản phân phối sử dụng một biến thể. Ví dụ, trên Gentoo, tập lệnh logrotate được đặt tại /etc/cron.daily/logrotate.cron.

Nếu bạn muốn logrotate chạy thường xuyên hơn (ví dụ: quay vòng nhật ký hàng giờ), bạn cần sử dụng cron để chạy logrotate thông qua một tập lệnh trong /etc/cron.hourly.

Khi logrotate chạy, nó đọc các tệp cấu hình để xác định nơi tìm tệp nhật ký cần quay vòng, tần suất quay vòng tệp, và số lượng tệp nhật ký đã lưu trữ.

logrotate.conf

Tệp cấu hình chính của logrotate nằm tại /etc/logrotate.conf.

Tệp này chứa các tham số mặc định mà logrotate sử dụng khi quay vòng nhật ký. Tệp này đã được chú thích, giúp bạn có thể nhanh chóng xem qua để hiểu cách cấu hình được thiết lập. Một số lệnh cụ thể trong tệp này sẽ được mô tả sau trong bài viết này.

Lưu ý rằng một dòng trong tệp đọc như sau:

include /etc/logrotate.d 

Thư mục đó chứa hầu hết các tệp cấu hình cụ thể cho từng ứng dụng.

logrotate.d

Sử dụng lệnh sau để liệt kê nội dung của thư mục lưu trữ cài đặt nhật ký cụ thể cho ứng dụng:

ls /etc/logrotate.d 

Tùy thuộc vào mức độ cài đặt trên máy chủ của bạn, thư mục này có thể không chứa tệp hoặc chứa một số tệp. Nói chung, các ứng dụng được cài đặt thông qua trình quản lý gói của bạn cũng sẽ tạo một tệp cấu hình trong /etc/logrotate.d.

Thường thì thư mục này chứa một tệp cấu hình cho dịch vụ syslog của bạn, mà logrotate đọc khi quay vòng nhật ký hệ thống. Tệp này bao gồm một nhập cho các nhật ký hệ thống khác nhau, cùng với một số lệnh tương tự như những gì chứa trong logrotate.conf.

LƯU Ý: Trên các phiên bản hệ điều hành Ubuntu trước Karmic Koala (9.10), không có nhập cho dịch vụ syslog. Trước phiên bản đó, các nhật ký hệ thống được quay vòng bằng một lệnh savelog chạy từ tập lệnh /etc/cron.daily/sysklogd.

Bên trong một tệp cấu hình của ứng dụng

Ví dụ, hãy xem xét nội dung của một tệp cấu hình logrotate có thể được thiết lập khi bạn cài đặt Apache trên một hệ thống Fedora:

/var/log/httpd/*log {
    missingok
    notifempty
    sharedscripts
    postrotate
    /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
  }

Khi logrotate chạy, nó kiểm tra tất cả các tệp trong /var/log/httpd mà kết thúc bằng log và quay vòng chúng nếu chúng không trống. Nếu nó kiểm tra thư mục httpd và không tìm thấy bất kỳ tệp nhật ký nào, nó sẽ không tạo ra lỗi. Sau đó, nó chạy lệnh trong khối postrotate/endscript (trong trường hợp này, là một lệnh thông báo Apache để khởi động lại), nhưng chỉ sau khi nó đã xử lý tất cả các nhật ký được chỉ định.

Ví dụ này không chứa một số cài đặt được bao gồm trong tệp logrotate.conf. Những lệnh trong logrotate.conf đóng vai trò như các giá trị mặc định cho quay vòng nhật ký. Bạn có thể chỉ định các cài đặt khác nhau cho bất kỳ ứng dụng nào khi bạn muốn ghi đè lên các giá trị mặc định. Ví dụ, nếu bạn đang chạy một máy chủ web bận rộn, bạn có thể muốn bao gồm một lệnh hàng ngày trong khối cấu hình Apache để nhật ký của Apache quay vòng hàng ngày thay vì quay vòng theo chu kỳ mặc định là hàng tuần.

Phần tiếp theo mô tả một số lệnh thường được sử dụng trong một tệp cấu hình logrotate.

Các lệnh cấu hình

Bạn có thể xem danh sách đầy đủ các lệnh được sử dụng trong các tệp cấu hình logrotate bằng cách kiểm tra trang man:

man logrotate

Phần này mô tả một số lệnh thường được sử dụng hơn trong một tệp cấu hình logrotate.

Hãy nhớ rằng các tệp cấu hình cho ứng dụng trong /etc/logrotate.d thừa hưởng các giá trị mặc định từ tệp /etc/logrotate.conf chính.

Tệp nhật ký

Một tệp nhật ký và hành vi quay vòng của nó được xác định bằng cách liệt kê tệp nhật ký (hoặc các tệp) theo sau bởi một bộ lệnh được bao quanh bởi dấu ngoặc nhọn. Hầu hết các tệp cấu hình ứng dụng sẽ chỉ chứa một trong những khối này, nhưng có thể đặt nhiều hơn một trong một tệp, hoặc thêm các khối tệp nhật ký vào tệp logrotate.conf chính.

Bạn có thể liệt kê nhiều hơn một tệp nhật ký cho một khối bằng cách sử dụng dấu sao trong tên hoặc bằng cách tách các tệp nhật ký trong danh sách bằng khoảng trắng. Ví dụ, để chỉ định tất cả các tệp trong thư mục /var/foo kết thúc bằng .log và tệp /var/bar/log.txt, bạn sẽ thiết lập khối như sau:

/var/foo/*.log /var/bar/log.txt {
        rotate 14
        daily
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/sbin/apachectl graceful > /dev/null
        Endscript
}

Rotate count

Lệnh rotate xác định có bao nhiêu tệp nhật ký được giữ lại trước khi logrotate bắt đầu xóa những tệp cũ hơn. Ví dụ:

rotate 4 

Lệnh này cho biết cho logrotate giữ lại bốn tệp nhật ký được lưu trữ mỗi lần. Nếu bốn tệp nhật ký tồn tại khi nhật ký được quay vòng lại, tệp cũ nhất sẽ được xóa để làm chỗ cho bản lưu trữ mới.

Khoảng thời gian quay vòng (Rotation interval)

Bạn có thể chỉ định một lệnh để cho logrotate biết cách thức thường xuyên quay vòng một nhật ký cụ thể. Các lệnh có thể bao gồm:

daily
weekly
monthly
yearly

Nếu không có khoảng thời gian quay vòng được chỉ định, nhật ký sẽ được quay vòng mỗi khi logrotate chạy (trừ khi có điều kiện khác như size đã được thiết lập).

Nếu bạn muốn sử dụng một khoảng thời gian khác ngoài các khoảng thời gian đã định, bạn cần sử dụng cron để tạo một tệp cấu hình riêng biệt. Ví dụ, nếu bạn muốn quay vòng một tệp nhật ký cụ thể hàng giờ, bạn có thể tạo một tệp trong /etc/cron.hourly (bạn có thể cần tạo thư mục đó nếu nó chưa tồn tại) chứa một dòng như sau:

/usr/sbin/logrotate /etc/logrotate.hourly.conf

Sau đó, bạn sẽ đặt cấu hình cho lần chạy hàng giờ của logrotate đó (vị trí tệp nhật ký, liệu có nén các tệp cũ hay không, vv.) vào /etc/logrotate.hourly.conf.

Kích thước

Bạn có thể sử dụng lệnh size để xác định kích thước tệp mà logrotate sẽ kiểm tra khi xác định xem có thực hiện quay vòng hay không. Định dạng của lệnh cho biết cho logrotate đơn vị bạn đang sử dụng để chỉ định kích thước:

size 100k
size 100M
size 100G

Ví dụ đầu tiên sẽ quay vòng nhật ký nếu nó lớn hơn 100 kilobyte, và ví dụ thứ hai nếu nó lớn hơn 100 megabyte, và ví dụ thứ ba nếu nó lớn hơn 100 gigabyte. Tôi không khuyến khích sử dụng giới hạn là 100G, đây chỉ là một ví dụ hơi quá mức.

Lệnh size có ưu tiên hơn và thay thế khoảng thời gian quay vòng nếu cả hai đều được thiết lập.

Nén

Nếu bạn muốn các tệp nhật ký được lưu trữ được nén (định dạng gzip), bạn có thể bao gồm lệnh sau đây, thường là trong /etc/logrotate.conf:

compress 

Nén thông thường là một ý tưởng tốt, vì tệp nhật ký thường chỉ là văn bản và văn bản nén tốt. Tuy nhiên, nếu bạn có một số tệp nhật ký được lưu trữ mà bạn không muốn nén, nhưng bạn vẫn muốn mặc định bật chế độ nén, bạn có thể bao gồm lệnh sau đây trong cấu hình cụ thể cho ứng dụng:

nocompress 

Một lệnh khác liên quan đến việc nén là như sau:

delaycompress 

Lệnh này hữu ích nếu bạn muốn nén các tệp nhật ký được lưu trữ, nhưng muốn trì hoãn quá trình nén. Khi delaycompress được kích hoạt, một tệp nhật ký được nén lần tiếp theo khi nhật ký được quay vòng. Điều này quan trọng khi bạn có một chương trình có thể vẫn ghi vào tệp nhật ký cũ một thời gian sau khi tệp mới được quay vòng vào. Lưu ý rằng delaycompress chỉ hoạt động nếu bạn có compress trong cấu hình của bạn.

Một ví dụ về lúc tốt để sử dụng delaycompress là khi logrotate được thông báo để khởi động lại Apache với chỉ thị "graceful" hoặc "reload". Vì quy trình Apache cũ không kết thúc cho đến khi kết nối của chúng được hoàn thành, chúng có thể thử ghi thêm các mục vào tệp cũ trong một khoảng thời gian sau khi khởi động lại. Trì hoãn việc nén đảm bảo rằng bạn sẽ không mất các mục nhật ký bổ sung đó khi các nhật ký được quay vòng.

Postrotate

Logrotate chạy tập lệnh postrotate mỗi khi quay vòng một tệp nhật ký được chỉ định trong một khối cấu hình. Bạn thường muốn sử dụng tập lệnh này để khởi động lại một ứng dụng sau khi quay vòng nhật ký để ứng dụng có thể chuyển sang một nhật ký mới.

postrotate
/usr/sbin/apachectl restart > /dev/null
endscript
  • /dev/null báo cho logrotate để đưa ra đầu ra của lệnh đến đâu đó không. Trong trường hợp này, bạn không cần xem đầu ra nếu ứng dụng khởi động lại đúng cách.
  • Lệnh postrotate cho biết cho logrotate rằng tập lệnh để chạy bắt đầu ở dòng tiếp theo, và lệnh endscript nói rằng tập lệnh đã hoàn thành.

Sharedscripts

Thường logrotate chạy tập lệnh postrotate mỗi khi nó quay vòng một tệp nhật ký. Điều này cũng đúng đối với nhiều tệp nhật ký sử dụng cùng một khối cấu hình. Ví dụ, một khối cấu hình máy chủ web mà tham chiếu đến cả nhật ký truy cập và nhật ký lỗi sẽ, nếu cả hai đều được quay vòng, chạy tập lệnh postrotate hai lần (một lần cho mỗi tệp được quay vòng). Nếu cả hai tệp đều được quay vòng, máy chủ web sẽ được khởi động lại hai lần.

Để ngăn logrotate chạy tập lệnh đó cho mỗi tệp nhật ký, bạn có thể bao gồm lệnh sau đây:

sharedscripts

Lệnh này báo cho logrotate kiểm tra tất cả các nhật ký cho khối cấu hình đó trước khi chạy tập lệnh postrotate. Nếu một hoặc cả hai nhật ký được quay vòng, tập lệnh postrotate chỉ chạy một lần. Nếu không có nhật ký nào được quay vòng, tập lệnh postrotate sẽ không chạy.

Trong thế giới hệ điều hành Linux, logrotate không chỉ là một công cụ quản lý nhật ký mạnh mẽ mà còn là một chiếc chìa khóa quan trọng giúp duy trì hiệu suất và bảo mật hệ thống. Việc kiểm soát kích thước và quản lý các tệp nhật ký không chỉ giúp tiết kiệm không gian đĩa mà còn đảm bảo khả năng theo dõi và xử lý sự cố hiệu quả.

Thông qua cách logrotate hoạt động và cấu hình linh hoạt, người quản trị hệ thống có thể tùy chỉnh quy tắc quay vòng theo nhu cầu cụ thể của họ. Việc này không chỉ giúp họ duy trì môi trường hệ thống ổn định mà còn đảm bảo rằng các thông tin quan trọng vẫn được ghi lại mà không làm giảm hiệu suất.

Tóm lại, logrotate không chỉ là một công cụ quản lý nhật ký thông thường, mà là một trợ thủ đắc lực đối với người quản trị hệ thống Linux, giúp họ duy trì sự ổn định và an toàn của hệ thống thông qua việc quản lý thông tin nhật ký một cách thông minh và hiệu quả.