V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  zhangchunjiiw  ›  全部回复第 1 页 / 共 3 页
回复总数  59
1  2  3  
10 天前
回复了 Flourite 创建的主题 Python 请教 Python 大神关于 flask 压测 rps 掉到 0
2 楼正解
```py
import datetime
```
import os
import time

from logging.handlers import TimedRotatingFileHandler


class SafeRotatingFileHandler(TimedRotatingFileHandler):
def __init__(self, filename, when='h', interval=1, backupCount=0, encoding=None, delay=False, utc=False):
TimedRotatingFileHandler.__init__(self, filename, when, interval, backupCount, encoding, delay, utc)

"""
多进程, 文件处理.
Override doRollover
lines commanded by "##" is changed by cc
https://www.jianshu.com/p/d615bf01e37b
"""

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.

Override, 1. if dfn not exist then do rename
2. _open with "a" model
"""
if self.stream:
self.stream.close()
self.stream = None
# 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 os.path.exists(dfn):
# os.remove(dfn)

# Issue 18940: A file may not have been created if delay is True.
# if os.path.exists(self.baseFilename):
if not os.path.exists(dfn) and os.path.exists(self.baseFilename):
os.rename(self.baseFilename, dfn)

if self.backupCount > 0:
for s in self.getFilesToDelete():
os.remove(s)
if not self.delay:
self.mode = "a"
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

init:
class Logger(object):
def __init__(self):
handlers.SafeRotatingFileHandler = SafeRotatingFileHandler

yaml:
info:
class: logging.handlers.SafeRotatingFileHandler
level: INFO
formatter: console
filename: ./log/info.log
when: MIDNIGHT
interval : 1
backupCount: 7
encoding: utf8


表现就是在切分日志的时候, 会发生日志丢失

https://www.jianshu.com/p/d615bf01e37b
重写 TimedRotatingFileHandler, 之前遇到过相似问题, 希望可以帮到你.

这是 21 年左右的方式了, 现在也许会有更好的 :)
货币基金 债券基金 纳指 100 标普 500 我的配置, 会很久吧, 3-5 年起
89 天前
回复了 BORINGGHOST 创建的主题 问与答 连接远程服务器可以用哪些工具
termius
89 天前
回复了 zeusho871 创建的主题 生活 父亲去世一个月 很想他
节哀
94 天前
回复了 HaloLegend 创建的主题 投资 牛回速归,今天你又赚了多少
虽然我 16 号刚清了基金, 但是缅 A 真的太诡异了, 先走为上了...
16 号清了基金... 演我是吧
95 天前
回复了 krisbai 创建的主题 推广 有 V 友喜欢吃软柿子的不?
支持一下
野生动物园和海洋馆 也可以考虑
185 天前
回复了 Olivia35 创建的主题 远程工作 Go 开发~远程岗~有年终奖
@xiaoxlm 大抵都是调 api...
186 天前
回复了 Flowing 创建的主题 MacBook Pro 旧 Mac 你们是咋处理的
看见这多多人吃灰, 我就放心了, 因为我也在吃灰 :)
196 天前
回复了 Ailine 创建的主题 职场话题 Unity 游戏开发者如何转型?
国内的 .net 非常的稀少, 虽然 .net 也挺好
1  2  3  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2940 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 60ms · UTC 14:15 · PVG 22:15 · LAX 06:15 · JFK 09:15
Developed with CodeLauncher
♥ Do have faith in what you're doing.