<p>我继承并重写python日志处理程序的<code>RotatingFileHandler</code>。在</p>
<p>RotatingFileHandler具有<code>self.baseFilename</code>值,处理程序将使用<code>self.baseFilename</code>来创建日志文件。(当它首先创建文件或发生滚动时)</p>
<p><code>self.shouldRollover()</code>方法,它检查处理程序是否应该滚动日志文件。在</p>
<p>如果此方法<code>return 1</code>,则表示应该发生滚动或{<cd6>}。在</p>
<p>通过重写它们,我定义了这个处理程序何时进行rollover,以及rollover应该为新的日志文件使用哪个名称。在</p>
<p><em>-编辑-</em></p>
<p>我发布了示例代码。在</p>
<pre><code>from logging import handlers
class DailyRotatingFileHandler(handlers.RotatingFileHandler):
def __init__(self, alias, basedir, mode='a', maxBytes=0, backupCount=0, encoding=None, delay=0):
"""
@summary:
Set self.baseFilename to date string of today.
The handler create logFile named self.baseFilename
"""
self.basedir_ = basedir
self.alias_ = alias
self.baseFilename = self.getBaseFilename()
handlers.RotatingFileHandler.__init__(self, self.baseFilename, mode, maxBytes, backupCount, encoding, delay)
def getBaseFilename(self):
"""
@summary: Return logFile name string formatted to "today.log.alias"
"""
self.today_ = datetime.date.today()
basename_ = self.today_.strftime("%Y-%m-%d") + ".log" + '.' + self.alias_
return os.path.join(self.basedir_, basename_)
def shouldRollover(self, record):
"""
@summary:
Rollover happen
1. When the logFile size is get over maxBytes.
2. When date is changed.
@see: BaseRotatingHandler.emit
"""
if self.stream is None:
self.stream = self._open()
if self.maxBytes > 0 :
msg = "%s\n" % self.format(record)
self.stream.seek(0, 2)
if self.stream.tell() + len(msg) >= self.maxBytes:
return 1
if self.today_ != datetime.date.today():
self.baseFilename = self.getBaseFilename()
return 1
return 0
</code></pre>
<p>此DailyRotatingFileHandler将创建日志文件,如下所示</p>
^{pr2}$