pin_drop当前位置:知识文库 ❯ 图文
logging.config详解 - Python日志dictConfig高级配置
一、logging.config 概述
logging.config 模块提供了通过配置文件或字典配置日志系统的功能,是大型项目中推荐使用的日志配置方式。相比 basicConfig() 的简单配置,logging.config 支持更复杂的日志架构,包括多个 Logger、Handler、Formatter 和 Filter 的配置。
它支持两种配置方式:dictConfig()(字典配置)和 fileConfig()(文件配置)。字典配置是 Python 2.3+ 推荐的方式,更加灵活和可维护。
二、配置方式与参数说明
代码示例
import logging.config
# 字典配置
logging.config.dictConfig(config_dict)
# 文件配置
logging.config.fileConfig('logging.conf')
# 监听配置变更
logging.config.listen(port=9030)dictConfig 参数结构
fileConfig 参数
三、代码示例
示例1:dictConfig 字典配置
这是最基础的 dictConfig 用法,通过 Python 字典定义完整的日志配置结构。
代码示例
import logging
import logging.config
# 字典配置
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'simple': {
'format': '[%(levelname)s] %(message)s'
},
'detailed': {
'format': '%(asctime)s [%(levelname)s] %(name)s (%(filename)s:%(lineno)d) - %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'simple',
'stream': 'ext://sys.stderr'
}
},
'loggers': {
'app': {
'level': 'DEBUG',
'handlers': ['console'],
'propagate': False
}
}
}
logging.config.dictConfig(LOGGING_CONFIG)
logger = logging.getLogger('app')
logger.debug("调试信息(不会显示)")
logger.info("普通信息")
logger.warning("警告信息")
logger.error("错误信息")输出:
代码示例
[INFO] 普通信息
[WARNING] 警告信息
[ERROR] 错误信息示例2:复杂 dictConfig 配置
这个示例展示了更完整的配置,包括多个 Formatter、多个 Handler,以及 root Logger 的配置。
代码示例
import logging
import logging.config
config = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'console_fmt': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s',
'datefmt': '%H:%M:%S'
},
'file_fmt': {
'format': '%(asctime)s [%(levelname)s] %(name)s (%(filename)s:%(lineno)d) - %(message)s',
'datefmt': '%Y-%m-%d %H:%M:%S'
}
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'INFO',
'formatter': 'console_fmt'
},
'file': {
'class': 'logging.FileHandler',
'level': 'DEBUG',
'formatter': 'file_fmt',
'filename': 'app.log',
'encoding': 'utf-8'
}
},
'root': {
'level': 'DEBUG',
'handlers': ['console', 'file']
}
}
logging.config.dictConfig(config)
# 不同模块的Logger
db_logger = logging.getLogger('app.database')
api_logger = logging.getLogger('app.api')
db_logger.info("数据库连接成功")
api_logger.warning("API请求超时")输出:
代码示例
10:30:00 [INFO] app.database: 数据库连接成功
10:30:00 [WARNING] app.api: API请求超时示例3:从 JSON 文件加载配置
将日志配置保存在 JSON 文件中,实现配置与代码的完全分离,方便运维人员调整。
代码示例
import logging.config
import json
import os
# JSON配置内容
json_config = {
"version": 1,
"disable_existing_loggers": False,
"formatters": {
"standard": {
"format": "%(asctime)s [%(levelname)s] %(name)s - %(message)s"
}
},
"handlers": {
"console": {
"class": "logging.StreamHandler",
"level": "INFO",
"formatter": "standard"
}
},
"root": {
"level": "INFO",
"handlers": ["console"]
}
}
# 写入JSON文件
config_file = 'logging_config.json'
with open(config_file, 'w', encoding='utf-8') as f:
json.dump(json_config, f, indent=2)
# 从JSON文件加载配置
with open(config_file, 'r', encoding='utf-8') as f:
config = json.load(f)
logging.config.dictConfig(config)
logger = logging.getLogger('json_config')
logger.info("从JSON文件加载的日志配置")
# 清理
os.remove(config_file)输出:
代码示例
2026-04-11 10:30:00 [INFO] json_config - 从JSON文件加载的日志配置四、实际应用场景
-
大型项目配置:在大型项目中,使用字典或文件配置日志系统,将配置与代码分离,便于运维人员调整日志策略。
-
环境差异化配置:开发、测试、生产环境使用不同的日志配置文件,通过环境变量选择加载哪个配置。
-
动态配置:使用
listen()在运行时监听配置变更,无需重启应用即可调整日志级别和输出策略。
五、注意事项
注意1:
dictConfig的version键必须为 1,这是目前唯一支持的配置版本。
注意2:
disable_existing_loggers默认为True,会禁用所有在配置之前创建的 Logger。如果需要保留已有 Logger,应设为False。
注意3:
fileConfig使用 INI 格式配置文件,功能比dictConfig有限,官方推荐使用dictConfig。
提示:可以将日志配置放在 YAML 或 JSON 文件中,运行时读取并传给
dictConfig,实现配置与代码的完全分离。
六、配置方式对比
小贴士
在 Django、Flask 等 Web 框架中,通常都内置了对 dictConfig 的支持。在 Django 的 settings.py 中,LOGGING 字典就是直接传给 dictConfig 使用的。了解 dictConfig 的结构,能帮助你更好地配置框架的日志系统。
七、常见问题
dictConfig 和 fileConfig 应该选哪个?
官方推荐使用 dictConfig,它支持所有日志配置功能,包括自定义 Filter 和 Formatter。fileConfig 使用 INI 格式,功能有限,主要用于兼容旧项目。
disable_existing_loggers=True 会导致什么问题?
当 disable_existing_loggers=True 时,所有在 dictConfig 调用之前创建的 Logger 都会被禁用,它们的日志不会输出。如果你在项目初始化阶段创建了 Logger,然后在后面加载日志配置,务必将此值设为 False。
如何在 dictConfig 中配置 TimedRotatingFileHandler?
在 handlers 配置中,使用完整的类路径 'class': 'logging.handlers.TimedRotatingFileHandler',然后在配置字典中添加 when、interval、backupCount 等参数即可。
可以在运行时动态修改日志配置吗?
可以。调用 dictConfig 可以重新配置整个日志系统。另外,logging.config.listen(port) 可以启动一个监听线程,接收远程配置变更指令。不过 listen() 主要用于 fileConfig 的 INI 文件,实际项目中更多是自行实现配置热加载逻辑。
本文涉及AI创作
内容由AI创作,请仔细甄别