这是我的配置文件:
[loggers]
keys=root
[handlers]
keys=TimedRotatingFileHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=TimedRotatingFileHandler
[handler_TimedRotatingFileHandler]
class=handlers.TimedRotatingFileHandler
level=DEBUG
formatter=simpleFormatter
args=('driver.log', 'midnight', 1, 30)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
在我的代码中,我设置并使用这样的记录器:
import logging
import logging.config
logging.config.fileConfig('logging.conf')
logging.info('Some message...')
消息被记录到我指定的文件(driver.log),但午夜的轮换永远不会发生。
此过程必须在午夜运行才能进行轮换吗?这是一个批处理过程,我每15分钟运行一次,它实际上从未在午夜运行。
答案 0 :(得分:18)
答案是该流程必须始终在运行才能正常运行。
来自http://bytes.com/topic/python/answers/595931-timedrotatingfilehandler-isnt-rotating-midnight:
旋转时应该发生 记录过程创建处理程序 在午夜之前进行记录 之后调用目的地为该处理程序 午夜。
答案 1 :(得分:2)
我猜这真的只发生在午夜运行的过程中。在你的情况下(cronjob运行时间不长),你应该使用一个简单的日志文件,其中当前日期被添加到logfilename。这样,“翻转”就会自动发生。
答案 2 :(得分:1)
我也遇到过这个问题,由于各种原因我无法使用rotatelog和cron来旋转日志只是添加了一个可能出错的额外内容。我每天都使用下面的功能来旋转文件。
import os
import datetime
import glob
def sort_number_ext(s):
try:
return int(os.path.splitext(s)[1][1:])
except:
return s
def rotate_file(file, keep=30):
""" Rotate a file if needed. If the file wasn't modified today then we
rotate it around and remove old files """
modified_date = datetime.datetime.fromtimestamp(os.path.getmtime(file))
if modified_date.date() == datetime.datetime.today().date():
return False
old_files = glob.glob(file + ".*")
old_files.sort(key=sort_number_ext, reverse=True)
for f in old_files:
try:
number = int(os.path.splitext(f)[1][1:])
except ValueError:
continue
if number >= keep:
# If at or above keep limit, remove.
os.unlink(f)
else:
# Increment.
new = "%s.%s" % (os.path.splitext(f)[0], number + 1)
os.rename(f, new)
# Finally rename our log.
os.rename(file, "%s.1" % file)
return True
我在初始化记录器之前调用它来旋转我的日志。