logging模块用法
一、logging 模块的作用
logging 的核心功能是:
在程序运行过程中,输出并记录各种级别的日志(调试信息、警告、错误、关键事件等)。
相比 print(),它的优势:
| 特点 | print() |
logging |
|---|---|---|
| 输出级别控制 | ❌ 无 | ✅ 支持 DEBUG/INFO/WARNING/ERROR/CRITICAL |
| 输出到文件 | ❌ 不行 | ✅ 可以写入文件、控制台、网络、Syslog |
| 可格式化输出 | ❌ 简单 | ✅ 自定义时间、模块、行号等格式 |
| 生产环境适用 | ❌ 不适合 | ✅ 广泛用于企业级系统日志、运维脚本 |
二、基础用法
示例 1:最简单的日志输出
import logging
logging.basicConfig(level=logging.INFO)
logging.info("启动程序")
logging.warning("磁盘空间不足")
logging.error("无法连接数据库")
输出:
INFO:root:启动程序
WARNING:root:磁盘空间不足
ERROR:root:无法连接数据库
三、日志级别(Level)
logging 内置 5 个常用日志等级(从低到高):
| 级别名 | 常量 | 用途 |
|---|---|---|
DEBUG |
10 | 调试信息(开发阶段) |
INFO |
20 | 一般运行信息(系统状态、启动完成) |
WARNING |
30 | 警告(潜在问题、不影响运行) |
ERROR |
40 | 错误(程序异常、功能失败) |
CRITICAL |
50 | 严重错误(系统崩溃) |
在设置 basicConfig(level=logging.INFO) 时,
表示 只输出 INFO 及以上等级的日志。
四、输出格式控制
使用 format 参数定义日志格式:
logging.basicConfig(
level=logging.INFO,
format="[%(levelname)s] %(asctime)s - %(filename)s:%(lineno)d - %(message)s"
)
输出示例:
[INFO] 2025-10-15 11:48:23,001 - my_script.py:42 - 启动 Docker 容器成功
常用格式化变量:
| 变量 | 含义 |
|---|---|
%(asctime)s |
时间 |
%(levelname)s |
日志级别 |
%(filename)s |
文件名 |
%(lineno)d |
行号 |
%(message)s |
日志内容 |
%(name)s |
Logger 名称 |
五、输出到文件
logging.basicConfig(
level=logging.INFO,
filename='/var/log/python_docker.log',
filemode='a', # 追加模式
format='%(asctime)s [%(levelname)s] %(message)s'
)
logging.info("程序启动")
logging.error("Docker 启动失败")
输出到 /var/log/python_docker.log 文件中。
六、高级用法:多 Handler 输出
你可以同时输出到控制台和文件:
import logging
# 创建 Logger
logger = logging.getLogger("docker_manager")
logger.setLevel(logging.INFO)
# 创建 Handler(控制台 + 文件)
console_handler = logging.StreamHandler()
file_handler = logging.FileHandler("/tmp/docker_manager.log")
# 定义输出格式
formatter = logging.Formatter(
"%(asctime)s [%(levelname)s] %(name)s:%(lineno)d - %(message)s"
)
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)
# 添加 Handler
logger.addHandler(console_handler)
logger.addHandler(file_handler)
# 使用日志
logger.info("容器启动成功")
logger.warning("镜像不存在,将尝试重新加载")
输出结果:
- 控制台打印日志
- 同时
/tmp/docker_manager.log也保存日志内容
七、在实际项目中用法(比如你的 PythonDocker)
import logging
from docker import from_env
from packaging.version import Version
logging.basicConfig(
level=logging.INFO,
format="[%(asctime)s] [%(levelname)s] %(message)s"
)
class PythonDocker:
client = from_env()
@classmethod
def check_version(cls):
version = cls.client.version()['Components'][0]['Version']
if Version(version) < Version("19.03"):
logging.error(f"Docker 版本太低:{version},请升级到 ≥ 19.03")
else:
logging.info(f"Docker 版本检测通过:{version}")
运行时日志:
[2025-10-15 11:58:10] [INFO] Docker 版本检测通过:20.10.23
八、实战总结表
| 功能 | 用法示例 |
|---|---|
| 输出日志 | logging.info("启动成功") |
| 级别设置 | logging.basicConfig(level=logging.DEBUG) |
| 输出格式 | format="%(asctime)s [%(levelname)s] %(message)s" |
| 输出到文件 | filename="/var/log/app.log" |
| 同时输出到控制台与文件 | 用 Handler |
| 动态调整级别 | logger.setLevel(logging.WARNING) |
| 自定义日志对象 | logger = logging.getLogger("app") |

浙公网安备 33010602011771号