python获取文件修改时间 错误_Python旋转文件处理程序记录错误的时间戳ord

主管要求解决日志中的并发问题,日志文件在不同文件开头/结尾处有混合时间戳。使用循环文件处理程序,第二个文件时间戳未从第一个文件结束时开始。应用程序多线程,虽内置日志线程安全,但仍出现问题,每秒有10多个日志记录。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我的主管希望我解决“日志中的并发问题”,他说我们正在生成的日志文件在不同文件的开头/结尾处有混合的时间戳。即:第一个日志文件末尾有:[03/Dec/2013:13:55:19]---------------------

[03/Dec/2013:13:55:20]---------------------

[03/Dec/2013:13:55:20]---------------------

第二个文件开始于:[03/Dec/2013:13:40:16]---------------------

[03/Dec/2013:13:40:16]---------------------

[03/Dec/2013:13:40:23]---------------------

我们使用循环文件处理程序,第二个文件的时间戳应该从第一个文件结束时开始,但是它没有。在文件循环期间,如何使时间戳以正确的顺序刷新到日志中?在

“Logger”类,它只使用Python日志模块:class logger:

def __init__(self, logger_name='prod'):

self.error_logger = logging.getLogger(logger_name+'_error')

def error(self, msg='', level='error'):

if msg:

getattr(self.error_logger,level)(msg)

def log(self, msg='', level='info'):

if msg:

getattr(self.error_logger,level)(msg)

日志格式:class our_formatter(logging.Formatter):

def find_topmost_stack_frame(self):

i = 0

stack = []

while True:

try:

fr = sys._getframe(i)

if fr.f_code.co_name == '__call__':

break

stack.append(fr)

except:

break

i += 1

return "%s:%s" % (stack[-4].f_code.co_filename, stack[-4].f_lineno)

def format(self, record):

try:

if record.done:

return record.msg

except:

record.done = False

rtime = time.strftime("%d/%b/%Y:%H:%M:%S", time.localtime(record.created))

from tools.user_management import user_pack

email = user_pack().get_email()

if record.levelno > 20:

if email:

record.msg = '[%s][user:%s][%s] {%s} %s' % ( rtime, email, record.levelname, self.find_topmost_stack_frame(),

record.msg)

else:

record.msg = '[%s][%s] {%s} %s' % ( rtime, record.levelname, self.find_topmost_stack_frame(), record.msg)

else:

if email:

record.msg = '[%s][user:%s][%s] %s' % ( rtime, email, record.levelname, record.msg)

else:

record.msg = '[%s][%s] %s' % ( rtime, record.levelname, record.msg)

record.done = True

return logging.Formatter.format(self, record)

最后是记录器的配置:log = cherrypy.log

log.error_file = None

maxBytes = getattr(log, "rot_maxBytes", 10000000)

backupCount = getattr(log, "rot_backupCount", 1000)

fname = getattr(log, "rot_error_file", "logs/error.log")

logger = logging.getLogger()

logger.setLevel(0)

# Make a new RotatingFileHandler for the error log.

h = logging.handlers.RotatingFileHandler(fname, 'a', maxBytes, backupCount)

h.setFormatter(rest_formatter())

log.error_log.addHandler(h)

# set up custom ReST logger

logger = logging.getLogger("rest_error")

logger.addHandler(h)

# set up our custom logger

ha = logging.handlers.RotatingFileHandler(fname, 'a', maxBytes, backupCount)

ha.setFormatter(our_formatter())

logger = logging.getLogger("prod_error")

logger.addHandler(ha)

应用程序是多线程的,但是内置的日志应该是线程安全的(我今天读了它的一些代码,它肯定有一些锁的用法)。在

问题只是在一个文件的开始和前一个文件的结尾之间(而不是中间),所以我认为这是记录器保留文件空间的某种情况,但是我理解它仍然应该保持正确的顺序,因为每个指定的文件处理程序应该只有一个logger实例。在

我们有很多伐木。我的意思是,通常每秒有10多个日志。在

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值