Подтвердить что ты не робот

Более простой способ включения подробного ведения журнала

Я хочу добавить тест выполнения отладочной печати, если я включу --verbose из командной строки, и если в script будет указано следующее.

logger.info("test")

Я рассмотрел следующие вопросы, но не смог получить ответ...

4b9b3361

Ответ 1

Вам нужно объединить мудрость учебного пособия по Argparse с HOWTO журнала Python. Вот пример...

> cat verbose.py 
#!/usr/bin/env python

import argparse
import logging

parser = argparse.ArgumentParser(
    description='A test script for http://stackoverflow.com/q/14097061/78845'
)
parser.add_argument("-v", "--verbose", help="increase output verbosity",
                    action="store_true")

args = parser.parse_args()
if args.verbose:
    logging.basicConfig(level=logging.DEBUG)

logging.debug('Only shown in debug mode')

Запустите справку:

> ./verbose.py -h
usage: verbose.py [-h] [-v]

A test script for http://stackoverflow.com/q/14097061/78845

optional arguments:
  -h, --help     show this help message and exit
  -v, --verbose  increase output verbosity

Запуск в режиме подробностей:

> ./verbose.py -v
DEBUG:root:Only shown in debug mode

Работает тихо:

> ./verbose.py   
> 

Ответ 2

Я считаю полезным --verbose (для пользователей) и --debug (для разработчиков). Вот как я это делаю с logging и argparse:

import argparse
import logging

parser = argparse.ArgumentParser()
parser.add_argument(
    '-d', '--debug',
    help="Print lots of debugging statements",
    action="store_const", dest="loglevel", const=logging.DEBUG,
    default=logging.WARNING,
)
parser.add_argument(
    '-v', '--verbose',
    help="Be verbose",
    action="store_const", dest="loglevel", const=logging.INFO,
)
args = parser.parse_args()    
logging.basicConfig(level=args.loglevel)

Итак, если --debug установлен, уровень ведения журнала установлен на DEBUG. Если --verbose, для ведения журнала задано значение INFO. Если ни один из них, отсутствие --debug устанавливает уровень ведения журнала по умолчанию WARNING.

Ответ 3

Ниже приведен более сжатый метод, который проверяет границы и перечисляет допустимые значения в справке:

parser = argparse.ArgumentParser(description='This is a demo.')
parser.add_argument("-l", "--log", dest="logLevel", choices=['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], help="Set the logging level")

args = parser.parse_args()
if args.logLevel:
    logging.basicConfig(level=getattr(logging, args.logLevel))

Использование:

demo.py --log DEBUG

Ответ 4

Другим вариантом было бы подсчитать количество -v и использовать счетчик как индекс для a list с фактическими уровнями от logging:

import argparse
import logging

parser = argparse.ArgumentParser()
parser.add_argument('-v', '--verbose', action='count', default=0)
args = parser.parse_args()

levels = [logging.WARNING, logging.INFO, logging.DEBUG]
level = levels[min(len(levels)-1,args.verbose)]  # capped to number of levels

logging.basicConfig(level=level,
                    format="%(asctime)s %(levelname)s %(message)s")

logging.debug("a debug message")
logging.info("a info message")
logging.warning("a warning message")

Это работает для -vvvv, -vvv, -vv, -v, -v -v и т.д. Если нет -v, тогда logging.WARNING выбирается, если предусмотрено больше -v, он будет INFO и DEBUG

Ответ 5

Вы можете объяснить значение уровня как целого после флага -v:

parser = argparse.ArgumentParser()
parser.add_argument("-v", "--verbose", const=1, default=0, type=int, nargs="?",
                    help="increase verbosity: 0 = only warnings, 1 = info, 2 = debug. No number means info. Default is no verbosity.")
args = parser.parse_args()

logger = logging.getLogger()
if args.verbose == 0:
    logger.setLevel(logging.WARN) 
elif args.verbose == 1:
    logger.setLevel(logging.INFO) 
elif args.verbose == 2:
    logger.setLevel(logging.DEBUG) 

Ответ 6

если вы хотите включить logging.DEBUG-уровень для script, который вы не хотите редактировать (или не можете), вы можете настроить свой запуск:

[email protected]:~$ python -c "import site; site._script()"
[snip]...
USER_BASE: '/home/jcomeau/.local' (exists)
USER_SITE: '/home/jcomeau/.local/lib/python2.7/site-packages' (exists)
ENABLE_USER_SITE: True
[email protected]:~$ mkdir -p ~/.local/lib/python2.7/site-packages
[email protected]:~$ vi ~/.local/lib/python2.7/site-packages/usercustomize.py

введите следующее:

import os, logging
if os.getenv('DEBUGGING'):
    logging.basicConfig(level = logging.DEBUG)

то вы можете просто:

[email protected]:~$ mkdir -p /tmp/some/random/
[email protected]:~$ echo 'import logging; logging.debug("test")' >> /tmp/some/random/script.py
[email protected]:~$ DEBUGGING=1 python /tmp/some/random/script.py 
DEBUG:root:test

от Пола Оллиса в http://nedbatchelder.com/blog/201001/running_code_at_python_startup.html


2017-07-18: С тех пор я перешел на другой метод:

logging.basicConfig(level=logging.DEBUG if __debug__ else logging.INFO)

что это значит, если вы работаете без оптимизации (как в python script.py), вы получаете материал уровня DEBUG, тогда как если вы работаете с python -OO script.py, вы этого не делаете. нет переменных среды для установки.

Ответ 7

Здесь еще раз возьмем аргумент argparse -v, чтобы увеличить многословие до двух уровней от стандартного ПРЕДУПРЕЖДЕНИЯ до INFO (-v) до DEBUG (-vv). Это не соответствует константам, определенным logging, а скорее вычисляет значение напрямую, ограничивая ввод:

print( "Verbosity / loglevel:", args.v )
logging.basicConfig( level=10*(3-max(0,min(args.v,3))) )
logging.debug("debug") # 10
logging.info("info") # 20
logging.warning("warning") # 30 - The default level is WARNING, which means that only events of this level and above will be tracked
logging.error("error") # 40
logging.critical("critical") # 50