import logging
import os
from logging.handlers import RotatingFileHandler
class ProjectLogFilter(logging.Filter):
"""构造一个过滤器,只输出当前项目目录下的logger内容。"""
def __init__(self):
# 获取当前脚本的目录
current_dir = os.path.abspath(os.path.dirname(__file__))
# 获取上级目录
parent_dir = os.path.join(current_dir, os.pardir)
# 存储项目中所有的 Python 文件
pys = []
for _, _, i in os.walk(parent_dir):
pys.extend([j for j in i if j.endswith('py')])
self.pys = pys
def filter(self, record):
# 检查日志记录的文件名(record.filename)是否在 self.pys 列表中
if record.filename in self.pys:
return True
return False
def init_root_logger(level, logfile=None, is_screen_output=True):
"""用来设置root logger的日志输出。
参数:
level: 日志等级
logfile: 输出文件位置。
screen: True/False,是否输出到屏幕。
返回值:
无
"""
assert level in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL','NOTSET']
assert is_screen_output in [True,False]
handlers = []
#屏幕输出 handler
if is_screen_output:
screen_handler = logging.StreamHandler()
screen_handler.setLevel(level)
screen_handler.addFilter(ProjectLogFilter())
handlers.append(screen_handler)
# 创建并配置向回滚文件中输出的handler
if logfile is not None:
filehanlder = RotatingFileHandler(
logfile,
maxBytes=10 * 1024 * 1024,
backupCount=5
)
filehanlder.setLevel(level)
handlers.append(filehanlder)
# 设置输出格式
LOG_FORMAT = '[\033[32m%(levelname)s/%(module)s:(%(lineno)d) %(asctime)s ]\033[0m %(message)s'
LOG_FORMAT_DATE = '%Y-%m-%d %H:%M:%S'
# root logger配置
logging.basicConfig(level=level,
format=LOG_FORMAT,
datefmt=LOG_FORMAT_DATE,
handlers=handlers)
def init_module_logger(logger: logging.Logger ,level, logfile=None, is_screen_output=True):
"""用来设置各个模块 logger的日志输出。
参数:
logger: 需要设置的logger.
level: 日志等级
logfile: 输出文件位置。
screen: True/False,是否输出到屏幕。
返回值:
无
"""
assert level in ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL','NOTSET']
assert is_screen_output in [True, False]
handlers = []
# 屏幕输出 handler
if is_screen_output:
screen_handler = logging.StreamHandler()
screen_handler.setLevel(level)
screen_handler.addFilter(ProjectLogFilter())
handlers.append(screen_handler)
# 创建并配置向回滚文件中输出的handler
if logfile is not None:
filehanlder = RotatingFileHandler(
logfile,
maxBytes=10 * 1024 * 1024,
backupCount=5
)
filehanlder.setLevel(level)
handlers.append(filehanlder)
# 设置输出格式
LOG_FORMAT = '[\033[32m%(levelname)s/%(module)s:(%(lineno)d) %(asctime)s ]\033[0m %(message)s'
LOG_FORMAT_DATE = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(LOG_FORMAT,LOG_FORMAT_DATE)
# 取消 log 记录向上传播
logger.propagate = False
# logger配置
logger.setLevel(level)
for handler in handlers:
handler.setFormatter(formatter)
logger.addHandler(handler)