日志名称自定义
按照日期切割日志:
默认生成的日志文件格式是你的
文件名+时间
的格式,没有设置时间的话默认设置到了秒(这里是按秒切割)
import logging
from logging.handlers import TimedRotatingFileHandler
from logging.handlers import RotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
# timed日志初始化
def timed_init_log(log_path="", log_file_name="log_test"):
# 创建日志文件文件夹
if not os.path.exists(log_path):
os.makedirs(log_path)
# 设置默认级别
logging.getLogger('').setLevel(logging.INFO)
# 设置标准输出显示
console = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
'%(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
# 设置回滚文件
log_file_name_ = "{}{}.log".format(log_file_name, "")
rotating_file = TimedRotatingFileHandler(os.path.join(log_path, log_file_name_), when='S', interval=1, backupCount=3)
rotating_file.setFormatter(formatter)
logging.getLogger('').addHandler(rotating_file)
![image.png](https://img-blog.csdnimg.cn/img_convert/e56f788b171488051ea63d95717c4c1a.png#align=left&display=inline&height=66&margin=[object Object]&name=image.png&originHeight=66&originWidth=778&size=13907&status=done&style=none&width=778)
修改日志格式后缀名称:
def namer(filename):
dir_name, base_name = os.path.split(filename)
base_name = base_name.replace(log_file_name_+'.', log_file_name)
rotation_filename = os.path.join(dir_name, base_name)
return rotation_filename
rotating_file.namer = namer
rotating_file.suffix = "_%Y-%m-%d_%H-%M-%S.log"
![image.png](https://img-blog.csdnimg.cn/img_convert/b59673f04ae06d5112c66cc4491d0435.png#align=left&display=inline&height=180&margin=[object Object]&name=image.png&originHeight=180&originWidth=780&size=37087&status=done&style=none&width=780)
日志没有起到自动删除的目的
源码:
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:]
if self.extMatch.match(suffix):
result.append(os.path.join(dirName, fileName))
if len(result) < self.backupCount:
result = []
else:
result.sort()
result = result[:len(result) - self.backupCount]
return result
这是它的删除逻辑,关键是通过
.
前面的字段判断是否重复,当有特定的重复数后开始删除。
修改源码:
import logging
from logging.handlers import TimedRotatingFileHandler as OriginTimedRotatingFileHandler
from logging.handlers import RotatingFileHandler as OriginRotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
env = os.environ.get('env') or 'test'
print(env)
class TimedRotatingFileHandler(OriginTimedRotatingFileHandler):
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.replace(".log", self.suffix.split("%")[0])
plen = len(prefix)
for fileName in fileNames:
if fileName[:plen] == prefix:
suffix = fileName[plen:]
if self.extMatch.match(suffix):
result.append(os.path.join(dirName, fileName))
if len(result) < self.backupCount:
result = []
else:
result.sort()
result = result[:len(result) - self.backupCount]
return result
# timed日志初始化
def timed_init_log(log_path="", log_file_name="log_test"):
# 创建日志文件文件夹
if not os.path.exists(log_path):
os.makedirs(log_path)
# 设置默认级别
logging.getLogger('').setLevel(logging.INFO)
# 设置标准输出显示
console = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
'%(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
# 设置回滚文件
log_file_name_ = "{}{}.log".format(log_file_name, "")
rotating_file = TimedRotatingFileHandler(os.path.join(log_path, log_file_name_), when='S', interval=1, backupCount=3)
def namer(filename):
dir_name, base_name = os.path.split(filename)
base_name = base_name.replace(log_file_name_+'.', log_file_name)
rotation_filename = os.path.join(dir_name, base_name)
return rotation_filename
rotating_file.namer = namer
rotating_file.suffix = "_%Y-%m-%d_%H-%M-%S.log"
rotating_file.setFormatter(formatter)
logging.getLogger('').addHandler(rotating_file)
timed_init_log("./time_logs", "log_{}".format(env))
i = 0
while True:
logging.info("sdiogbdfnog{}".format(i))
time.sleep(1)
i += 1
![image.png](https://img-blog.csdnimg.cn/img_convert/2a1b0590df07a328068921e0a2deee3a.png#align=left&display=inline&height=82&margin=[object Object]&name=image.png&originHeight=82&originWidth=780&size=15845&status=done&style=none&width=780)
按照大小切割日志:
import logging
from logging.handlers import TimedRotatingFileHandler as OriginTimedRotatingFileHandler
from logging.handlers import RotatingFileHandler as OriginRotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
env = os.environ.get('env') or 'test'
class RotatingFileHandler(OriginRotatingFileHandler):
def doRollover(self):
"""
Do a rollover, as described in __init__().
"""
if self.stream:
self.stream.close()
self.stream = None
dirName, baseName = os.path.split(self.baseFilename)
baseName = baseName.replace(".log", "")
if self.backupCount > 0:
for i in range(self.backupCount - 1, 0, -1):
dfn = self.rotation_filename("%s.%d" % (self.baseFilename, i + 1))
sfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i)))
dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i+1)))
if len(sfn_) > 0:
if len(dfn_) >0:
os.remove(dfn_[0])
os.rename(sfn_[0], dfn)
dfn = self.rotation_filename(self.baseFilename + ".1")
dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, 1)))
if len(dfn_):
os.remove(dfn_[0])
self.rotate(self.baseFilename, dfn)
if not self.delay:
self.stream = self._open()
# rota日志初始化
def rota_init_log(log_path="", log_file_name="log_test"):
# 创建日志文件文件夹
if not os.path.exists(log_path):
os.makedirs(log_path)
# 设置默认级别
logging.getLogger('').setLevel(logging.INFO)
# 设置标准输出显示
console = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
'%(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
# 设置回滚文件
log_file_name_ = "{}{}.log".format(log_file_name, "")
rotating_file = RotatingFileHandler(os.path.join(log_path, log_file_name_), maxBytes=20*1024*1024, backupCount=3)
rotating_file.setFormatter(formatter)
logging.getLogger('').addHandler(rotating_file)
rota_init_log("./rota_logs", "log_{}".format(env))
i = 0
while True:
logging.info("sdiogbdfnog{}".format(i))
time.sleep(1)
i += 1
![image.png](https://img-blog.csdnimg.cn/img_convert/ac5357ac49c72dbac0689e4da1b0f076.png#align=left&display=inline&height=72&margin=[object Object]&name=image.png&originHeight=72&originWidth=780&size=15073&status=done&style=none&width=780)
- 汇总:
import logging
from logging.handlers import TimedRotatingFileHandler as OriginTimedRotatingFileHandler
from logging.handlers import RotatingFileHandler as OriginRotatingFileHandler
import os
import sys
from datetime import datetime, timedelta
import time
import glob
env = os.environ.get('env') or 'test'
class TimedRotatingFileHandler(OriginTimedRotatingFileHandler):
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.replace(".log", self.suffix.split("%")[0])
plen = len(prefix)
for fileName in fileNames:
if fileName[:plen] == prefix:
suffix = fileName[plen:]
if self.extMatch.match(suffix):
result.append(os.path.join(dirName, fileName))
if len(result) < self.backupCount:
result = []
else:
result.sort()
result = result[:len(result) - self.backupCount]
return result
class RotatingFileHandler(OriginRotatingFileHandler):
def doRollover(self):
"""
Do a rollover, as described in __init__().
"""
if self.stream:
self.stream.close()
self.stream = None
dirName, baseName = os.path.split(self.baseFilename)
baseName = baseName.replace(".log", "")
if self.backupCount > 0:
for i in range(self.backupCount - 1, 0, -1):
dfn = self.rotation_filename("%s.%d" % (self.baseFilename, i + 1))
sfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i)))
dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, i+1)))
if len(sfn_) > 0:
if len(dfn_) >0:
os.remove(dfn_[0])
os.rename(sfn_[0], dfn)
dfn = self.rotation_filename(self.baseFilename + ".1")
dfn_ = glob.glob("{}/{}*".format(dirName,"{}{}{}".format(baseName, self.suffix, 1)))
if len(dfn_):
os.remove(dfn_[0])
self.rotate(self.baseFilename, dfn)
if not self.delay:
self.stream = self._open()
# rota日志初始化
def rota_init_log(log_path="", log_file_name="log_test"):
# 创建日志文件文件夹
if not os.path.exists(log_path):
os.makedirs(log_path)
# 设置默认级别
logging.getLogger('').setLevel(logging.INFO)
# 设置标准输出显示
console = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
'%(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
# 设置回滚文件
log_file_name_ = "{}{}.log".format(log_file_name, "")
rotating_file = RotatingFileHandler(os.path.join(log_path, log_file_name_), maxBytes=20*1024*1024, backupCount=3)
def namer(filename):
dir_name, base_name = os.path.split(filename)
base_name = "{}_{}.log".format(base_name.replace('.log.', "_"), datetime.now().strftime("%Y-%m-%d_%H-%M-%S"))
rotation_filename = os.path.join(dir_name, base_name)
return rotation_filename
rotating_file.namer = namer
rotating_file.suffix = "_"
rotating_file.setFormatter(formatter)
logging.getLogger('').addHandler(rotating_file)
# timed日志初始化
def timed_init_log(log_path="", log_file_name="log_test"):
# 创建日志文件文件夹
if not os.path.exists(log_path):
os.makedirs(log_path)
# 设置默认级别
logging.getLogger('').setLevel(logging.INFO)
# 设置标准输出显示
console = logging.StreamHandler(sys.stdout)
formatter = logging.Formatter('%(levelname)s %(asctime)s %(thread)d %(filename)s[line:%(lineno)d]: '
'%(message)s')
console.setFormatter(formatter)
logging.getLogger('').addHandler(console)
# 设置回滚文件
log_file_name_ = "{}{}.log".format(log_file_name, "")
rotating_file = TimedRotatingFileHandler(os.path.join(log_path, log_file_name_), when='S', interval=1, backupCount=3)
def namer(filename):
dir_name, base_name = os.path.split(filename)
base_name = base_name.replace(log_file_name_+'.', log_file_name)
rotation_filename = os.path.join(dir_name, base_name)
return rotation_filename
rotating_file.namer = namer
rotating_file.suffix = "_%Y-%m-%d_%H-%M-%S.log"
rotating_file.setFormatter(formatter)
logging.getLogger('').addHandler(rotating_file)
rota_init_log("./rota_logs", "log_{}".format(env))
timed_init_log("./time_logs", "log_{}".format(env))
i = 0
while True:
logging.info("sdiogbdfnog{}".format(i))
time.sleep(1)
i += 1