Logrotate không hoạt động


18

Tôi đang cố gắng để logrotate hoạt động trên VPS của mình để xoay các tệp apache hàng tuần. Hiện tại nội dung của tập tin cấu hình apache2 là như vậy.

"/var/www/user/site.com/logs/*.log"   {
        weekly
        missingok
        rotate 8
        compress
        delaycompress
        notifempty
        create 640 root adm
        sharedscripts
        postrotate
                /etc/init.d/apache2 reload > /dev/null
        endscript
}

Tôi đã để nó được hai tuần rồi và không có gì thay đổi như tôi có thể nói. Khi tôi mô phỏng nó từ dòng lệnh tôi nhận được đầu ra sau.

user@geneva:/var/lib/logrotate$ /usr/sbin/logrotate -d /etc/logrotate.d/apache2
reading config file /etc/logrotate.d/apache2
reading config info for "/var/www/user/site.com/logs/*.log" 

Handling 1 logs

rotating pattern: "/var/www/user/site.com/logs/*.log"     weekly (8 rotations)
empty log files are not rotated, old logs are removed
considering log /var/www/user/site.com/logs/access.log
  log does not need rotating
considering log /var/www/user/site.com/logs/error.log
  log does not need rotating
not running postrotate script, since no logs were rotated

Bất cứ ý tưởng nào về những gì Iv'e cấu hình sai?

Tệp trạng thái của tôi cũng trống :(

user@geneva:~$ cat /var/lib/logrotate/status
logrotate state -- version 2

Cập nhật

Tôi đã xóa tệp trạng thái và thực hiện một động tác chạy logrotate và bây giờ các bản ghi trông giống như chúng đã được xoay và tệp trạng thái có vẻ hứa hẹn hơn!

sudo rm /var/lib/logrotate/status

sudo /usr/sbin/logrotate -f /etc/logrotate.conf

Câu trả lời:


17

Tôi nghĩ điều đó weeklycó nghĩa là logrotate muốn xem mục nhập ít nhất một tuần cho tệp access.log của bạn để xoay nó.

Do đó, vấn đề dường như là bạn không lưu trữ mục trạng thái để kích hoạt xoay vòng.


Dưới đây là ví dụ từng bước về trường hợp đơn giản, về cách logrotate quyết định xoay logfile
(đây là các đường dẫn fedora, Ubuntu, Centos, v.v.

(Tôi đã thực hiện một vài yêu cầu để http://localhostcó một số mục trong access_log, nếu không thì logrotate không bao giờ xoay ...)

Vì vậy, tôi đã thiết lập logrotate của mình cho apache hàng tuần như vậy;

/var/log/httpd/*log {
        weekly
...
}

và ban đầu không có mục nào trong /var/lib/logrotate.statustập tin

# grep access_log /var/lib/logrotate.status
<- nothing

Vì vậy, logrotate không xoay access_logtệp;

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 ...
considering log /var/log/httpd/access_log
  log does not need rotating

Tuy nhiên nếu tôi chạy logrotate bằng tay như vậy;

#  /usr/sbin/logrotate   /etc/logrotate.d/httpd 

bây giờ có một mục trong tệp trạng thái cho httpd access_log;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-5-11

Tuy nhiên, apache vẫn không thể xoay vòng nhật ký, vì mục nhập chỉ 0 ngày tuổi (2012-5-11);

  #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd 
 considering log /var/log/httpd/access_log
   log does not need rotating

Tuy nhiên, nếu bạn chỉnh sửa tệp trạng thái bằng vi vi /var/lib/logrotate.statusđể một cái gì đó như thế này sẽ đặt ngày thành hơn một tuần ...;

 # grep access_log /var/lib/logrotate.status
 "/var/log/httpd/access_log" 2012-4-11    <---    more than a week ago..

Sau đó, logrotate bây giờ xoay chính xác tệp do ngày trong tệp trạng thái 2012-4-11cách đây hơn một tuần kể từ hôm nay2012-5-11

 #  /usr/sbin/logrotate  -d /etc/logrotate.d/httpd
 considering log /var/log/httpd/access_log
 log needs rotating           <---    logrotate rotates the file.

(lưu ý rằng các -dnguyên nhân gây ra chạy khô, do đó chỉ hữu ích cho việc kiểm tra, bạn phải thực sự chạy lệnh mà không -dthực hiện các mục trạng thái hoặc xoay tệp, v.v.)


1
Các tệp nhật ký đã có các mục nhập hơn một tuần tuổi - Có vẻ như nó đang hoạt động, tuy nhiên tôi đoán tôi sẽ tìm ra một tuần kể từ bây giờ ...
Malachi

2
Xin lỗi, tôi có thể đã rõ ràng hơn trong câu trả lời, nhưng tôi nghĩ rằng để xoay vòng hàng tuần, nó cần một mục trong tệp /var/lib/logrotate.statuscó ngày ít nhất một tuần. Tôi đã cập nhật câu trả lời bằng một ví dụ ...
Tom H

Cảm ơn về lời giải thích rõ ràng như vậy - Tôi hoàn toàn hiểu về mặt ngày của mọi thứ, chỉ là chúng không xoay trừ khi tôi gọi lệnh theo cách thủ công ... Có phải như thể CRON không gọi nhật ký xoay?
Malachi

Tôi còn khá mới đối với quản trị Linux ... Bên trong /etc/cron.daily/logrotate/ có: #! / Bin / sh test -x / usr / sbin / logrotate || thoát 0
Malachi

7
log does not need rotating

Điều này có thể là do bạn đăng nhập tập tin trống.
Tình huống này có thể xảy ra vì apache vẫn ghi trong tệp nhật ký trước đó, đã được đổi tên mà không khởi động lại apache. Vì vậy, access.log đã trở thành access.log.1 và apache ghi vào nó.

Hoặc bạn gặp vấn đề với thời gian tạo nhật ký:

ls -al --time=ctime /var/www/user/site.com/logs/

Bạn có thể nhận xét notifemptydòng để xử lý các bản ghi 0 byte không quay. Sau đó, bạn sẽ muốn touchmột tệp nhật ký mới trước mỗi bài kiểm tra để logrotate có thứ gì đó để xoay.
Banjer

6

Tôi đã đối mặt với vấn đề tương tự ngoại trừ không có câu trả lời nào trong số này giúp tôi. Tệp nhật ký của tôi rất lớn và cũ, cấu hình của tôi là 100% ok và hợp lệ, xóa tệp trạng thái không giúp được gì.

Hóa ra vấn đề là trong các mục logrotate trùng lặp . Khi tôi chạy logrotate thủ công trên tệp cấu hình của mình như thế:

logrotate -df /etc/logrotate.d/my_service_name

Nó không hiển thị bất kỳ lỗi nào, nó chỉ nói:

log does not need rotating

Tôi vẫn không biết tại sao thực sự. Nhưng khi tôi chạy một lệnh logrotate hoàn chỉnh như thế:

logrotate -f /etc/logrotate.conf

Tôi đã nhận được dòng sau:

error: my_service_name:1 duplicate log entry for /var/log/nginx/my_service_name.access.log

Hóa ra tệp cấu hình logrotate cho dịch vụ của tôi chứa các mục để xoay nhật ký truy cập nginx cũng như bản ghi dịch vụ. Và điều đó đã mâu thuẫn với cấu hình logrotate ngnix, có một quy tắc cho tất cả các mục nginx:

# grep nginx /etc/logrotate.d/*
/etc/logrotate.d/nginx:/var/log/nginx/*.log {

Vì vậy, giải pháp cho trường hợp của tôi khá đơn giản: Tôi vừa phải xóa quy tắc xoay vòng nhật ký nginx khỏi cấu hình của mình .

Tôi cho rằng logrotate bắt đầu hủy bỏ tệp xử lý trên các xung đột quy tắc chỉ từ một trong các phiên bản mới nhất. Tôi gặp lỗi này với v.3.8.7 nhưng theo v.3.7.8 với cùng cấu hình xung đột, nó ghi cùng một lỗi nhưng xoay tốt. Mặc dù tôi không thể tìm thấy bất kỳ bản ghi nào trong danh sách thay đổi logrotate.


bạn có vẻ đúng về các phiên bản gần đây nhất. Tôi cũng có các mục trùng lặp; nhưng khi chạy logrotate bằng tay; nó hoạt động tốt Vào ban đêm giá trị trả về 0; nhưng nó đã không chạy chính xác ...
Chris Maes

2

Hãy thử chạy sudo logrotate -f --verbose /etc/logrotate.d/apache2 Xem những gì được viết trong bảng điều khiển và khắc phục mọi thứ sai.


0

Tôi đã có một máy Debian 7, sau khi cập nhật hệ thống, không xoay nhật ký thư nữa. Tất cả các bản ghi khác nhưng thư đã được xoay chính xác. Tôi phát hiện ra rằng nhật ký thư đã tăng lên vài gigabyte. Tôi luôn quản lý luân chuyển nhật ký thông qua Webmin. Sau đó, khi chạy logrotate -d /etc/logrotate.conftôi thấy thông báo sau:

Ignoring rsyslog.dpkg-old, because of .dpkg-old ending

Nó xuất hiện rằng các mục xoay vòng thư của tôi đã được liệt kê trong /etc/logrotate.d/rsyslog.dpkg-oldđó, đã bị bỏ qua! Đổi tên tệp đã sửa vòng xoay tệp nhật ký :-)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.