import logging
import os
class Log:
'''
模块化使用
: 创建一个logger对象, 并且进行初始化设置
: 将logger对象进行返回, 方便使用
: NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
: 注意这里有个大坑, NOTSET不是显示所有消息, 而是默认的 WARNING 等级
: 想要显示所有的消息, 把等级设置为 logging.DEBUG 或者 10
: logger 和 handle的等级是谁高用谁, 比如 DEBUG和WARNING 不管谁先设置, 都是用 WARNING 等级
'''
def __init__(self, logger_name="logger"):
self.logger = logging.getLogger(logger_name) # 创建一个logger对象
self.logger.setLevel(logging.DEBUG) # NOTSET 默认是WARING
def create_handle(self, log_level=logging.DEBUG, log_file=None):
'''
: log_level 等级
: NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
: 0 < 10 < 20 < 30 < 40 < 50
'''
# 判断是终端输出还是文件输出
if log_file == None:
handle = logging.StreamHandler() # terminal print
else:
handle = logging.FileHandler(log_file, encoding="utf-8") # write to file
handle.setLevel(log_level) # 设置handle的等级
# 设置log输出格式
formatter = logging.Formatter("%(levelname)s - %(asctime)s - %(filename)s[line:%(lineno)d] - %(message)s",datefmt='%Y-%m-%d %a %H:%M:%S')
handle.setFormatter(formatter)
# 添加handle到logger
self.logger.addHandler(handle)
def return_logger(self):
'''
:return: 返回logger以便使用
'''
return self.logger
def create_log_file():
'''
创建一个和当前文件所在目录同级别的一个log目录
log文件: log_file.log
'''
log_dir = os.path.join(os.path.abspath("../.."), "log")
if not os.path.exists(log_dir):
os.mkdir(log_dir)
log_path = os.path.join(log_dir, "log_file.log")
return log_path
def get_logger(logger_name:str = "default_logger", log_file=None, log_file_level=logging.INFO, log_print_level=logging.DEBUG):
'''
传入logger名字, 自动创建两个handle, 一个打印输出 默认为DEBUG, 一个日志文件记录 默认为INFO
:param logger_name: string
:return: logger
'''
if log_file:
if os.path.exists(log_file):
log_path = log_file
else:
print("---Log文件地址不存在, 重新创建Log文件---")
log_path = create_log_file()
else:
print("---未给出Log文件路径, 创建Log文件---")
log_path = create_log_file()
log_obj = Log(logger_name=logger_name)
log_obj.create_handle(log_level=log_print_level)
log_obj.create_handle(log_level=log_file_level, log_file=log_path)
logger = log_obj.return_logger()
logger.warning("--- " + logger_name + " init success ---")
return logger
if __name__ == "__main__":
# 测试
# log_obj = Log(logger_name="test_log")
# log_obj.create_handle()
# logger = log_obj.return_logger()
# logger.info('test_log')
# logger.warning("warning")
get_logger()