编写argparse代码并不难,因此如果用户提供--verbose
标志,它会设置一个具有较低level
的basicConfig。许多StackOverflow问题都解决了这个问题。
但这似乎是很多编码,这似乎是一个相当日常的用例。我本以为有人会写一个很好的库,可以设置一个ArgParser
,允许用户从命令行指定各种日志记录选项,只需几行代码。
我最近也开始使用 PyCharm,并且惊讶地发现,开箱即用,发送到logger.debug
甚至logger.info
的消息都没有出现在控制台中。我想象当我的程序在 PyCharm 中运行时,我会导入一些与 PyCharm 相关的库,以某种易于配置、PyCharm 友好的方式设置日志记录。
我是否期望太多,我是否忽略了Python功能,或者我只是在Google度过了糟糕的一天?这些东西是否存在标准库?
(给跑题警察的注释:我问过标准库是否存在,而不是"推荐"。
我找到了几种从文件配置日志记录的标准方法。希望 PyCharm 最终会有一些带有漂亮 GUI 的插件来创建这些文件。
fileConfig()
—最简单的方法
对 ArgParse 使用 FileType 参数,用作记录器的fileConfig()
。
import argparse
import logging
import logging.config
argument_parser = argparse.ArgumentParser()
argument_parser.add('--logging-conf-path', type=argparse.FileType('r'),
help='path to logging configuration file',
default='./logging.conf',
)
args = argument_parser.parse_args()
if args.logging_conf_path:
logging.config.fileConfig(args.logging_conf_path.name)
不过,它确实带有以下警告:
注意:
fileConfig()
API 早于dictConfig()
API,并且不提供涵盖日志记录某些方面的功能。例如,不能使用fileConfig()
配置Filter
对象,这些对象提供对简单整数级别以外的消息进行筛选。如果需要在日志记录配置中包含Filter
实例,则需要使用dictConfig()
。请注意,配置功能的未来增强功能将添加到dictConfig()
中,因此值得考虑在方便时过渡到这个较新的 API。
但这里有一个 logging.conf 文件的示例,它遵循日志记录配置文件格式(这是注意警告的地方(:
[loggers]
keys=root,simpleExample
[handlers]
keys=consoleHandler
[formatters]
keys=simpleFormatter
[logger_root]
level=DEBUG
handlers=consoleHandler
[logger_simpleExample]
level=DEBUG
handlers=consoleHandler
qualname=simpleExample
propagate=0
[handler_consoleHandler]
class=StreamHandler
level=DEBUG
formatter=simpleFormatter
args=(sys.stdout,)
[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=
dictConfig()
—完整的方式
这使用上述警告中建议的dictConfig()
。由于我的程序已经使用 YAML 文件进行配置,因此我使用 PyYAML 读取字典
import argparse
import logging
import logging.config
import yaml
argument_parser = argparse.ArgumentParser()
argument_parser.add('--logging-yaml-path', type=argparse.FileType('r'),
help='path to logging configuration file',
default='./logging.yaml',
)
args = argument_parser.parse_args()
if args.logging_yaml_path:
log_config = yaml.load(args.logging_yaml_path)
logging.config.dictConfig(log_config)
下面是一个 logging.yaml 文件的示例,该文件遵循日志记录配置字典架构:
version: 1
formatters:
brief:
format: '%(message)s'
default:
format: '%(asctime)s %(levelname)-8s %(name)-15s %(message)s'
datefmt: '%Y-%m-%d %H:%M:%S'
handlers:
console:
class: logging.StreamHandler
level: WARN
formatter: brief
stream: ext://sys.stdout
file:
class : logging.handlers.TimedRotatingFileHandler
formatter: default
filename: ./gmartian.log
when: w0
backupCount: 6
root:
level: INFO
handlers:
- console
- file