""" import logging import os if not os.path.exists("log"): os.mkdir("log") logging.basicConfig( level=logging.INFO, format="%(asctime)s [%(levelname)s] %(message)s", handlers=[ logging.FileHandler("log/forward.log", encoding="utf-8"), logging.StreamHandler() ] ) logger = logging.getLogger("Forward") """ """ 2026/4/18 Tan Mingyan 原生 logging 模块、按天切割、保留最近 7 天、自动删除旧日志 的方案,零第三方库、直接替换即用, """ import logging import os import sys from logging.handlers import TimedRotatingFileHandler def get_exe_dir(): """获取程序根目录(打包+开发都通用)""" if getattr(sys, 'frozen', False): return os.path.dirname(sys.executable) else: return os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # 日志目录(和exe同一级的logs文件夹) log_dir = os.path.join(get_exe_dir(), "logs") if not os.path.exists(log_dir): os.makedirs(log_dir) # 日志文件路径 log_file = os.path.join(log_dir, "forward.log") # 创建 logger logger = logging.getLogger("ProtocolForward") logger.setLevel(logging.INFO) logger.handlers.clear() # 避免重复打印 # 格式 formatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s", datefmt="%Y-%m-%d %H:%M:%S") # ====================== 核心:按天分割日志 ====================== # when="midnight" 每天0点切割 # backupCount=7 保留最近7天日志,自动删除旧的 file_handler = TimedRotatingFileHandler( log_file, when="midnight", interval=1, backupCount=7, encoding="utf-8", delay=True ) file_handler.setFormatter(formatter) logger.addHandler(file_handler) # 控制台打印(可选) console_handler = logging.StreamHandler() console_handler.setFormatter(formatter) logger.addHandler(console_handler) # 禁止日志传递 logger.propagate = False