Làm thế nào để cắt tất cả các logfiles?


17

bất cứ ai có thể cho tôi một giải pháp để cắt tất cả logfile trong /var/log/thư mục?

và một câu hỏi chỉ dành cho kiến ​​thức, nó có phải là một ý tưởng tốt hay không?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done

1
Đó KHÔNG phải là một ý tưởng hay - /var/loglà nơi hệ thống đặt các tin nhắn bạn có thể cần sau này. Ubuntu đã gặp phải vấn đề trước đây. Đọc man 8 logrotate;man logrotate.conf.
ví von

Câu trả lời:


34

thử đi:

truncate -s 0 /var/log/*log

BIÊN TẬP:

nếu bạn muốn làm điều này nhiều hơn một lần, bạn nên sử dụng logrotateđể xử lý nhật ký của mình. Thông thường, nó được cài đặt trong Ubuntu. Hãy xem man logrotate(hoặc nếu bạn chưa cài đặt, hãy xem trang web trực tuyến hoặc cài đặt nó với sudo apt-get install logrotate)

từ trang web:

logrotate được thiết kế để dễ dàng quản trị các hệ thống tạo ra số lượng lớn tệp nhật ký. Nó cho phép tự động xoay, nén, loại bỏ và gửi các tệp nhật ký. Mỗi tệp nhật ký có thể được xử lý hàng ngày, hàng tuần, hàng tháng hoặc khi nó phát triển quá lớn.


bạn cũng có thể làm trống chúng bằng cách sử dụng echo ""> * log
Astm

10

Nếu bạn muốn xóa tất cả các tệp nhật ký của mình, không chỉ các tệp trong thư mục nhật ký cấp đầu tiên, bạn có thể sử dụng:

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

Lưu ý rằng nếu bạn đã logrotatechạy, bạn cũng cần phải xóa các .gzbản ghi đã xoay :

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

Ví dụ, việc sử dụng hợp lệ cho việc này có thể là xây dựng một thùng chứa thiết bị VM để phân phối.

Bạn không cần phải làm điều này như một phần của bảo trì thường xuyên: vì DEM được đề xuất khá chính xác, hãy sử dụng logrotatecho việc đó.


1

Theo dõi đến @DEN trả lời

Điều này sẽ tìm thấy tất cả các tệp nhật ký /var/logvà cắt chúng thành 0 byte.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0

1
Tôi sẽ sử dụng *.log*thay thế nhưng tôi không chắc nó có an toàn 100% hay không, vì vậy tôi đã không đưa nó vào câu trả lời. Bởi vì có những tập tin như dovecot.log-20180930dovecot.log-20180923.gz.
Luka

0

Có một số phương pháp để cắt ngắn hoàn toàn một tệp, thường áp dụng cho hầu hết các HĐH tuân thủ POSIX. Hầu hết các phổ biến mà bạn sẽ thấy với kịch bản shell là một cái gì đó giống như true > file.txthoặc : > file.txt(và trong trường hợp của bashvỏ, >chuyển hướng một mình là đủ). Đó là do cách >mở tệp qua open()hoặcopenat() bằng O_WRONLY|O_CREAT|O_TRUNCcờ - đọc chỉ ghi HOẶC tạo nếu tên tệp không tồn tại, HOẶC cắt bớt tên tệp hiện có.

Với ý nghĩ đó, chúng ta có thể thực hiện một cái gì đó tương tự như vậy trong C:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

Đặt tên cho tệp lưu trữ mã này trunc.cvà biên dịch mã đó gcc trunc.c -o truncvà bạn có cho mình một tiện ích nhỏ sẽ cắt bớt một đối số tên tệp mà nó cung cấp như trong trunc ./foobar.txt. Tất nhiên, mã này không thực hiện các kiểm tra khác, nó chỉ cắt bớt tham số vị trí đầu tiên. Tôi sẽ để nó cho độc giả tìm ra cách xử lý nhiều hơn một tham số vị trí. Bên cạnh đó, có một truncate()tòa nhà cao tầng mà chúng ta cũng có thể sử dụng và cắt một tập tin theo chiều dài thay đổi.

Bây giờ, nếu bạn không phải là fan hâm mộ của C, Python có thể dễ dàng hơn cho bạn. open()lệnh hoạt động theo cùng một nguyên tắc trong Python - mở tệp để ghi và cắt bớt nếu tên tệp tồn tại. Như vậy chúng ta có thể làm

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

Đối với việc tìm tất cả .logcác tệp, điều đó đã được đề cập trong các câu trả lời khác - sử dụng toàn *cầu hoặc mở rộng toàn cầu trong bash. Ngoài ra, còn find -type f -name "*.log"-execcờ để chạy các lệnh (trong trường hợp cụ thể này sh -c ''để tận dụng >>là toán tử shell chứ không phải là tệp thực thi bên ngoài). Do đó bạn có thể làm

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

Nó cũng đáng chú ý là file log trong thư mục như /var/logthường được luân chuyển bằng dịch vụ logrotate, vì vậy sẽ có tên tập tin như /var/log/service.log, /var/log/service.log.1, vv, vì vậy bạn có thể muốn sử dụng *.log.[1-9]mô hình thay vì


Trong số những thứ khác, chúng ta có thể sao chép /dev/nullvào tập tin mong muốn. Thật kỳ lạ, mặc dù /dev/nulllà một loại tệp thiết bị ký tự đặc biệt, khi bạn sao chép ở nơi khác thì kết quả là tệp thông thường trống, ít nhất là với GNU cp. Như vậy chúng ta có thể làm

cp /dev/null foo.txt

hoặc là

dd if=/dev/null of=foo.txt

Đề nghị đọc khác:


0

Đó là một thực hành tốt để xoay các bản ghi trong / var / log để xoay với chức năng logrotate nhưng không phải bất cứ khi nào chúng ta muốn làm. Nhật ký hệ thống sẽ được in ra và chúng sẽ hữu ích để gỡ lỗi mọi lỗi.

Nếu đó là một yêu cầu không sử dụng logrotate, thì các tùy chọn có thể được khám phá. Mặc dù cắt ngắn là tùy chọn dễ dàng trong một số hương vị của hệ thống unix, lệnh này không có sẵn, cần phải được cài đặt. Nếu không được phép cài đặt lệnh mới thì có thể sử dụng vòng lặp bên dưới.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done

Bash Pitfall # 1 : Đừng viết cho các vòng lặp theo cách đó. Sử dụng for logfile in /path/*.logthay thế.
PerlDuck
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.