自定义logger类
创建logger.py文件
class CommonTimedRotatingFileHandler(TimedRotatingFileHandler):
;property
def dfn(self):
currentTime = int(time.time())
# get the time that this sequence started at and make it a TimeTuple
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.rotation_filename(self.baseFilename ; ;.; ; time.strftime(self.suffix, timeTuple))
return dfn
def shouldRollover(self, record):
;;;
是否应该执行日志滚动操作;
1、存档文件已存在时;执行滚动操作
2、当前时间 >= 滚动时间点时;执行滚动操作
;;;
dfn = self.dfn
t = int(time.time())
if t >= self.rolloverAt or os.path.exists(dfn):
return 1
return 0
def doRollover(self):
;;;
执行滚动操作
1、文件句柄更新
2、存在文件处理
3、备份数处理
4、下次滚动时间点更新
;;;
if self.stream:
self.stream.close()
self.stream = None
# get the time that this sequence started at and make it a TimeTuple
dfn = self.dfn
# 存档log 已存在处理
if not os.path.exists(dfn):
self.rotate(self.baseFilename, dfn)
# 备份数控制
if self.backupCount > 0:
for s in self.getFilesToDelete():
os.remove(s)
# 延迟处理
if not self.delay:
self.stream = self._open()
# 更新滚动时间点
currentTime = int(time.time())
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]
dstNow = time.localtime(currentTime)[-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
class中引入重写的log类
# =================LOG 配置=================
cur_path = os.path.dirname(os.path.realpath(__file__)) # log_path是存放日志的路径
log_path = os.path.join(os.path.dirname(cur_path), ;logs;)
if not os.path.exists(log_path):
os.mkdir(log_path) # 如果不存在这个logs文件夹;就自动创建一个
import logging.config
LOGGING = {
;version;: 1,
;disable_existing_loggers;: False,
;formatters;: {
# 日志格式
;standard;: {
;format;: %(asctime)s [%(filename)s:%(lineno)d] [%(module)s:%(funcName)s] ;
%(levelname)s - %(message)s;},
;simple;: { # 简单格式
;format;: %(levelname)s %(message)s;
},
},
# 过滤
;filters;: {
},
# 定义具体处理日志的方式
;handlers;: {
# 默认记录所有日志;按日期滚动输出到文件
;default;: {
;level;: ;INFO;,
;class;: ;common.logger.CommonTimedRotatingFileHandler;,
;filename;: os.path.join(log_path, ;all-{}.log;.format(time.strftime(%Y-%m-%d;))),
;when;: ;midnight;,
;interval;: 1,
;backupCount;: 7, # 备份数
;formatter;: ;standard;, # 输出格式
;encoding;: ;utf-8;, # 设置默认编码;否则打印出来汉字乱码
},
# 控制台输出
;console;: {
;level;: ;DEBUG;,
;class;: ;logging.StreamHandler;,
;formatter;: ;standard;
},
},
# 配置用哪几种 handlers 来处理日志
;loggers;: {
# 类型 为 django 处理所有类型的日志; 默认调用
;django;: {
;handlers;: [;default;, ;console;],
;level;: ;INFO;,
;propagate;: True
},
# log 调用时需要当作参数传入
;log;: {
;handlers;: [;default;, ;console;],
;level;: ;INFO;,
;propagate;: True
},
}
}
logging.config.dictConfig(LOGGING)
import logging
logger = logging.getLogger(;log;)
logger.info(;lalalala;)