Python logging模块需避免root logger,按模块名(如"app.db")创建独立logger并设不同级别;通过多个Handler实现多目标输出;用dictConfig动态适配环境;注意basicConfig只生效一次、防Handler重复添加等陷阱。

Python的logging模块远不止logging.basicConfig()和logger.info()这么简单。真正实用的项目中,需要按模块分级输出、区分开发/生产环境、同时写入文件和控制台、甚至动态调整日志级别——这些都依赖对Handler、Formatter、Filter和Logger层级关系的精准控制。
按模块设置不同日志级别
大型项目常需让核心模块(如数据库操作)输出DEBUG级日志,而UI层只记录WARNING以上。关键在于**避免使用root logger**,而是为每个模块创建独立命名的logger:
- 在
db.py中:logger = logging.getLogger("app.db"),再调用logger.setLevel(logging.DEBUG) - 在
ui.py中:logger = logging.getLogger("app.ui"),设为WARNING - 所有logger共享同一组Handler(如一个FileHandler),但各自级别独立生效
- 注意:logger名带点号(如
"app.db")会自动构成层级关系,"app"的级别不会覆盖子logger的显式设置
多目标输出:控制台+文件+错误专用文件
一个典型配置是:INFO及以上写入主日志文件,ERROR单独存到error.log,同时DEBUG以上实时打印到终端。这需要多个Handler协同工作:
- 创建
RotatingFileHandler处理主日志,设level=logging.INFO - 创建第二个
RotatingFileHandler专捕ERROR,用setLevel(logging.ERROR)并添加Filter确保只传ERROR - 用
StreamHandler输出到终端,设为DEBUG,再配自定义Formatter加颜色(可用colorama或ANSI转义) - 所有Handler都add到同一个logger(如
logging.getLogger("app")),而非分别add到不同logger
环境感知配置:开发/测试/生产自动切换
通过读取环境变量或配置文件,动态加载不同策略:
标签: python app ai 环境变量 stream 配置文件 开发环境 asic
还木有评论哦,快来抢沙发吧~