Python 3.11.4日志级别配置:文件与Telegram日志分流问题咨询
Python日志级别分流配置修正方案
你的配置问题出在两处:
- 根日志器(logger)的级别设为了
logging.WARNING,这会直接过滤掉INFO级别的日志,连文件处理器都接收不到这些日志 tg_logger添加的Telegram处理器没有设置级别,会默认接收所有级别的日志,不符合你"仅WARNING及以上发Telegram"的需求
修正步骤:
- 将根日志器的级别改为
logging.INFO,确保INFO及以上的日志能进入处理器流程 - 获取
tg_logger添加的Telegram处理器,给它单独设置级别为logging.WARNING
修正后的完整代码:
import logging import tg_logger import os from dotenv import load_dotenv from pathlib import Path from logging.handlers import RotatingFileHandler dotenv_path = os.path.join(os.path.dirname(__file__), '.env') if os.path.exists(dotenv_path): load_dotenv(dotenv_path) token = os.getenv("TELEGRAM_BOT_TOKEN") users = [os.getenv("TELEGRAM_CHAT_ID")] script_path = Path(__file__).resolve() script_name = os.path.splitext(os.path.basename(script_path))[0] log_dir = script_path.parent log_file = Path(str(log_dir) + "/" + script_name + ".log") logger = logging.getLogger(script_name) # 先设置tg_logger tg_logger.setup(logger, token=token, users=users, tg_format="<b><u>%(name)s</u> : %(levelname)s</b>\n\n<code>%(message)s</code>") # 获取Telegram处理器并设置级别 for handler in logger.handlers: if isinstance(handler, tg_logger.TgHandler): handler.setLevel(logging.WARNING) break # 设置文件处理器 file_handler = RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=10) file_handler.setLevel(logging.INFO) file_handler.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')) logger.addHandler(file_handler) # 把根日志器级别设为INFO,确保INFO及以上日志能被处理器接收 logger.setLevel(logging.INFO) logger.info(f"Hello from tg_logger by {script_name}") logger.warning(f"Test WARNING {script_name}") #logger.error(f"Test ERROR {script_name}")
说明:
- 根日志器级别设为INFO后,所有INFO、WARNING、ERROR级别的日志都会传递给各个处理器
- Telegram处理器被设置为WARNING级别,只会处理WARNING及以上的日志,满足"同时输出到文件和Telegram"的需求
- 文件处理器保持INFO级别,会处理所有INFO及以上的日志,包括仅需要输出到文件的INFO日志
内容的提问来源于stack exchange,提问作者8j0rn
相关产品推荐
相关产品推荐

