Logrotate: Xoay tập tin không đăng nhập?


17

Tôi có một tập lệnh sao lưu nén các tập tin và thư mục khác nhau và tạo tài liệu lưu trữ .tgz. Các tệp được đặt tên, ví dụ:

...
backup_2010-10-28.tar.gz
backup_2010-10-29.tar.gz
backup_2010-10-30.tar.gz
backup_2010-10-31.tar.gz
backup_2010-11-01.tar.gz

Tôi muốn quản lý các tệp này để chỉ có 5 bản sao lưu cuối cùng được giữ, với các tệp cũ hơn sẽ bị xóa.

Tôi có thể sử dụng logrotate để làm điều này? Chúng không phải là tệp nhật ký và đã được nén. Họ đang ở / root chứ không phải trong / var / log - tôi vẫn có thể sử dụng nó chứ?

Cảm ơn

Câu trả lời:


3

Logrotate xoay tập tin, vì vậy câu trả lời là có - có thể, và nếu không có đủ quyền thì hãy đặt chúng vào / sao lưu hoặc một cái gì đó. Kiểm tra nhóm và người dùng nhật ký xoay vòng có :-).

Có các tùy chọn để nén trong logrotate, vì nếu "nén" KHÔNG được định cấu hình - thì nó sẽ không thử. Cũng trong trường hợp của bạn, tùy chọn "xoay 5".

Hãy xem /etc/logrotate.d (hoặc bất cứ nơi nào nó được lưu trữ trong hệ thống của bạn)


26

Nếu không có thay đổi trong quy trình của bạn, thì logrotate sẽ không làm những gì bạn đang tìm kiếm ở đây. Vấn đề chính ở đây là, trong khi logrotate có thể lấy ký tự đại diện, nó sẽ không coi các tệp là một nếu bạn làm như vậy và thay vào đó sẽ cố gắng xoay tất cả chúng, đây chắc chắn KHÔNG phải là điều bạn muốn.

Tuy nhiên, bạn có thể làm cho nó hoạt động theo cách bạn mô tả miễn là bản sao lưu gần đây nhất được tạo mà không có dấu ngày. Nếu bạn tạo quá trình sao lưu /root/backup.tar.gz, bạn có thể sử dụng cấu hình logrotate sau:

/root/backup.tar.gz {
    rotate 5
    nocompress
    dateext
    dateformat _%Y-%m-%d
    extension .tar.gz
    missingok
}

Tóm tắt nhanh các tùy chọn ở đây:

  • rotate 5 - giữ 5 vòng quay trước khi xóa
  • nocompress - không nén các tập tin sau khi xoay
  • dateext - sử dụng ngày làm phần mở rộng xoay thay vì tăng số
  • dateformat _%Y-%m-%d - đặt định dạng tiện ích mở rộng ngày bạn muốn sử dụng
  • extension .tar.gz- thực hiện .tar.gzsau khi mở rộng xoay
  • missingok - nếu tệp chúng tôi muốn xoay không có ở đó, đừng lo lắng về nó và tiếp tục (mặc định là để ném lỗi)

Hi vọng điêu nay co ich!


1
Công việc tốt đẹp. Tôi đã học được một vài điều bằng cách đọc này. Mặc dù vậy, tôi muốn thêm rằng một số bản phân phối, đặc biệt là RedHat EL, có xu hướng loại bỏ các tùy chọn không phải là "Sẵn sàng cho doanh nghiệp", vì vậy YMMV.
zerolagtime

Theo giải pháp này stackoverflow.com/questions/14858752/ log logate có thể hoàn thành nhiệm vụ.
Pieter

22

Bạn không phải sử dụng logrotate để làm điều đó. Chỉ cần sử dụng một lệnh như thế này:

ls -1 /root/backup_* | sort -r | tail -n +6 | xargs rm > /dev/null 2>&1

Lệnh này sẽ để lại 5 tệp gần đây nhất và xóa phần còn lại (nếu có). Bạn có thể sử dụng nó trong một công việc định kỳ.


nhưng điều này không xoay ....
đơn giản

Không trả lời câu hỏi.
kubanchot

4
Câu hỏi là để giữ năm bản sao lưu gần đây nhất, điều này thực hiện chính xác điều đó. Thậm chí đơn giản hơn: ls -t1 / root / backup_ * | đuôi -n +6 | xargs rm -f
yoyoma2

Điều này đã trả lời câu hỏi của tôi . Đáng buồn thay, câu hỏi ban đầu là câu hỏi gần nhất tôi có thể tìm thấy với Google-fu.
Sukima

0

Tôi chỉ có tình huống tương tự. Logrotate nghe có vẻ hay nhưng nó không hoạt động với tôi 100% vì nó không khớp với dữ liệu và tên tệp.

Vì vậy, để tránh nhầm lẫn, tôi quyết định kết hợp dòng sau để thực thi sau khi tạo bản sao lưu hiện tại của mình để giữ 5 bản sao lưu cuối cùng.

Nhật ký của tôi là:

  • tbl-bcx-20180308_010501.tar.bz2
  • tbl-bcx-20180307_010501.tar.bz2
  • tbl-bcx-20180306_010501.tar.bz2

Dòng mới vào tập lệnh sao lưu của tôi (dựa trên nhận xét ở trên)

  • tìm / BCX / dumpsql / -type f | sắp xếp -r | đuôi -n +6 | xargs rm

Trân trọng,


-1

Bạn có thể xoay nó bằng tay.

rotating_logger()
{

_LOG_FILE_=${1}
_MESSAGE_TO_ECHO_=${2}

_LOG_FILE_BYTES_SIZE_=`wc -c ${_LOG_FILE_} | awk '{print $1}'`

#echo "_LOG_FILE_BYTES_SIZE_ : ${_LOG_FILE_BYTES_SIZE_}"

# in MB
if [ ${_LOG_FILE_BYTES_SIZE_} -gt ${_FILE_SIZE_IN_BYTES_} ] ; then
        #cat /dev/null > ${_LOG_FILE_}
         for (( i=${_LOG_ROTATE_MAX_INDEX_}; i>=1; i-- ))
        do
                 if [ $i -eq ${_LOG_ROTATE_MAX_INDEX_} -a -f ${_LOG_FILE_}.$i ] ; then
                        rm -rf ${_LOG_FILE_}.$i
                 fi

                if [ $i -gt 10 ] ; then
                        rm -rf ${_LOG_FILE_}.10
                elif [ $i -eq 9 -a -f ${_LOG_FILE_}.9 ] ; then
                       mv ${_LOG_FILE_}.9 ${_LOG_FILE_}.10
                elif [ $i -eq 8 -a -f ${_LOG_FILE_}.8 ] ; then
                       mv ${_LOG_FILE_}.8 ${_LOG_FILE_}.9
                elif [ $i -eq 7 -a -f ${_LOG_FILE_}.7 ] ; then
                       mv ${_LOG_FILE_}.7 ${_LOG_FILE_}.8
                elif [ $i -eq 6 -a -f ${_LOG_FILE_}.6 ] ; then
                       mv ${_LOG_FILE_}.6 ${_LOG_FILE_}.7
                elif [ $i -eq 5 -a -f ${_LOG_FILE_}.5 ] ; then
                       mv ${_LOG_FILE_}.5 ${_LOG_FILE_}.6
                elif [ $i -eq 4 -a -f ${_LOG_FILE_}.4  ] ; then
                       mv ${_LOG_FILE_}.4 ${_LOG_FILE_}.5
                elif [ $i -eq 3 -a -f ${_LOG_FILE_}.3  ] ; then
                       mv ${_LOG_FILE_}.3 ${_LOG_FILE_}.4
                elif [ $i -eq 2 -a -f ${_LOG_FILE_}.2  ] ; then
                       mv ${_LOG_FILE_}.2 ${_LOG_FILE_}.3
                elif [ $i -eq 1 -a -f ${_LOG_FILE_}.1 ] ; then
                       mv ${_LOG_FILE_}.1 ${_LOG_FILE_}.2
                fi
        done
        mv ${_LOG_FILE_} ${_LOG_FILE_}.1
        touch ${_LOG_FILE_}
fi

echo `date +%Y-%m-%d:%H:%M:%S` : "${_MESSAGE_TO_ECHO_}" >> ${_LOG_FILE_}
#echo "" >> ${_LOG_FILE_}
}

Bây giờ để đưa dữ liệu vào nhật ký, chỉ cần làm

rotating_logger <file_path> "Welcome world!"

1
Có lẽ bạn có thể nỗ lực một chút để định dạng bài đăng của mình, nếu bạn muốn nó hữu ích.
Tim
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.