- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我确实在日志记录方面遇到了一些困难。我想在一段时间后以及达到一定大小后滚动日志。
一段时间后翻转由 TimedRotatingFileHandler
完成,达到一定日志大小后翻转由 RotatingFileHandler
完成.
但是TimedRotatingFileHandler
没有属性maxBytes
并且RotatingFileHandler
不能在一定时间后旋转。我也尝试将两个处理程序添加到记录器,但结果是双倍的记录。
我错过了什么吗?
我还查看了 logging.handlers
的源代码。我尝试子类化 TimedRotatingFileHandler
并重写方法 shouldRollover()
以创建具有两者功能的类:
class EnhancedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0, maxBytes=0):
""" This is just a combination of TimedRotatingFileHandler and RotatingFileHandler (adds maxBytes to TimedRotatingFileHandler) """
# super(self). #It's old style class, so super doesn't work.
logging.handlers.TimedRotatingFileHandler.__init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0)
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.
we are also comparing times
"""
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)
self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
if self.stream.tell() + len(msg) >= self.maxBytes:
return 1
t = int(time.time())
if t >= self.rolloverAt:
return 1
#print "No need to rollover: %d, %d" % (t, self.rolloverAt)
return 0
但是像这样,日志会创建一个备份并被覆盖。似乎我还必须重写方法 doRollover()
,这并不容易。
关于如何创建一个在特定时间后以及达到特定大小后滚动文件的记录器还有其他想法吗?
最佳答案
所以我对 TimedRotatingFileHandler
做了一个小改动,以便能够在时间和大小之后进行翻转。我必须修改 __init__
、shouldRollover
、doRollover
和 getFilesToDelete
(见下文)。这是结果,当我设置 when='M', interval=2, backupCount=20, maxBytes=1048576 时:
-rw-r--r-- 1 user group 185164 Jun 10 00:54 sumid.log
-rw-r--r-- 1 user group 1048462 Jun 10 00:48 sumid.log.2011-06-10_00-48.001
-rw-r--r-- 1 user group 1048464 Jun 10 00:48 sumid.log.2011-06-10_00-48.002
-rw-r--r-- 1 user group 1048533 Jun 10 00:49 sumid.log.2011-06-10_00-48.003
-rw-r--r-- 1 user group 1048544 Jun 10 00:50 sumid.log.2011-06-10_00-49.001
-rw-r--r-- 1 user group 574362 Jun 10 00:52 sumid.log.2011-06-10_00-50.001
您可以看到前四个日志在达到 1MB 大小后翻转,而最后一个翻转发生在两分钟后。到目前为止,我没有测试删除旧日志文件,所以它可能不起作用。该代码肯定不适用于 backupCount>=1000。我在文件名末尾仅附加了三位数字。
这是修改后的代码:
class EnhancedRotatingFileHandler(logging.handlers.TimedRotatingFileHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=0, utc=0, maxBytes=0):
""" This is just a combination of TimedRotatingFileHandler and RotatingFileHandler (adds maxBytes to TimedRotatingFileHandler) """
logging.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.
we are also comparing times
"""
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)
self.stream.seek(0, 2) #due to non-posix-compliant Windows feature
if self.stream.tell() + len(msg) >= self.maxBytes:
return 1
t = int(time.time())
if t >= self.rolloverAt:
return 1
#print "No need to rollover: %d, %d" % (t, self.rolloverAt)
return 0
def doRollover(self):
"""
do a rollover; in this case, a date/time stamp is appended to the filename
when the rollover happens. However, you want the file to be named for the
start of the interval, not the current time. If there is a backup count,
then we have to get a list of matching filenames, sort them and remove
the one with the oldest suffix.
"""
if self.stream:
self.stream.close()
# get the time that this sequence started at and make it a TimeTuple
currentTime = int(time.time())
dstNow = time.localtime(currentTime)[-1]
t = self.rolloverAt - self.interval
if self.utc:
timeTuple = time.gmtime(t)
else:
timeTuple = time.localtime(t)
dstThen = timeTuple[-1]
if dstNow != dstThen:
if dstNow:
addend = 3600
else:
addend = -3600
timeTuple = time.localtime(t + addend)
dfn = self.baseFilename + "." + time.strftime(self.suffix, timeTuple)
if self.backupCount > 0:
cnt=1
dfn2="%s.%03d"%(dfn,cnt)
while os.path.exists(dfn2):
dfn2="%s.%03d"%(dfn,cnt)
cnt+=1
os.rename(self.baseFilename, dfn2)
for s in self.getFilesToDelete():
os.remove(s)
else:
if os.path.exists(dfn):
os.remove(dfn)
os.rename(self.baseFilename, dfn)
#print "%s -> %s" % (self.baseFilename, dfn)
self.mode = 'w'
self.stream = self._open()
newRolloverAt = self.computeRollover(currentTime)
while newRolloverAt <= currentTime:
newRolloverAt = newRolloverAt + self.interval
#If DST changes and midnight or weekly rollover, adjust for this.
if (self.when == 'MIDNIGHT' or self.when.startswith('W')) and not self.utc:
dstAtRollover = time.localtime(newRolloverAt)[-1]
if dstNow != dstAtRollover:
if not dstNow: # DST kicks in before next rollover, so we need to deduct an hour
addend = -3600
else: # DST bows out before next rollover, so we need to add an hour
addend = 3600
newRolloverAt += addend
self.rolloverAt = newRolloverAt
def getFilesToDelete(self):
"""
Determine the files to delete when rolling over.
More specific than the earlier method, which just used glob.glob().
"""
dirName, baseName = os.path.split(self.baseFilename)
fileNames = os.listdir(dirName)
result = []
prefix = baseName + "."
plen = len(prefix)
for fileName in fileNames:
if fileName[:plen] == prefix:
suffix = fileName[plen:-4]
if self.extMatch.match(suffix):
result.append(os.path.join(dirName, fileName))
result.sort()
if len(result) < self.backupCount:
result = []
else:
result = result[:len(result) - self.backupCount]
return result
关于python - logging.handlers : How to rollover after time or maxBytes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6167587/
嘿,我的 javascript 翻转有问题。图像不会改变。我看过一些教程,但看不出哪里出了问题。 这是我的代码: 首页.xhtml newjs.js // Pre load images for
当您将鼠标悬停在图像容器上时,我想制作一个“滚动文本”。 我做得很好,但只有绝对位置,但我不能用相对位置。 现在文本出现在图像之后,但我需要文本作为图像底部的小覆盖层
我知道 this hack对于 inline-block 属性,但由于浏览器支持不佳,它确实是一个hack,我想知道是否有更优雅的解决方案来使用 CSS sprites 而无需 block 元素的必要
我正在尝试使用 jQuery 中的 mouseover 事件将 img 的 src 替换为 img 的 id。但是我的控制台错误表明 $(...) 为空。 有人可以帮我吗?谢谢。 这是我的项目: va
如何使用 Jquery 在悬停时通过向上滑动过渡更改图像?我在互联网上搜索过,但找不到有效代码。我发现的所有代码都使用 fadeIn 或 fadeOut。非常感谢! 这是我找到的代码,但它使用淡入淡出
我想制作一个包含一些内容的 div,当鼠标滑过 div 时,div 中会出现三个链接。像这样: 我一直在通过 Stack 和谷歌进行搜索,但找不到使用三个不同 ahref 标签实现此功能的方法。 ht
我有一些 DIV 元素,我想对其产生滚动效果,但我不知道从哪里开始,或者这是否可以在 CSS 或 jQuery 中实现,甚至根本不知道。 我在下面附上了一张图片: 正常状态只是一张图片 在 rollO
问题: 使用 PDFBox,如何创建具有“鼠标悬停”颜色效果(也称为滚动/鼠标悬停)的链接注释? 这意味着当我将鼠标光标悬停在 PDF 文件中的链接上时(没有单击它),该链接会变为不同的颜色。如果我将
有没有人碰巧知道 log4j 的 DailyRollingFileAppender 类是否能够在与源文件不同的目录中创建新日志? 我知道这可以通过 RollingFileAppender 实现,如下所
您知道什么时候使用 CSS background-position 属性进行翻转,对吗? 滚动元素 1,a:hover 属性将背景更改为 position-x/y 滚动元素 2,a:hover 属性将
基本上我有一堆包裹在一堆 中的标签的,以及一些 javascript 来使它们进行翻转。该页面在 IE 和 Firefox 中运行良好,但 Safari 提供: "TypeError: Result
实时示例页面: http://newsite.702wedding.com/cheap-las-vegas-weddings.asp 我希望右侧的第 3 个框在其中有一个 sprite 图片链接。我似
我正在尝试扩展 RollingFileAppender,以便即使没有消息进入日志系统,它也会轮换。通常,当消息到达并进行时间检查以触发轮换时,会调用 rollOver 方法。 我的 RollingFi
我确实在日志记录方面遇到了一些困难。我想在一段时间后以及达到一定大小后滚动日志。 一段时间后翻转由 TimedRotatingFileHandler 完成,达到一定日志大小后翻转由 RotatingF
好的,我过去做过一些网络开发,但对“css/webkit”动画还很陌生。 我的网站上有一张图片,当用户“悬停”在图片上时,它会播放动画,如下所示: 我想做的是改变这个动画。 我想删除右下角的红色“箭头
我有一种情况需要在单击 JButton 后显示 JOptionPane。 JButton 有一个默认图标和一个滚动图标(当鼠标滑过按钮时显示)。但是,单击按钮并出现 JOptionPane 后,鼠标悬
我想让用户在鼠标悬停时展开缩略图以查看大头像。但是,我目前的翻转效果将表格行扩展到扩展图像的大小,而不是在周围的文本上显示图像。任何人都可以建议一种在翻转时扩展图像而不移动文本的方法,换句话说,在其他
是的,我在这个上画了一个空白,在玩了一会儿之后,CSS 并不像我希望的那样整洁。导航/翻转图像在 Firefox 中按我想要的方式工作,但我无法在 IE 中工作。 IE 基本上将翻转链接堆叠在一起。
我遇到了另一个 CSS/JS 问题:我想制作一个导航菜单,它的开头是一个只有文本的 div。如果我将鼠标悬停在它上面,应该会出现从左到右的背景。 这是否只有 JS 才有可能(所以如果悬停,一个间隔
我的要求是打印当前日期目录中的日志,并且需要在以下条件下在当前日期目录中滚动日志: 达到最大文件大小 或者日期已更改 所以今天的日期是 16/07/2019 所以目录结构应该是 16_07_2019/
我是一名优秀的程序员,十分优秀!