Làm thế nào để thực hiện logrotate trong shell script


12

kiểm tra

#!/bin/bash
echo "Hello World"

test2.sh

#!/bin/bash
while true
do
    sh test.sh >> /script_logs/test.log &
done

Tôi muốn triển khai logrotate để kiểm soát kích thước tệp nhật ký, vậy làm thế nào để thực hiện logrotate, nếu tình huống như trên?

Câu trả lời:


11
#!/bin/bash 
touch /script_logs/test.log
MaxFileSize=2048
while true
do
     sh test.sh >> /script_logs/test.log
#Get size in bytes** 
    file_size=`du -b /script_logs/test.log | tr -s '\t' ' ' | cut -d' ' -f1`
    if [ $file_size -gt $MaxFileSize ];then   
        timestamp=`date +%s`
        mv /script_logs/test.log /script_logs/test.log.$timestamp
        touch /script_logs/test.log
    fi

done

Tôi đã xóa "&" vì nó có thể gây ra sự cố.


@Veerendra chúng ta cần đặt logic của việc cuộn các bản ghi bên trong vòng lặp khi bạn đang chạy một vòng lặp vô hạn ..
tò mò

@Veerendra chúng tôi bài viết trước của tôi đã có lỗi .. "mv" sẽ không tạo tệp mới nhưng bạn có thể thay đổi tập lệnh theo yêu cầu của bạn.
tò mò

Vì vậy, thay vì cpmv, tôi có thể xóa tệp nhật ký không, sau đó có phải tệp nhật ký mới có cùng tên không? (Yêu cầu của tôi là, nếu tệp nhật ký đạt đến giới hạn nhất định, tôi muốn xóa tệp nhật ký đó và sau đó tạo tệp mới )
Veerendra

Bạn nên sử dụng >>để chắp thêm vào tệp nhật ký, >sẽ ghi đè lên nhiều lần.
alcik

nếu tôi sử dụng >, tôi sẽ nhận được tail: test.log: file truncated Hello World!.... Nếu tôi sử dụng >>, tôi nhận được thông điệp tường trình chính xác, nhưng kích thước tệp đang tăng lên. Không có điều kiện kiểm tra điều kiện ... ;-(
Veerendra

23

sử dụng như thế nào savelog?

Nó có sẵn trong debian và RH và khá nhiều bản phân phối linux khác mà tôi biết. Đó là tập lệnh shell / bin / sh, vì vậy cũng nên chạy trên bất kỳ unix nào khác.

ví dụ trước khi viết bất cứ điều gì để test.logchạy savelog -n -c 7 test.log. Điều này sẽ giữ 7 phiên bản test.log không trống gần đây nhất. Theo mặc định, nó sẽ nén các bản ghi xoay (nhưng có thể bị vô hiệu hóa -l).

Nếu bạn cần, bạn có thể kiểm tra kích thước test.logvà chỉ savelognó nếu nó vượt quá một kích thước nhất định.


Bạn có biết gói nào chứa cái này trên AWS Linux (gần với CentOS không, tôi tin vậy)? Cài đặt mặc định không có savelog. Tôi không thể tìm thấy nó từ yum bằng cách sử dụng repos mặc định
jhonkola

savelog không được tìm thấy trong RHEL 5. Bạn có biết nó nên ở trong repo nào không?
Felipe Alvarez

không có ý tưởng về bao bì centos hoặc rhel5, nhưng bạn có thể tìm thấy /usr/bin/savelogtập lệnh shell tại nguồn.debian.net/src/debianutils/4.7
cas

2
Tôi chưa tìm thấy savelogtrên bất kỳ hộp RHEL / CentOS 5/6 nào của mình, vì vậy tôi mới tải xuống quảng cáo và nó dường như hoạt động tốt cho nhu cầu của tôi.
Dale Anderson

Một nhược điểm của savelognó là đổi tên tập tin nhưng sau đó mất nhiều thời gian để gzip những cái cũ trước khi hoàn thiện. Trong khi đó, nhật ký .0 đã có các mục tiếp theo trong đó. Lý tưởng nhất là thời gian giữa luân chuyển nhật ký và báo hiệu quá trình mở lại nhật ký nên tối thiểu. Tôi tắt savelogtính năng nén vì điều này.
rustyx

2

Tôi đã viết một logrotee cuối tuần này. Tôi có lẽ sẽ không đọc được câu trả lời tuyệt vờimultilog của @ JdeBP .

Tôi tập trung vào nó rất nhẹ và có thể bzip2 khối đầu ra của nó như:

verbosecommand | logrotee \
  --compress "bzip2 {}" --compress-suffix .bz2 \
  /var/log/verbosecommand.log

Dù vậy, vẫn còn rất nhiều việc phải làm và thử nghiệm.


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.