
Python日志用 logging 模块写,核心是先获取一个 logger,再配置输出位置、格式和级别——不直接用 print,才能在开发、测试、生产环境灵活控制日志行为。
1. 基础写法:5行搞定简单日志
最简可用的日志代码:
- 调用
logging.basicConfig()一次性设置全局基础配置(仅首次生效) - 用
logging.debug/info/warning/error/critical()直接记录 - 默认只显示
WARNING及以上级别,想看到INFO需显式设level=logging.INFO
示例:
```pythonimport logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
logging.info("服务启动完成")
logging.warning("配置文件未找到,使用默认参数")
```
2. 推荐写法:用 logger 对象,避免污染根日志器
大型项目应创建独立 logger,而不是直接调用顶层函数,好处是可单独配置、避免被其他库干扰:
立即学习“Python免费学习笔记(深入)”;
- 用
logging.getLogger(__name__)获取命名 logger(推荐,模块名自动作标识) - 调用
setLevel()设置该 logger 的最低捕获级别 - 添加
Handler(如StreamHandler输出到控制台,FileHandler写入文件) - 为每个 Handler 绑定
Formatter控制输出格式
示例(控制台+文件双输出):
```pythonimport logging
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
# 控制台输出
ch = logging.StreamHandler()
ch.setLevel(logging.INFO)
ch.setFormatter(logging.Formatter('%(levelname)s - %(message)s'))
# 文件输出
fh = logging.FileHandler('app.log')
fh.setLevel(logging.DEBUG)
fh.setFormatter(logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s'))
logger.addHandler(ch)
logger.addHandler(fh)
logger.debug("数据库连接池初始化中...")
logger.info("用户登录成功:uid=1001")
```
3. 实用技巧:按需切换日志级别与输出目标
不同环境需要不同日志策略,靠配置而非改代码:
- 开发时设为
DEBUG,生产环境通常用WARNING或ERROR - 用
RotatingFileHandler自动轮转日志文件,防止单个文件过大 - 用
TimedRotatingFileHandler按天/小时切分日志(如每天生成app.log.2024-06-15) - 敏感信息(密码、token)不要打日志;必要时用占位符或手动脱敏
4. 常见踩坑提醒
这些细节容易忽略,却直接影响日志是否生效:
-
basicConfig()必须在任何logging.xxx()调用前执行,否则无效 - 多个
basicConfig()只有第一个起作用(它会跳过已存在的 handler) - logger 和 handler 都有 level,最终以“两者中更严格者”为准(取高值)
- 用
getLogger('a.b.c')和getLogger('a.b')是两个不同 logger,父子关系需显式设置传播(propagate=True默认开启)










