logrotating các tập tin trong một thư mục và thư mục con của nó


62

Có thể logrotatexem xét các logfiles trong một thư mục và tất cả các thư mục con của nó không? (tức là không liệt kê rõ ràng các thư mục con.)

Câu trả lời:


87

Làm thế nào sâu thư mục con của bạn đi?

/var/log/basedir/*.log /var/log/basedir/*/*.log {
    daily
    rotate 5
}

Sẽ xoay tất cả các tệp .log trong dựa trên / cũng như tất cả các tệp .log trong bất kỳ con trực tiếp nào của dựa trên. Nếu bạn cũng cần phải đi sâu hơn 1 cấp, chỉ cần thêm một cấp độ khác /var/log/basedir/*/*/*.logcho đến khi bạn có mỗi cấp độ được bảo hiểm.

Điều này có thể được kiểm tra bằng cách sử dụng tệp cấu hình logrotate riêng có chứa một ràng buộc sẽ không được đáp ứng (kích thước cao) và sau đó chạy nhật ký tự xoay trong chế độ dài dòng

logrotate -d testconfig.conf

cờ -d sẽ liệt kê từng tệp nhật ký mà nó đang xem xét để xoay.


6
Cảm ơn! Có vẻ như -dđặt logrotate ở chế độ chạy khô (nghĩa là không thực sự thay đổi bất cứ điều gì) thực sự.
ithinkihaveacat

1
Không thực sự liên quan trực tiếp nhưng có lẽ hữu ích cho ai đó. các -ftùy chọn bảo logrotate để "lực lượng chạy". một từ trống ở cuối lệnh là một tệp cấu hình để sử dụng thay vì mặc định. vì vậy logrotate -f /some/configcó nghĩa là chạy với tệp cấu hình đó và luôn chạy ngay cả khi tệp cấu hình cho biết chưa đến lúc chạy. Đối với đôi mắt chưa được huấn luyện của tôi và người tiền nhiệm của tôi, người đã thực hiện một công việc định kỳ với điều đó, có vẻ như -fchỉ là chỉ định tệp cấu hình. Hơi bối rối.
Dan Pritts

4

Trong trường hợp của tôi, độ sâu của thư mục con có thể thay đổi mà không có cảnh báo, vì vậy tôi đã thiết lập một tập lệnh bash để tìm tất cả các thư mục con và tạo một mục cấu hình cho mỗi thư mục.

Điều quan trọng đối với tôi là giữ cấu trúc của các thư mục con sau khi xoay, điều mà các ký tự đại diện (tức là câu trả lời của @ DanR) dường như không làm được. Nếu bạn đang thực hiện luân chuyển nhật ký hàng ngày, bạn có thể đặt tập lệnh này vào công việc định kỳ hàng ngày.

basedir=/var/log/basedir/
#destdir=${basedir} # if you want rotated files in the same directories
destdir=/var/log/archivedir/ #if you want rotated files somewhere else
config_file=/wherever/you/keep/it
> ${config_file} #clear existing config_file contents

subfolders = $(find ${basedir} -type d)

for ii in ${subfolders}
do
    jj=${ii:${#basedir}} #strip off basedir, jj is the relative path

    #append new entry to config_file
    echo "${basedir}${jj}/* {
        olddir ${destdir}${jj}/
        daily
        rotate 5
    }" >> ${config_file}

    #add one line as spacing between entries
    echo "\n" >> ${config_file}

    #create destination folder, if it doesn't exist
    [ -d ${destdir}${jj} ] || mkdir ${destdir}${jj}
done

Giống như @DanR đề xuất, hãy thử với logrotate -d


1

Đó là chủ đề cũ, nhưng bạn có thể làm như sau:

/var/log/basedir/**/*.log {
    daily
    rotate 5
}

Hai ngôi sao này sẽ khớp với 0 hoặc nhiều thư mục. Tuy nhiên, bạn phải cẩn thận với cách bạn xác định các tệp nhật ký sẽ được xoay, bởi vì bạn có thể xoay các tệp đã được xoay. Tôi sẽ trích dẫn hướng dẫn sử dụng logrotate ở đây.

Vui lòng sử dụng các ký tự đại diện một cách thận trọng. Nếu bạn chỉ định *, logrotate sẽ xoay tất cả các tệp, bao gồm cả các tệp đã xoay trước đó. Một cách khác là sử dụng chỉ thị olddir hoặc ký tự đại diện chính xác hơn (như * .log).


3
mẫu ký tự đại diện này không làm việc cho tôi. Logrotate 3.8.6 trên RHEL 7.3
phía bắc

Có lẽ bạn nên kích hoạt globstartrước khi chạy logrotate. Điều này sẽ cho phép nó cho bash shopt -s globstar.
bat_ventzi

Tôi có cùng một vấn đề. Logrotate 3.8.7 trên Ubuntu 16.04.3. ls /var/log/basingir/**/*.log hoạt động như mô tả, nhưng logrotate thì không.
ếchstarr78

tôi cũng không làm việc với logrotate 3.11.0. Tôi không nghĩ rằng việc mở rộng bash có liên quan đến các ký tự đại diện logrotate. (ngoại trừ cú pháp tương tự)
Thayne
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.