Có một cách thích hợp để xóa nhật ký?


65

Tôi đã tự hỏi nếu có một cách thích hợp để xóa nhật ký nói chung?

Tôi mới sử dụng Ubuntu và tôi đang cố gắng thiết lập Postfix. Nhật ký trong câu hỏi là /var/log/mail.log. Tôi đã tự hỏi nếu có một cách chính xác để xóa nó, thay vì tôi đi vào đó và xóa tất cả các dòng và lưu nó. Tôi thấy rằng đôi khi các lỗi không được ghi vào nó ngay lập tức sau khi tôi xóa nhật ký và lưu nó.

Lưu ý bên lề: Tôi gặp khó khăn khi thiết lập Postfix và đang cố gắng giúp tôi đọc nhật ký dễ dàng hơn với hy vọng nó có thể giúp tôi thoát ra, thay vì phải cuộn xuống hết cỡ.


2
Nếu bạn muốn chỉ nhìn thấy phần cuối của tệp thì đuôi là bạn của bạn. đuôi /var/log/mail.log để hiển thị 5 dòng cuối cùng. tail -f /var/log/mail.log để xem tất cả các dòng được ghi vào cuối tệp.
dùng9517

Câu trả lời:


79

Bạn có thể dùng:

> /var/log/mail.log

Điều đó sẽ cắt bớt nhật ký mà không cần bạn phải chỉnh sửa tệp. Đó cũng là một cách đáng tin cậy để lấy lại không gian. Đôi khi mọi người mắc lỗi sử dụng rm trên nhật ký sau đó tạo lại tên tệp, nếu một quy trình khác có tệp được mở thì bạn không lấy lại được khoảng trống cho đến khi quá trình đó đóng lại và bạn có thể làm rối nó.

Ngoài ra nếu bạn đang xem nội dung của nhật ký, bạn có thể muốn sử dụng taillệnh:

tail -f /var/log/mail.log

Ctrl-C sẽ ngắt đuôi.


2
/bin/csh(phổ biến cho FreeBSD) sẽ bảo lãnh điều này với "Lệnh null không hợp lệ", trong khi đó zsh(thay thế phổ biến cho bash) sẽ chờ EOF. Xem serverfault.com/a/381380/67675
poige

Làm thế nào tôi có thể lên lịch trình? Đặt >cú pháp trong crontab không chạy vì có thể không nhận ra đó là cú pháp
ishandutta2007

26

Vâng, có một cách thích hợp: Bạn hoàn toàn không xóa nhật ký. Bạn xoay chúng. Xoay vòng bao gồm chuyển đổi đầu ra nhật ký sang một tệp mới, dưới cùng tên, với các tệp nhật ký N trước đó được lưu dưới một tập hợp các tên tệp N liên quan.

Làm thế nào một người quay các bản ghi phụ thuộc vào cách người ta viết chúng ở vị trí đầu tiên. Đây là một điểm bị bỏ qua. Một số câu trả lời ở đây ít nhất chạm vào nó, đề cập đến việc một số chương trình ghi nhật ký giữ một mô tả tệp mở cho tệp nhật ký, vì vậy chỉ cần xóa tệp sẽ không giải phóng không gian, hoặc thậm chí chuyển đầu ra sang tệp nhật ký mới.

Ví dụ, nếu chương trình ghi tệp nhật ký là multilogtừ daemontoolsgói , thì bạn không làm gì để xoay vòng nhật ký - không có tập lệnh thủ công, không có croncông việc. Đơn giản chỉ cần nói multilogrằng đầu ra nhật ký là vào một thư mục, và chính nó sẽ duy trì một tập hợp các tệp nhật ký N được xoay tự động và có kích thước trong thư mục đó.

Nếu chương trình ghi các tệp nhật ký là svlogdtừ runitgói , ví dụ khác, thì áp dụng tương tự. Bạn không làm gì cả ngoài việc chỉ công cụ vào một thư mục. Nó sẽ tự duy trì một tập hợp các tệp nhật ký N được xoay tự động và có kích thước trong thư mục đó.

Nếu bạn đang sử dụng rsyslogđể ghi tệp nhật ký, thì chương trình ghi nhật ký có thể được yêu cầu dừng sau khi tệp nhật ký đạt đến kích thước nhất định và chạy tập lệnh . Bạn phải viết phần chính của tập lệnh, để thực sự đổi tên tệp nhật ký và xóa các tệp nhật ký cũ dựa trên các ràng buộc tổng kích thước, nhưng ít nhất chương trình ghi nhật ký đã đóng tệp và tạm dừng ghi nhật ký trong khi điều này đang xảy ra.

syslogdcách xoay các bản ghi, vẫn mong đợi của chương trình khai thác gỗ như syslog-ng và như được minh họa bằng các công cụ như logrotateđược đề cập bởi djangofantrong một câu trả lời ở đây, là hơi lộn xộn hơn. Một người chạy một croncông việc định kỳ đổi tên các tệp nhật ký và khởi động lại trình nền ghi nhật ký (sử dụng bất kỳ trình giám sát trình nền nào mà nó đang chạy). Vấn đề với điều này, tất nhiên là nó không thực thi giới hạn kích thước tổng thể. Vào những tuần chậm, người ta có thể nhận được N tệp nhật ký hàng ngày rất nhỏ, trong khi vào những ngày bận rộn, người ta có thể nhận được 1 tệp nhật ký rất lớn vượt quá giới hạn kích thước.

Đây là lý do tại sao sau này và các công cụ tốt hơn thích multilogsvlogdcó các tùy chọn cấu hình kích thước tệp và thực sự tự kiểm tra kích thước tệp nhật ký. Thế giới đã học được rằng việc bỏ phiếu nhật ký theo lịch trình với các croncông việc, hoặc thậm chí là một logrotatedaemon, khiến các cửa sổ bị sai kích thước và là nơi thích hợp để thực hiện các kiểm tra này và thực thi nghiêm ngặt các mũ có kích thước do quản trị viên xác định. các tệp nhật ký không bao giờ nuốt phân vùng mà chúng đang bật, nằm trong chương trình thực sự ghi các tệp ra ở vị trí đầu tiên.


Đối với rsyslog, nó có thể được cấu hình dễ dàng để dựa vào tên tệp được mô tả bởi một "mẫu", ví dụ, NĂM, THÁNG và NGÀY. Điều này dễ như có một template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")chỉ thị, theo sau là a if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. Theo cách này, xoay vòng log đơn giản là không có vấn đề, ít nhất là khi một tệp duy nhất mỗi ngày là ổn. Đối với khối lượng nhật ký rất cao (cần nhiều vòng quay mỗi ngày), cũng có $HOUR.
Damiano Verzulli

13

Bạn cũng có thể sử dụng cái này ..

truncate /opt/package/logs/*.log --size 0

Ở đây tất cả các tệp nhật ký trong / opt / gói / log sẽ trở nên trống rỗng ..


Tôi không thấy làm thế nào điều này có thể tốt hơn bất kỳ câu trả lời cũ.
kasperd

4
Đây thực sự là một câu trả lời rất hay và thực sự là câu trả lời trực tiếp cho câu hỏi liệu có cách nào phù hợp để cắt các logfiles hay không. LÀM THẾ NÀO tốt hơn các câu trả lời khác là không XÓA logfile, nó không đúng nội dung, do đó lỗi cấp phép và logfile bị thiếu khiến một số trình nền hoảng loạn sẽ không xảy ra trong trường hợp này.
hmedia1

11

Vâng, có một công cụ cho linux gọi là LogRotate .


9
Chỉ cần một sửa chữa nhỏ: đây không phải là một dịch vụ, đây là một công cụ, thường chạy từ dịch vụ cron.
rvs

10

Nếu lý do bạn xóa nhật ký là để giải phóng không gian, bạn có thể gửi / dev / null cho chúng mà không làm gián đoạn các chương trình ghi vào đó. Không bao giờ xóa chúng! một số phần mềm có thể khiếu nại bằng cách ngừng hoạt động hoặc bỏ qua nhật ký hoàn toàn cho đến khi khởi động lại tiếp theo

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

3
Để xóa các tệp nhật ký đệ quy:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai

4

Ghi đè nội dung ngắn và tương thích: : > /dest/file

Nhưng cũng có cuộc gọi hệ thống cắt ngắn (2) và công cụ không gian người dùng tương ứng truncatetrên nhiều * NIX.


1

Nếu bạn muốn giữ tập tin trước khi dọn dẹp, bạn có thể làm:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

Nếu bạn muốn tìm kiếm một văn bản hoặc email cụ thể trong nhật ký, bạn có thể sử dụng grep. Nếu bạn muốn giữ một số đồ họa về việc sử dụng thư, bạn có thể sử dụng AWStats.


1

Đây là cách tôi thực hiện và đây chỉ là NGINX, bạn có thể xóa nó để làm cho nó hoạt động trên tất cả các tệp nhật ký.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "--------------- ⏲  Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "--------------- ⏲  Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "--------------- 💯 DONE: NGINX logs cleared ... ---------------"
}

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.