- 适用:接口自动化、Web 项目,同时输出控制台 + 日志文件,自动轮转,utf8 防止中文乱码,可直接复制进项目。
# 目录结构
project/
├── logs/ # 日志文件夹
└── common/
└── logger.py # 日志封装模块
import logging
import os
from logging.handlers import RotatingFileHandler
def get_logger(name="project"):
# 1. 创建logger对象
logger = logging.getLogger(name)
logger.setLevel(logging.DEBUG)
# 防止重复添加handler,重复打印日志
if logger.handlers:
return logger
# 2. 日志保存路径,自动创建logs文件夹
log_dir = os.path.join(os.path.dirname(os.path.dirname(__file__)), "logs")
if not os.path.exists(log_dir):
os.mkdir(log_dir)
log_file = os.path.join(log_dir, "app.log")
# 3. 定义日志格式
log_format = logging.Formatter(
"%(asctime)s - %(name)s - %(levelname)s - %(filename)s:%(lineno)d - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
# 4. 文件handler:单个文件最大5MB,最多保留3个备份
file_handler = RotatingFileHandler(
log_file,
maxBytes=5 * 1024 * 1024,
backupCount=3,
encoding="utf-8"
)
file_handler.setLevel(logging.INFO)
file_handler.setFormatter(log_format)
# 5. 控制台handler
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.DEBUG)
console_handler.setFormatter(log_format)
# 6. 挂载handler
logger.addHandler(file_handler)
logger.addHandler(console_handler)
return logger
# 全局logger实例,项目直接导入使用
log = get_logger("auto_test")
from common.logger import log
def query_user_info(user_id):
log.info(f"开始查询用户,user_id={user_id}")
try:
# 模拟接口请求
res = {"code": 300, "data": {"name": "test"}}
log.debug(f"接口返回原始数据:{res}")
if res["code"] != 200:
log.warning(f"接口返回非200,响应:{res}")
return res
except Exception as e:
log.error(f"查询用户接口异常:{str(e)}", exc_info=True) # exc_info=True 打印堆栈
return None
if __name__ == "__main__":
log.info("===== 项目启动 =====")
query_user_info(10086)
log.info("===== 执行结束 =====")