Python 3 中的logging 日志文件的回滚模块RotatingFileHandler,主要有两种方式,一种是基于文件的大小进行回滚,第二种是基于当前系统时间进行回滚。但是我们都希望将不同等级的信息放在不同的文件中,第一种目前已有较多的参考,以文件大小方式
当然基于时间回滚的方法即 通过调用TimedRotatingFileHandler()函数进行配置即可,详细的代码见如下`
import os
import time
import logging
import inspect
from logging.handlers import TimedRotatingFileHandler
logging.basicConfig(filemode='a'##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
)
dir = os.path.dirname(__file__)
dir_time = time.strftime('%Y-%m-%d', time.localtime())
handlers = {
# logging.NOTSET: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/notset.log'%dir_time),
#
# logging.DEBUG: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/debug.log'%dir_time),
logging.INFO: os.path.join(dir, 'D:/project/Program/ZXControl/log/Track_info'),
# logging.WARNING: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/warning.log'%dir_time),
logging.ERROR: os.path.join(dir, 'D:/project/Program/ZXControl/log/error'),
# logging.CRITICAL: os.path.join(dir, 'D:/project/Program/ZXControl/log-%s/critical.log'%dir_time),
}
def createHandlers():
logLevels = handlers.keys()
for level in logLevels:
save_dir = "D:/project/Program/ZXControl/log/"
if os.path.exists(save_dir) is False:
os.makedirs(save_dir)
path = os.path.abspath(handlers[level])
handlers[level] = TimedRotatingFileHandler(path, backupCount=0, encoding='utf-8',when='D', interval=1)
# backupCount:允许存储的文件个数,如果大于这个数系统会删除最早的日志文件
#when='D' 代表以天为间隔 S:秒 H:小时
# interval=1 代表间隔多少个 when 进行一次日志分割
TimedRotatingFileHandler.suffix = '%Y-%m-%d.log'
createHandlers()
class TNLog(object):
# 加载模块时创建全局变量
# dir_time = time.strftime('%Y-%m-%d', time.localtime())
def printfNow(self):
return time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())
def __init__(self, level=logging.NOTSET):
self.__loggers = {}
logLevels = handlers.keys()
for level in logLevels:
logger = logging.getLogger(str(level))
# 如果不指定level,获得的handler似乎是同一个handler?s
logger.addHandler(handlers[level])
logger.setLevel(level)
self.__loggers.update({level: logger})
def getLogMessage(self, level, message):
frame, filename, lineNo, functionName, code, unknowField = inspect.stack()[2]
# 日志格式:[时间] [类型] [记录代码] 信息
return "[%s] [%s] [%s - %s - %s] %s" % (self.printfNow(), level, filename, lineNo, functionName, message)
def info(self, message):
message = self.getLogMessage("info", message)
self.__loggers[logging.INFO].info(message)
def error(self, message):
message = self.getLogMessage("error", message)
self.__loggers[logging.ERROR].error(message)
def warning(self, message):
message = self.getLogMessage("warning", message)
self.__loggers[logging.WARNING].warning(message)
def debug(self, message):
message = self.getLogMessage("debug", message)
self.__loggers[logging.DEBUG].debug(message)
def critical(self, message):
message = self.getLogMessage("critical", message)
self.__loggers[logging.CRITICAL].critical(message)
```
if __name__ == "__main__":
while 1:
logger = TNLog()
a=10
# logger.debug("debug")
# logger.debug("test")
logger.info("info"+str(a))
# logger.warning("warning")
logger.error("error")
# logger.critical("critical")
time.sleep(10)`
``
handlers[level] = TimedRotatingFileHandler(path, backupCount=0, encoding=‘utf-8’,when=‘D’, interval=1)
# backupCount:允许存储的文件个数,如果大于这个数系统会删除最早的日志文件
#when=‘D’ 代表以天为间隔 S:秒 H:小时
# interval=1 代表间隔多少个 when 进行一次日志分割
注意!按照官方给的logger文件,日志文件的结尾是以日期结束的,so 进入到官方的hadlers.py文件中相应的命名规则,见图中红框所示的位置,统一加上.log。
这样自动保存下来的日志文件,就可以自动以.log进行结尾了,如图所示。