哪里有完整的logging.config.dictConfig示例?
- 2025-02-28 08:22:00
- admin 原创
- 79
问题描述:
我如何使用dictConfig
?我应该如何指定它的输入config
词典?
解决方案 1:
这里怎么样!相应的文档参考是configuration-dictionary-schema
。
LOGGING_CONFIG = {
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'standard': {
'format': '%(asctime)s [%(levelname)s] %(name)s: %(message)s'
},
},
'handlers': {
'default': {
'level': 'INFO',
'formatter': 'standard',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout', # Default is stderr
},
},
'loggers': {
'': { # root logger
'handlers': ['default'],
'level': 'WARNING',
'propagate': False
},
'my.packg': {
'handlers': ['default'],
'level': 'INFO',
'propagate': False
},
'__main__': { # if __name__ == '__main__'
'handlers': ['default'],
'level': 'DEBUG',
'propagate': False
},
}
}
用法:
import logging.config
# Run once at startup:
logging.config.dictConfig(LOGGING_CONFIG)
# Include in each module:
log = logging.getLogger(__name__)
log.debug("Logging is configured.")
如果您看到太多来自第三方包的日志,请确保在导入第三方包logging.config.dictConfig(LOGGING_CONFIG)
之前运行此配置。
要使用日志过滤器向每条日志消息添加额外的自定义信息,请考虑这个答案。
解决方案 2:
接受的答案很好!但如果可以从一些不太复杂的东西开始呢?日志模块非常强大,文档有点让人不知所措,尤其是对于新手来说。但对于初学者来说,您不需要配置格式化程序和处理程序。当您弄清楚您想要什么时,您可以添加它。
例如:
import logging.config
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'loggers': {
'': {
'level': 'INFO',
},
'another.module': {
'level': 'DEBUG',
},
}
}
logging.config.dictConfig(DEFAULT_LOGGING)
logging.info('Hello, log')
解决方案 3:
流处理程序、文件处理程序、旋转文件处理程序和 SMTP 处理程序的示例
from logging.config import dictConfig
LOGGING_CONFIG = {
'version': 1,
'loggers': {
'': { # root logger
'level': 'NOTSET',
'handlers': ['debug_console_handler', 'info_rotating_file_handler', 'error_file_handler', 'critical_mail_handler'],
},
'my.package': {
'level': 'WARNING',
'propagate': False,
'handlers': ['info_rotating_file_handler', 'error_file_handler' ],
},
},
'handlers': {
'debug_console_handler': {
'level': 'DEBUG',
'formatter': 'info',
'class': 'logging.StreamHandler',
'stream': 'ext://sys.stdout',
},
'info_rotating_file_handler': {
'level': 'INFO',
'formatter': 'info',
'class': 'logging.handlers.RotatingFileHandler',
'filename': 'info.log',
'mode': 'a',
'maxBytes': 1048576,
'backupCount': 10
},
'error_file_handler': {
'level': 'WARNING',
'formatter': 'error',
'class': 'logging.FileHandler',
'filename': 'error.log',
'mode': 'a',
},
'critical_mail_handler': {
'level': 'CRITICAL',
'formatter': 'error',
'class': 'logging.handlers.SMTPHandler',
'mailhost' : 'localhost',
'fromaddr': 'monitoring@domain.com',
'toaddrs': ['dev@domain.com', 'qa@domain.com'],
'subject': 'Critical error with application name'
}
},
'formatters': {
'info': {
'format': '%(asctime)s-%(levelname)s-%(name)s::%(module)s|%(lineno)s:: %(message)s'
},
'error': {
'format': '%(asctime)s-%(levelname)s-%(name)s-%(process)d::%(module)s|%(lineno)s:: %(message)s'
},
},
}
dictConfig(LOGGING_CONFIG)
解决方案 4:
日志记录手册示例中隐藏着一个声明日志记录.config.dictConfig()字典架构的更新示例。从该手册链接向上滚动可查看 dictConfig() 的用法。
RotatingFileHandler
下面是使用 StreamHandler 和自定义的format
和将日志记录到 stdout 和“logs”子目录的示例用例datefmt
。
导入模块并建立“logs”子目录的跨平台绝对路径
from os.path import abspath, dirname, join
import logging
from logging.config import dictConfig
base_dir = abspath(dirname(__file__))
logs_target = join(base_dir + "logs", "python_logs.log")
根据字典模式文档建立模式。
logging_schema = {
# Always 1. Schema versioning may be added in a future release of logging
"version": 1,
# "Name of formatter" : {Formatter Config Dict}
"formatters": {
# Formatter Name
"standard": {
# class is always "logging.Formatter"
"class": "logging.Formatter",
# Optional: logging output format
"format": "%(asctime)s %(levelname)s %(filename)s %(message)s",
# Optional: asctime format
"datefmt": "%d %b %y %H:%M:%S"
}
},
# Handlers use the formatter names declared above
"handlers": {
# Name of handler
"console": {
# The class of logger. A mixture of logging.config.dictConfig() and
# logger class-specific keyword arguments (kwargs) are passed in here.
"class": "logging.StreamHandler",
# This is the formatter name declared above
"formatter": "standard",
"level": "INFO",
# The default is stderr
"stream": "ext://sys.stdout"
},
# Same as the StreamHandler example above, but with different
# handler-specific kwargs.
"file": {
"class": "logging.handlers.RotatingFileHandler",
"formatter": "standard",
"level": "INFO",
"filename": logs_target,
"mode": "a",
"encoding": "utf-8",
"maxBytes": 500000,
"backupCount": 4
}
},
# Loggers use the handler names declared above
"loggers" : {
"__main__": { # if __name__ == "__main__"
# Use a list even if one handler is used
"handlers": ["console", "file"],
"level": "INFO",
"propagate": False
}
},
# Just a standalone kwarg for the root logger
"root" : {
"level": "INFO",
"handlers": ["file"]
}
}
logging
使用字典架构进行配置
dictConfig(logging_schema)
尝试一些测试用例,看看一切是否正常
if __name__ == "__main__":
logging.info("testing an info log entry")
logging.warning("testing a warning log entry")
[编辑回答@baxx的问题]
要在整个代码库中重复使用此设置,请在脚本中实例化一个记录器,然后调用 dictConfig() 将该记录器导入到其他地方
# my_module/config/my_config.py
dictConfig(logging_schema)
my_logger = getLogger(__name__)
然后在另一个脚本中
from my_module.config.my_config import my_logger as logger
logger.info("Hello world!")
解决方案 5:
我在下面找到了Django v1.11.15默认配置,希望对您有所帮助
DEFAULT_LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse',
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue',
},
},
'formatters': {
'django.server': {
'()': 'django.utils.log.ServerFormatter',
'format': '[%(server_time)s] %(message)s',
}
},
'handlers': {
'console': {
'level': 'INFO',
'filters': ['require_debug_true'],
'class': 'logging.StreamHandler',
},
'django.server': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'django.server',
},
'mail_admins': {
'level': 'ERROR',
'filters': ['require_debug_false'],
'class': 'django.utils.log.AdminEmailHandler'
}
},
'loggers': {
'django': {
'handlers': ['console', 'mail_admins'],
'level': 'INFO',
},
'django.server': {
'handlers': ['django.server'],
'level': 'INFO',
'propagate': False,
},
}
}
解决方案 6:
还有一件事,如果从现有的记录器配置开始是有用的,可以通过以下方式获取当前配置字典
import logging
logger = logging.getLogger()
current_config = logger.__dict__ # <-- yes, it's just the dict
print(current_config)
它会是这样的:
{'filters': [], 'name': 'root', 'level': 30, 'parent': None, 'propagate': True, 'handlers': [], 'disabled': False, '_cache': {}}
然后,如果你这样做
new_config=current_config
new_config['version']=1
new_config['name']='fubar'
new_config['level']=20
# ...and whatever other changes you wish
logging.config.dictConfig(new_config)
然后你会发现:
print(logger.__dict__)
正是你所希望的
{'filters': [], 'name': 'fubar', 'level': 20, 'parent': None, 'propagate': True, 'handlers': [], 'disabled': False, '_cache': {}, 'version': 1}
扫码咨询,免费领取项目管理大礼包!