Настройка ведения журнала из ArgParser и / или PyCharm - PullRequest
0 голосов
/ 22 октября 2018

Нетрудно кодировать argparse , поэтому он устанавливает basicConfig с меньшим level, если пользователь предоставляет, скажем, флаг --verbose.Многочисленные вопросы о StackOverflow обращаются к этому.

Но это кажется большим количеством кода, для того, что кажется довольно повседневным вариантом использования.Я бы подумал, что кто-то написал бы хорошую библиотеку, которая может настроить ArgParser, чтобы позволить пользователям указывать все виды параметров logging из командной строки, используя всего пару строк кода..

Я также недавно начал использовать PyCharm и был удивлен, что из коробки сообщения, отправленные на logger.debug и даже logger.info, не отображаются в консоли,Я предполагал, что есть некоторая библиотека, связанная с PyCharm, которую я мог бы импортировать, чтобы настроить ведение журнала некоторым легко настраиваемым, дружественным для PyCharm способом, когда моя программа запускается в PyCharm.

Я ожидаю слишком многого,я пропускаю функцию Python или у меня просто плохой день в Google?Существуют ли стандартные библиотеки для этих вещей?

(Примечание для не по теме полиции: я спросил, существуют ли стандартные библиотеки, а не для «рекомендаций».)

1 Ответ

0 голосов
/ 31 октября 2018

Я нашел пару стандартных способов настроить ведение журнала из файлов.Надеемся, что в конечном итоге PyCharm будет иметь плагины с красивыми графическими интерфейсами для создания этих файлов.

fileConfig() - Самый простой способ

Использовать аргумент FileType для ArgParse для использованиякак регистратор 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)  

Это идет с этим предостережением, хотя:

Примечание: The *API 1019 *fileConfig() более старый, чем API dictConfig(), и не обеспечивает функциональность, охватывающую определенные аспекты ведения журнала.Например, вы не можете настроить Filter объекты, которые обеспечивают фильтрацию сообщений за пределами простых целочисленных уровней, используя fileConfig().Если вам нужно иметь экземпляры 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() -Complete Way

Используется dictConfig(), рекомендованный в предупреждении выше.Так как моя программа уже использует файлы YAML для конфигурации, я прочитал dict, используя 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
...