Giữ kích thước tệp nhật ký cố định mà không cần logrotate


13

Có cách nào để giữ kích thước tệp của tệp nhật ký cố định mà không xoay tệp bằng tệp trống mới và xóa (hoặc lưu trữ) tệp cũ. Ví dụ: nếu tôi đặt kích thước tối đa của tệp nhật ký thành 1MB, sau khi tăng kích thước tệp vượt quá giới hạn đó, nó sẽ được tự động kẹp, văn bản được thêm vào 'đuôi' và phần văn bản cũ nhất được bật ra để giữ kích thước tệp 1MB .


sử dụng logrotate, sau đórm -f *.tar.gz.*
Marco Ceppi

1
Có bất kỳ lý do cụ thể tại sao bạn không muốn xoay vòng nhật ký hoặc sử dụng logrotate không? Chính xác những gì bạn muốn xảy ra? Lưu trữ nhật ký cũ ở mức 1M và bắt đầu một bản ghi mới? Bắt đầu câu hỏi của bạn không hoàn toàn tương thích với kết thúc.
David Thornley

không bật ra có nghĩa là gì?
tshepang

Câu trả lời:


4

Bạn có thể viết một tập lệnh bash nhỏ để làm điều này. Chỉ cần đuôi tệp đến một số byte nhất định bằng cách sử dụng tail -cvà ghi đè lên tệp.

từ man tail:

-c, --bytes=N
              output the last N bytes; alternatively, use +N to  output  bytes
              starting with the Nth of each file

   If  the  first  character of N (the number of bytes or lines) is a `+',
   print beginning with the Nth item from the start of each  file,  other‐
   wise, print the last N items in the file.  N may have a multiplier suf‐
   fix:  b  512,  kB  1000,  K  1024,  MB  1000*1000,  M   1024*1024,   GB
   1000*1000*1000, G 1024*1024*1024, and so on for T, P, E, Z, Y.

3
Tôi tương đối chắc chắn rằng một khi bạn "ghi đè lên tệp" thì việc ghi nhật ký sẽ không tự động tiếp tục trên tệp mới.
Stephen Jazdzewski

0

Giải pháp duy nhất của bạn có thể là viết hệ thống tệp không gian người dùng của riêng bạn hoặc đóng góp cho hệ thống hiện có. Nhìn vào danh sách một phần tại Filesystem trong Userspace

Nếu bạn không có kỹ năng đóng góp, hãy cung cấp công khai dự án hoặc $$$ hoặc cả hai, để thêm nó cho bạn.

Tôi ước tôi có thời gian để làm điều đó, tôi đã luôn muốn một cái gì đó chính xác như thế này.


0

Bạn có thể làm một cái gì đó tương tự bằng cách sử dụng một FIFO, giống như một tệp có kích thước 0 byte.

Tuy nhiên, lưu ý rằng nếu không có gì ĐỌC từ tệp này, thì quá trình nhật ký hệ thống có thể bị chặn và sẽ dừng ghi vào TẤT CẢ các tệp nhật ký của bạn. Tôi không chắc hành vi này đã được thay đổi với các phiên bản Ubuntu / CentOS mới hơn hay chưa.

Một ví dụ ở đây

Cho một ví dụ khác, hãy thử một cái gì đó như thế này.

Làm cho năm của bạn:

sudo mkfifo /var/log/everything.fifo

Và thêm phần này vào (r) syslog.conf, sau đó khởi động lại syslog:

*.*     |/var/log/everything.fifo

Sau đó xem FIFO từ một cửa sổ:

cat /var/log/everything.fifo

Và trong một cửa sổ khác, hãy gửi một số nội dung tới syslog:

logger Test1
logger Test2
logger Test3

Bạn sẽ thấy các dòng "Test *" trong đầu ra của cat ở trên.

Tính năng này có thể tuyệt vời để gỡ lỗi, đặc biệt nếu bạn không quan tâm đến việc giữ dữ liệu lâu hơn. Ví dụ: nếu bạn chỉ muốn xem mọi thứ ngoại trừ spamfirewall, bạn có thể làm một cái gì đó như thế này:

grep -vi "kernel: .* on wan" /var/log/everything.fifo

0

Đây là câu trả lời thứ hai của tôi. Đây là một hackish khá.

Sử dụng watch (1) để thực thi nhiều lần tail --bytes=1024(1024 byte cuối cùng của logfile, nhờ @jjclarkson cho câu trả lời đó).

watch --no-title tail --bytes=1024 /var/log/messages >/tmp/messages.watch

Và sau đó xem tệp với:

less --raw-control-chars /tmp/messages.watch

Sự khác biệt giữa watchvà một vòng lặp while là watchsẽ chỉ cập nhật /tmp/messages.watch nếu có thay đổi thành / var / log / message.

while true; do
    tail --bytes=1024 /var/log/messages > /tmp/messages.watch
    sleep 1
done

Và, tôi đoán bạn có thể đặt một testvòng lặp while để đuôi đó chỉ được thực thi nếu / var / log / message được cập nhật, nhưng tôi sẽ không tìm ra điều đó ngay bây giờ.


0
 * prune - cắt bỏ phần trên cùng của danh sách các tệp được mô tả trong
 * tập tin / etc / default / prune. Được thiết kế để chạy định kỳ
 * từ cron, ý tưởng là tự động rút ngắn nhật ký
 * tập tin phát triển mãi mãi. Tập tin này chứa một danh sách
 * tệp (tên đường dẫn đầy đủ) và số lượng khối
 * nên được giữ lại. Để giữ một chút tỉnh táo, tỉa sẽ
 * clip tập tin sau dòng mới tiếp theo. Tập tin
 * / etc / default / prune sẽ trông giống như:
 *
 * / usr / adm / aculog 10
 * /usr/adm/leo.log 5
 * / usr / adm / tin nhắn 200
 * / usr / adm / sup_log 5
 *
 * Mục crontab trên infoswx cho prune trông giống như:
 *
 * 0 5 * * * / etc / prune> /usr/adm/prune.log 2> & 1
 *
 * Biên dịch với: cc -O -o prune prune.c
 *
 * Định nghĩa sau đây có thể được điều chỉnh cho phù hợp với khẩu vị của bạn
 * và kích thước khối hệ thống của bạn.
 *
 * Ray Davis infoswx! Ong 09/11/85

https://groups.google.com/group/mod.source/browse_thread/thread/b2136b3ab7e924e/f785b37c218bb576?hl=vi&ie=UTF-8&q=prune+log+file&pli=1

Nhiều trình nền (hầu hết? Tất cả?) Sẽ mở lại tệp nhật ký của họ nếu được gửi tín hiệu HUP (ví dụ: bởi cùng một công việc định kỳ chạy prune)


0

Tôi chắc chắn rằng poster ban đầu đã tìm thấy một giải pháp sau 8 năm. Đây là một cái khác cho những người khác có thể đọc chủ đề này ...

hạn chế giới hạn kích thước của đầu ra của chương trình và bảo toàn 200 MB đầu ra cuối cùng bằng lệnh sau:

chạy_program | cắt đuôi -s 200M myprogram.log

https://github.com/Comcast/Infinite-File-Curtailer

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.