- log xoay mỗi ngày: Sử dụng một nén TimedRotatingFileHandler
- gỗ: Thiết lập các tham số
encoding='bz2'
. (Lưu ý "thủ thuật" này sẽ chỉ hoạt động đối với Python2. 'Bz2' không còn được coi là mã hóa trong Python3 nữa.)
- tùy chọn - xóa tệp nhật ký cũ nhất để giữ lại dung lượng trống của MB là. Bạn có thể (gián tiếp) sắp xếp việc này bằng cách sử dụng RotatingFileHandler. Bằng cách đặt tham số
maxBytes
, tệp nhật ký sẽ di chuột qua khi nó đạt đến kích thước nhất định. Bằng cách đặt tham số backupCount
, bạn có thể kiểm soát số lượng rollover được giữ. Hai thông số cùng nhau cho phép bạn kiểm soát không gian tối đa được tiêu thụ bởi các tệp nhật ký. Bạn có thể phân lớp TimeRotatingFileHandler
để kết hợp hành vi này vào nó.
Chỉ cần cho vui, đây là cách bạn có thể phân lớp TimeRotatingFileHandler
. Khi bạn chạy tập lệnh bên dưới, tệp sẽ ghi các tệp nhật ký vào /tmp/log_rotate*
.
Với một giá trị nhỏ cho time.sleep
(chẳng hạn như 0,1), tệp nhật ký sẽ điền nhanh, đạt giới hạn maxBytes và sau đó được cuộn qua.
Với số lớn time.sleep
(chẳng hạn như 1.0), tệp nhật ký điền vào chậm, giới hạn maxBytes không được tiếp cận, nhưng chúng vẫn cuộn qua khi khoảng thời gian đã định thời gian (10 giây) đạt được.
Tất cả mã bên dưới là từ logging/handlers.py. Tôi chỉ đơn giản là lưới TimeRotatingFileHandler với RotatingFileHandler theo cách thẳng nhất có thể.
import time
import re
import os
import stat
import logging
import logging.handlers as handlers
class SizedTimedRotatingFileHandler(handlers.TimedRotatingFileHandler):
"""
Handler for logging to a set of files, which switches from one file
to the next when the current file reaches a certain size, or at certain
timed intervals
"""
def __init__(self, filename, maxBytes=0, backupCount=0, encoding=None,
delay=0, when='h', interval=1, utc=False):
handlers.TimedRotatingFileHandler.__init__(
self, filename, when, interval, backupCount, encoding, delay, utc)
self.maxBytes = maxBytes
def shouldRollover(self, record):
"""
Determine if rollover should occur.
Basically, see if the supplied record would cause the file to exceed
the size limit we have.
"""
if self.stream is None: # delay was set...
self.stream = self._open()
if self.maxBytes > 0: # are we rolling over?
msg = "%s\n" % self.format(record)
# due to non-posix-compliant Windows feature
self.stream.seek(0, 2)
if self.stream.tell() + len(msg) >= self.maxBytes:
return 1
t = int(time.time())
if t >= self.rolloverAt:
return 1
return 0
def demo_SizedTimedRotatingFileHandler():
log_filename = '/tmp/log_rotate'
logger = logging.getLogger('MyLogger')
logger.setLevel(logging.DEBUG)
handler = SizedTimedRotatingFileHandler(
log_filename, maxBytes=100, backupCount=5,
when='s', interval=10,
# encoding='bz2', # uncomment for bz2 compression
)
logger.addHandler(handler)
for i in range(10000):
time.sleep(0.1)
logger.debug('i=%d' % i)
demo_SizedTimedRotatingFileHandler()
Rotation? Bạn có nghĩa là chạy kịch bản mỗi ngày? Nếu vậy, tôi đề nghị sử dụng một công việc cron. – Griffin
Ứng dụng của tôi sẽ chạy và ghi nhật ký liên tục, vì vậy tôi muốn hệ thống bắt đầu một tệp nhật ký mới mỗi ngày –
liên quan [Vấn đề Python 13516: Tệp nhật ký cũ Gzip trong trình xử lý xoay] (http://bugs.python.org/issue13516) đề cập đến [ví dụ TimedCompressedRotatingFileHandler] (http://code.activestate.com/recipes/502265-timedcompressedrotatingfilehandler/) – jfs