赞
踩
文件:setting.py +call.py
setting.py
"""
封装log方法
"""
import os
import time
import logging.handlers
# 日志打印等级
LEVELS = {
'debug': logging.DEBUG,
'info': logging.INFO,
'warning': logging.WARNING,
'error': logging.ERROR,
'critical': logging.CRITICAL
}
# 创建一个日志
logger = logging.getLogger()
level = 'default'
# 创建日志文件方法
def create_file(filename):
path = filename[0:filename.rfind('/')]
if not os.path.isdir(path):
os.makedirs(path)
if not os.path.isfile(filename):
fd = open(filename, mode='w', encoding='utf-8')
fd.close()
else:
pass
# 给logger添加handler 添加内容到日志句柄中
def set_handler(levels):
if levels in ['error', 'critical']:
logger.addHandler(MyLog.err_handler)
logger.addHandler(MyLog.handler)
else:
logger.addHandler(MyLog.handler)
logger.addHandler(MyLog.handler)
# 在记录日志之后移除句柄
def remove_handler(levels):
if levels == 'error':
logger.removeHandler(MyLog.err_handler)
logger.removeHandler(MyLog.handler)
def get_current_time():
return time.strftime(MyLog.date, time.localtime(time.time()))
class MyLog:
path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
log_file = path+'/Log/log.log'
err_file = path+'/Log/err.log'
# critical_file = path + '/Log/critical.log'
logger.setLevel(LEVELS.get(level, logging.NOTSET))
create_file(log_file)
create_file(err_file)
# create_file(critical_file)
date = '%Y-%m-%d %H:%M:%S'
# 创建一个handler,用于写入日志文件
handler = logging.FileHandler(log_file, encoding='utf-8')
err_handler = logging.FileHandler(err_file, encoding='utf-8')
# critical_handler = logging.FileHandler(critical_file, encoding='utf-8')
@staticmethod
def debug(log_meg):
set_handler('debug')
# 文件中输出模式
logger.debug("[DEBUG " + get_current_time() + "]" + log_meg)
remove_handler('debug')
@staticmethod
def info(log_meg):
set_handler('info')
logger.info("[INFO " + get_current_time() + "]" + log_meg)
remove_handler('info')
@staticmethod
def warning(log_meg):
set_handler('warning')
logger.warning("[WARNING " + get_current_time() + "]" + log_meg)
remove_handler('warning')
@staticmethod
def error(log_meg):
set_handler('error')
logger.error("[ERROR " + get_current_time() + "]" + log_meg)
remove_handler('error')
@staticmethod
def critical(log_meg):
set_handler('critical')
logger.error("[CRITICAL "+ get_current_time() + "]" + log_meg)
remove_handler('critical')
# 设置控制台输出格式
formatter = logging.Formatter(
'[%(asctime)s] [%(levelname)s] %(message)s', '%Y-%m-%d %H:%M:%S')
# 再创建一个handler,用于输出到控制台
console = logging.StreamHandler()
console.setFormatter(formatter)
logger.addHandler(console)
console.setLevel(logging.NOTSET)
作用:定义类MyLog; 把日志按5个层级区分分别定义,可自定义输出的文件格式 按控制台和保存日志形式存储与打印
调用
call.py
只需导入资源调用即可在测试中使用
from settings import MyLog
MyLog.debug("This is debug message")
MyLog.info("This is info message")
MyLog.warning("This is warning message")
MyLog.error("This is error")
MyLog.critical("This is critical message")
分别定义各层级的输出格式,源码中输出格式一致,可自行改动
@staticmethod
def debug(log_meg):
生成日志在指定文件夹内,其中error 级别上单独输出到error.log,其余调试日志打印在log文件
1,对日志大小、保存时间没做处理,一般M级日志自动化这里基本够用
2,setting.py 文件内中日志路径,可做适配传参处理
3, 问题,这里对line打印都聚焦在 setting文件内,未能很好体现在脚本具体位置;
文件:setting.py +call.py
setting.py
import logging
import time
import os
log_path = os.path.join((os.path.dirname(os.path.dirname(os.path.realpath(__file__)))),'Log')
return_mark=os.path.exists(log_path)
if return_mark == False:#判断a路径是否存在,不存在则创建一个路径文件夹
os.mkdir(log_path)
class MyLog:
def __init__(self):
# 初始化创建一个带时间戳的log文件
self.logname = os.path.join(log_path, '{0}.log'.format(time.strftime('%Y-%m-%d')))
def __printconsole(self, level, message):
# 创建一个logger
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
# 创建一个handler,用于写入日志文件
fh = logging.FileHandler(self.logname,'a',encoding='utf-8')
fh.setLevel(logging.DEBUG)
# 再创建一个handler,用于输出到控制台
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
# 定义handler的输出格式
formatter = logging.Formatter('[%(asctime)s] [%(name)s] [%(filename)s]'
' [%(funcName)s] [%(lineno)d] [%(thread)d] [%(levelname)s] '
': %(message)s')
fh.setFormatter(formatter)
ch.setFormatter(formatter)
# 给logger添加handler
logger.addHandler(fh)
logger.addHandler(ch)
# 记录一条日志
if level == 'info':
logger.info(message)
elif level == 'debug':
logger.debug(message)
elif level == 'warning':
logger.warning(message)
elif level == 'error':
logger.error(message)
elif level == 'critical':
logger.critical(message)
logger.removeHandler(ch)
logger.removeHandler(fh)
# 关闭打开的文件
fh.close()
def debug(self,message):
self.__printconsole('debug', message)
def info(self,message):
self.__printconsole('info', message)
def warning(self,message):
self.__printconsole('warning', message)
def error(self,message):
self.__printconsole('error', message)
def critical(self, message):
self.__printconsole('critical', message)
call.py
from settings import MyLog
MyLog().debug("This is debug message")
MyLog().info("This is info message")
MyLog().warning("This is warning message")
MyLog().error("This is error")
MyLog().critical("This is critical message")
控制台输出:和文件输出一致
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [35] [11064] [DEBUG] : This is debug message
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [33] [11064] [INFO] : This is info message
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [37] [11064] [WARNING] : This is warning message
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [39] [11064] [ERROR] : This is error
[2023-01-08 17:44:10,176] [root] [settings.py] [__printconsole] [41] [11064] [CRITICAL] : This is critical message
https://blog.csdn.net/weixin_42914706/article/details/129018459
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。