Lưu trữ đầu ra của lệnh vào bộ đệm vòng


16

Tôi đã có một lệnh chạy dài tạo ra nhiều đầu ra trên thiết bị xuất chuẩn. Ví dụ, tôi muốn có thể giữ lại chỉ ba ngày hoặc gibibyte cuối cùng (tránh các đường cắt ở giữa) và, nếu có thể, trong các khối tệp không lớn hơn 20 MiB. Mỗi đoạn tệp được đặt tên bằng hậu tố số hoặc dấu thời gian.

Cái gì đó như:

my-cmd | magic-command --output-file-template=my-cmd-%t \
                       --keep-bytes=1G \
                       --keep-time=3d \
                       --max-chunk-size=20M \
                       --compress=xz

Se viêt:

my-cmd-2014-09-05T10:04:23Z

Khi đạt đến 20M, nó sẽ nén nó và mở một cái mới, và sau đó, sau một thời gian nó sẽ bắt đầu xóa các tệp cũ nhất.

Liệu một lệnh như vậy tồn tại?

Tôi nhận thức được logrotatevà khả năng quản lý các tệp được viết bởi các ứng dụng khác, nhưng tôi đang tìm kiếm thứ gì đó đơn giản hơn không liên quan đến việc phải thiết lập công việc định kỳ, chỉ định quy tắc, tạm dừng quy trình, v.v.


"Gibibyte" là gì?
Peter Mortensen

@PeterMortensen Wikipedia: Gibibyte
jw013

Câu trả lời:


6

Bạn có thể nhận được một số thứ bạn muốn thông qua pipelog , "cho phép xoay hoặc xóa nhật ký của một quy trình đang chạy bằng cách chuyển nó qua một trung gian phản ứng với các tín hiệu bên ngoài", ví dụ:

spewstuff | pipelog spew.log -p /tmp/spewpipe.pid -x "gzip spew.log.1"

Sau đó, bạn có thể lấy pid từ /tmp/spewpipe.pidvà:

kill -s USR1 $(</tmp/spewpipe.pid)

Nhưng bạn sẽ phải thiết lập với cron hoặc một cái gì đó. Tuy nhiên, có một điều bắt được điều này. Lưu ý I gzip spew.log.1- điều này là do -xlệnh được thực thi sau khi nhật ký được xoay. Vì vậy, bạn có thêm vấn đề ghi đè spew.log.1.gzmỗi lần trừ khi bạn viết một đoạn script ngắn để thực hiện gzip và di chuyển tệp sau đó, và sử dụng nó làm -xlệnh.

Tiết lộ đầy đủ: Tôi đã viết điều này, vì vậy nó tất nhiên hoạt động hoàn hảo . ;) Tôi sẽ ghi nhớ tùy chọn nén hoặc một cái gì đó hỗ trợ tốt hơn cho phiên bản 0.2 (mục đích dự định -xlà hơi khác nhau, nhưng nó sẽ hoạt động như trên). Ngoài ra, cuộn qua tự động cũng là một ý tưởng hay ... phiên bản đầu tiên là tối thiểu khi tôi chống lại sự cám dỗ để thêm các tính năng không cần thiết (rốt cuộc không khó để thiết lập một công việc định kỳ cho việc này).

Lưu ý rằng nó dành cho đầu ra văn bản ; nếu có byte rỗng tiềm năng, bạn nên sử dụng -z- thay thế số 0 bằng thứ khác. Đây là một sự đánh đổi để đơn giản hóa việc thực hiện.


Cảm ơn. Tôi đang mong chờ pipelog-0.3;-). Tôi cũng đã xem qua metacpan.org/release/File-Write-Rotate . Lưu ý rằng các công việc định kỳ sẽ không giúp ích nhiều cho việc xoay vòng dựa trên kích thước tệp.
Stéphane Chazelas

Xoay vòng dựa trên kích thước!?! Nó không giữ đầu ra bị xóa, do đó bạn có thể thống kê tệp theo các khoảng thời gian ...
goldilocks

Bạn không thể giữ kích thước dưới 20M (như trong yêu cầu câu hỏi của tôi) đáng tin cậy theo cách đó.
Stéphane Chazelas

Một điều nữa là nó chỉ có khá nhiều văn bản (tôi đã thêm một đoạn cuối về điều đó).
goldilocks

4

Dan Bernstein multilog rõ ràng có thể làm điều này - hoặc có lẽ hầu hết của nó, trong khi cung cấp một lối thoát qua mô tả tập tin để xử lý! Để tạo nên sự khác biệt như bạn thích - dù 20M / 1G thông số kỹ thuật Kích thước có thể mất một finagling như nó có vẻ 16M là nó giới hạn ngoài cho mỗi bản ghi. Phần lớn, phần lớn là lựa chọn sao chép + dán từ liên kết ở trên, mặc dù liên kết cũng nêu chi tiết các tùy chọn khác như dấu thời gian trên mỗi dòng, duy trì [một] tệp khác chỉ chứa mẫu phù hợp với dòng gần đây nhất và hơn thế nữa .

Giao diện

 multilog script

... tập lệnh bao gồm bất kỳ số lượng đối số. Mỗi đối số chỉ định một hành động. Các hành động được thực hiện theo thứ tự cho từng dòng đầu vào.

Chọn dòng

Mỗi dòng được chọn ban đầu. Hành động...

-pattern

... bỏ chọn dòng nếu mẫu phù hợp với dòng. Hành động...

+pattern

chọn dòng nếu mẫu phù hợp với dòng.

... mô hình là một chuỗi các ngôi sao và không phải ngôi sao. Nó phù hợp với bất kỳ chuỗi nối nào được khớp bởi tất cả các ngôi sao và không phải ngôi sao theo cùng một thứ tự. Một ngôi sao không phù hợp với chính nó. Một ngôi sao trước khi kết thúc mẫu khớp với bất kỳ chuỗi nào không bao gồm ký tự tiếp theo trong mẫu. Một ngôi sao ở cuối mẫu phù hợp với bất kỳ chuỗi nào.

Nhật ký tự động xoay

Nếu dir bắt đầu bằng dấu chấm hoặc dấu gạch chéo thì hành động ...

 dir

... Nối từng dòng được chọn vào một bản ghi có tên dir . Nếu dir không tồn tại, multilogtạo ra nó.

Định dạng nhật ký như sau:

  1. dir là một thư mục chứa một số tệp nhật ký cũ, tệp nhật ký có tên hiện tại và các tệp khác multilogđể theo dõi các hành động của nó.

  2. Mỗi tệp nhật ký cũ có tên bắt đầu bằng @ , tiếp tục với dấu thời gian chính xác hiển thị khi tệp kết thúc và kết thúc bằng một trong các mã sau:

    • .s : Tập tin này được xử lý hoàn toàn và ghi vào đĩa một cách an toàn.
    • .u : Tập tin này đã được tạo tại thời điểm ngừng hoạt động. Nó có thể đã bị cắt ngắn. Nó đã không được xử lý.

Hành động...

 ssize

... Đặt kích thước tệp tối đa cho các hành động dir tiếp theo . multilogsẽ quyết định rằng dòng điện đủ lớn nếu dòng điện có byte kích thước . ( multilogcũng sẽ quyết định rằng dòng điện đủ lớn nếu nó nhìn thấy một dòng mới trong phạm vi 2000 byte của kích thước tệp tối đa; nó cố gắng hoàn thành các tệp nhật ký ở ranh giới dòng.) kích thước phải nằm trong khoảng từ 4096 đến 16777215. Kích thước tệp tối đa mặc định là 99999.

Trong các phiên bản 0,75 trở lên: Nếu multilognhận được tín hiệu ALRM , nó ngay lập tức quyết định rằng dòng điện đủ lớn, nếu dòng điện không trống.

(Lưu ý: Tôi nghi ngờ zsh schedulenội dung có thể dễ dàng bị thuyết phục để gửi một ALRMkhoảng thời gian được chỉ định nếu cần thiết.)

Hành động...

 nnum

... Đặt số lượng tệp nhật ký cho các hành động dir tiếp theo . Sau khi đổi tên hiện tại , nếu multilogthấy num hoặc nhiều tệp nhật ký cũ, nó sẽ xóa tệp nhật ký cũ với dấu thời gian nhỏ nhất. num phải có ít nhất 2. Số tệp nhật ký mặc định là 10.

Hành động...

 !processor

... Đặt bộ xử lý cho các hành động dir tiếp theo . multilogsẽ cung cấp dòng điện qua bộ xử lý và lưu kết quả đầu ra dưới dạng tệp nhật ký cũ thay vì hiện tại . multilogcũng sẽ lưu bất kỳ đầu ra nào mà bộ xử lý ghi vào bộ mô tả 5 và làm cho đầu ra đó có thể đọc được trên bộ mô tả 4 khi nó chạy bộ xử lý trên tệp nhật ký tiếp theo. Để có độ tin cậy, bộ xử lý phải thoát khỏi nonzero nếu nó có bất kỳ sự cố nào khi tạo đầu ra của nó; multilogsau đó sẽ chạy lại nó Lưu ý rằng bộ xử lý đang chạy có thể chặn bất kỳ đầu vào cấp chương trình nào multilog.


2

Điều tốt nhất tôi có thể tìm thấy cho đến khi một xấp xỉ không liên quan đến việc viết các đoạn mã lớn là zshmã này :

autoload zmv
mycmd |
  while head -c20M > mycmd.log && [ -s mycmd.log ]; do
    zmv -f '(mycmd.log)(|.(<->))(|.gz)(#qnOn)' '$1.$(($3+1))$4'
    {rm -f mycmd.log.1 mycmd.log.50.gz; (gzip&) > mycmd.log.1.gz} < mycmd.log.1
  done

Ở đây chia nhỏ và xoay thành tối đa 51 tệp lớn 20MiB.


có lẽ ... vòng lặp? btrfscũng có thể được gắn kết với compress-force=zlib.
mikeerv

2

Đây là một kịch bản python bị hack để làm một cái gì đó giống như những gì bạn đang yêu cầu:

#!/bin/sh
''':'
exec python "$0" "$@"
'''

KEEP = 10
MAX_SIZE = 1024 # bytes
LOG_BASE_NAME = 'log'

from sys import stdin
from subprocess import call

log_num = 0
log_size = 0
log_name = LOG_BASE_NAME + '.' + str(log_num)
log_fh = open(log_name, 'w', 1)

while True:
        line = stdin.readline()
        if len(line) == 0:
                log_fh.close()
                call(['gzip', '-f', log_name])
                break
        log_fh.write(line)
        log_size += len(line)
        if log_size >= MAX_SIZE:
                log_fh.close()
                call(['gzip', '-f', log_name])
                if log_num < KEEP:
                        log_num += 1
                else:
                        log_num = 0
                log_size = 0
                log_name = LOG_BASE_NAME + '.' + str(log_num)
                log_fh = open(log_name, 'w', 1)

1
Có một lý do để có nó như là một kịch bản shell mà execpython là điều đầu tiên thay vì sử dụng pythonhoặc env pythonhashbang?
peterph
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.