बस मस्ती के लिए, यहाँ है कि कैसे आप TimeRotatingFileHandler
उपवर्ग सकता है। जब आप नीचे लिपि चलाते हैं, तो यह /tmp/log_rotate*
पर लॉग फ़ाइलों को लिख देगा।
time.sleep
(जैसे 0.1) के लिए एक छोटे से मूल्य के साथ, लॉग फ़ाइलें जल्दी भर जाती हैं, अधिकतमबाइट सीमा तक पहुंच जाती हैं, और फिर लुढ़क जाती हैं।
बड़े time.sleep
(जैसे 1.0) के साथ, लॉग फ़ाइलें धीरे-धीरे भर जाती हैं, अधिकतम बाइट्स सीमा तक नहीं पहुंचती है, लेकिन जब भी समय अंतराल (10 सेकंड) तक पहुंच जाता है तो वे रोल हो जाते हैं।
नीचे दिए गए सभी कोड logging/handlers.py से आते हैं। मैंने बस रोटेटिंगफाइलहैंडलर के साथ टाइमरोटिंगफाइलहैंडलर को सबसे सीधे आगे बढ़ने के तरीके में मेस किया।
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()
रोटेशन? क्या आपका मतलब हर दिन स्क्रिप्ट चलाना है? यदि ऐसा है, तो मैं एक क्रॉन नौकरी का उपयोग करने का सुझाव देना चाहूंगा। – Griffin
मेरा ऐप लगातार चल रहा है और लॉगिंग करेगा, इसलिए मैं चाहता हूं कि सिस्टम प्रत्येक दिन –
संबंधित [Python issue 13516: gzip पुरानी लॉग फ़ाइलों को घुमाने वाले हैंडलर में] [http://bugs.python.org/issue13516) का उल्लेख है [TimedCompressedRotatingFileHandler उदाहरण] (http://code.activestate.com/recipes/502265-timedcompressedrotatingfilehandler/) – jfs