逻辑说明
创建一个类,
包括初始化方法,传入文件名(不带后缀),输出模式
设置级别和日志相关初始化
代码实现
import logging,os
from logging.handlers import RotatingFileHandler
class Logger:
# 加锁
_instance_lock = threading.Lock()
def __init__(self,filename,debug=1):
"""
:param filename:日志文件名
:param debug: 1 为调试模式,控制台打印
"""
self.filename = filename
self.debug_node = debug
self.logger = logging.getLogger(filename)
self.init_log()
def __new__(cls, *args, **kwargs):
# 实现单例模式
if not hasattr(cls, '_instance'):
with Logger._instance_lock:
if not hasattr(cls, '_instance'):
Logger._instance = object.__new__(cls)
return Logger._instance
def init_log(self):
"""设置级别和日志相关初始化"""
self.logger.setLevel(logging.DEBUG)
log_path = os.path.dirname(os.path.abspath(__file__))
if not os.path.exists(log_path):
os.mkdir(log_path)
logname = os.path.join(log_path, self.filename + '.log')
fh = RotatingFileHandler(logname, maxBytes=100*1024*1024,backupCount=3,encoding='utf8') # backupCount用于控制日志文件的数量,如果创建的日志文件数量多于这个数值,就删除最老的。
if self.debug_node:
fh.setLevel(logging.DEBUG)
# 控制台是否输出
console = logging.StreamHandler()
console.setLevel(logging.DEBUG)
self.logger.addHandler(console)
else:
fh.setLevel(logging.INFO)
self.logger.addHandler(fh)
def format_log(self,level, message):
"""用于获取执行文件和格式化输出"""
frame, filename, lineNo, functionName, code, unknowField = inspect.stack()[0]
return "[%s] [%s] [%s - %s - %s] %s" % (time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()), level, filename, lineNo, functionName, message)
def info(self,msg):
message = self.format_log('info',msg)
self.logger.info(message)
def error(self, msg):
message = self.format_log('error',msg)
self.logger.error(message)
def debug(self, msg):
message = self.format_log('dubug',msg)
self.logger.debug(message)
def warning(self, msg):
message = self.format_log('warning',msg)
self.logger.warning(message)