一个用于Python3程序的日志记录类,使用的时候,将该类import
进去后,按照这里面的最后两行的测试程序使用即可。程序贴在这里,省的以后造轮子。
Github:https://github.com/tomeasure/Logger-py/tree/master
更新:使用了一个自定义的FileHandler
类。
功能说明:
根据指定的文件名,创建一个符号链接,指向当前时间的日志文件。
举例来说:
- 假设当前时间是
2019年6月6日10时36分23秒
,在创建日志类的时候指定文件名是test_log.log
,则程序将创建一个符号链接test_log.log
,其指向当前的日志文件test_log.log.2019060610
;
当程序不中断,且时间来到2019年6月6日11时0分0秒
的时候,程序将创建新的日志文件test_log.log.2019060611
,并将修改符号链接test_log.log
指向这个新文件,而日志也将在新文件中得到保存。
详细的变化,可以参考https://github.com/tomeasure/Logger-py/commit/243605919eceec25dc0f6f6a39760771a1fce90f#diff-3000fb145a56b8b3c44b6da2269d8c23
$ ls log/
test_log.log -> test_log.log.2019060611
test_log.log.2019060610
test_log.log.2019060611
import logging
import time
import os
class MyFileHandler(logging.FileHandler):
def __init__(self, filename, mode='a', encoding=None, delay=0):
self.__timeformat__ = "%Y%m%d%H"
self.rawFilename = filename
self.latestTime = time.strftime(self.__timeformat__, time.localtime())
self.filename = "%s.%s" % ( filename, self.latestTime )
self.mode = mode
self.encoding = encoding
self.delay = delay
self.baseFilename = os.path.abspath(self.filename)
self.__createFile()
super(MyFileHandler, self).__init__(self.rawFilename, mode, encoding, delay)
def close(self):
logging.FileHandler.close(self)
def _open(self):
return logging.FileHandler._open(self)
def emit(self, record):
currentTime = time.strftime(self.__timeformat__, time.localtime())
if currentTime != self.latestTime:
self.latestTime = currentTime
self.filename = "%s.%s" % (self.rawFilename, self.latestTime)
self.__createFile()
logging.FileHandler.emit(self, record)
def __createFile(self):
if not os.path.exists(self.filename):
with open(self.filename, "w") as fout:
pass
self.baseFilename = os.path.abspath(self.filename)
if not os.path.exists(self.rawFilename):
os.symlink(self.baseFilename, self.rawFilename)
elif not os.path.islink(self.rawFilename):
os.remove(self.rawFilename)
os.symlink(self.baseFilename, self.rawFilename)
elif os.path.realpath(self.rawFilename).split(".")[0] != self.filename.split(".")[0]:
os.remove(self.rawFilename)
os.symlink(self.baseFilename, self.rawFilename)
self.stream = super(MyFileHandler, self)._open()
class Logger():
def __init__(self, logname):
'''
指定保存日志的文件
将日志存入到该文件中
'''
self.logger = logging.getLogger()
self.logger.setLevel(logging.DEBUG)
fh = MyFileHandler(logname)
fh.setLevel(logging.DEBUG)
string = '[%(levelname)s %(asctime)s %(process)d %(pathname)s:%(lineno)d %(funcName)s] %(message)s'
formatter = logging.Formatter(string)
fh.setFormatter(formatter)
self.logger.addHandler(fh)
def createLogger(self):
return self.logger
def getLogger(logname):
logger = Logger(logname)
return logger.createLogger()
def testLogger1():
logger.warning("ceshi")
def testLogger2():
logger.warning("这是一个简单的测试")
logger.warning("这是一个简单的测试")
if __name__ == "__main__":
logger = getLogger("log/testfile.log")
for i in range(180):
testLogger1()
testLogger2()
time.sleep(1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)