2013-01-31 26 views
6

Tôi đang tạo một dịch vụ mà tôi ghi nhật ký định dạng văn bản thuần từ nhiều nguồn (một tệp cho mỗi nguồn). Tôi không có ý định xoay các bản ghi này vì chúng phải tồn tại mãi mãi.Viết chỉ chắp thêm tệp nhật ký đã được nén trong Python

Để làm cho những tệp này luôn tồn tại xung quanh các tệp nhỏ hơn, tôi hy vọng tôi có thể nén chúng một cách nhanh chóng. Vì chúng là dữ liệu nhật ký, các tệp nén rất tốt.

Cách tiếp cận tốt trong Python là viết các tệp văn bản được thêm vào chỉ chắp thêm, sao cho văn bản có thể được tiếp tục sau khi dịch vụ bật và tắt? Tôi không lo lắng về việc mất vài dòng, nhưng nếu gzip chứa chính nó bị phá vỡ và tập tin trở nên không đọc được thì không.

Ngoài ra, nếu không có, tôi chỉ có thể viết chúng dưới dạng văn bản thuần túy mà không cần gzipping nếu nó không đáng giá.

+1

Thậm chí nếu bạn không có ý định xoay nhật ký, tại sao không phá vỡ đầu ra và bắt đầu một tệp mới một lần trong một thời gian? Sau đó, bạn có thể chạy gzip sau khi tệp hoàn tất. –

+1

@ Câu trả lời của DavidZaslavsky là giải pháp truyền thống. Nó chỉ xoay vòng chuẩn, ngoại trừ việc bạn bỏ phần mà bạn xóa các tập tin cũ. – abarnert

Trả lời

8

Lưu ý: Trên các hệ thống unix bạn nên nghiêm túc xem xét sử dụng một chương trình bên ngoài, bằng văn bản cho nhiệm vụ chính xác này:

  • logrotate (xoay, nén, và các bản ghi hệ thống mail)

Bạn có thể đặt số lượng xoay vòng quá cao, tệp đầu tiên sẽ bị xóa in 100 years hoặc hơn.


Trong Python 2, logging.FileHandler có một đối số từ khóa encoding có thể được thiết lập để bz2 hoặc zlib.

Điều này là do logginguses module codecs, do đó đối xử với bz2 (hoặc zlib) như mã hóa:

>>> import codecs 
>>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2") as fh: 
...  fh.write("Hello World\n") 

$ bzcat on-the-fly-compressed.txt.bz2 
Hello World 

Python 3 phiên bản (mặc dù các tài liệu mentionbz2 như bí danh, bạn sẽ thực sự phải sử dụng bz2_codec - ít nhất là w/3.2.3):

>>> import codecs 
>>> with codecs.open("on-the-fly-compressed.txt.bz2", "w", "bz2_codec") as fh: 
...  fh.write(b"Hello World\n") 

$ bzcat on-the-fly-compressed.txt.bz2 
Hello World 
+2

+1 cho liên kết giải thích cách sử dụng 'logrotate' cho mục đích này. (Vâng, ngoại trừ việc tôi đã cho bạn 1 giải thích cách làm điều đó bằng Python, nếu bạn thực sự muốn ...) – abarnert

+1

Đã chuyển logrotate lên vì tôi đoán nó sẽ là điều đúng đắn để làm. – miku

Các vấn đề liên quan