2013-08-06 5 views
0

그래서 내가 유지하고있는 작은 내부 명령 줄 유틸리티에 로깅을 추가하려고합니다. (실제로 저는 파이썬의 logging 모듈을 사용하기 위해 수동으로 코딩 된 로깅을 추악하게 변환하고 있으며, 그 과정에서 어떤 사마귀도 정리하고 있습니다).Python : OptionParser에서 logging.setLevel verbosity를 사용하는 방법 type = 'count'?

먼저 기존 사용법, 사마귀 및 모든 것을 보존하고 싶습니다. 이미 발생하는 불필요한 경고에 의존하는 모든 스크립트는 내가하는 일의 결과로 중단되어서는 안됩니다. 새로운 기능은 스위치를 거치며 OptionParser에서 type=count (고대 유닉스/리눅스 규칙에 따라)로 구현됩니다. 여기서 주름은 하나의 -v이 자세한 정보를 -1에서 0으로 설정한다는 것입니다. 역설적으로 Paramiko 라이브러리에서 적어도 하나의 경고 메시지를 스퀠 핑합니다 (로거 "paramiko.transport"에 대해서는 수 없음). 여기에서 최대 4 개의 추가 -v 옵션을 지원하고 logging.setLevel()의 옵션을 logging.CRITICAL에서 logging.DEBUG까지 점차 더 장황하게 사용하고 싶습니다.

문지르세요!

내가 쉽게 같은 것을 사용할 수 있습니다 : I 10의 배수에 -v 스위치 내 수를 변환 뺀거야 즉

if opts.verbosity == 0: # default is -1 do NOTHING 
    # 0 ironically makes it slightly quieter 
    logging.getLogger().addHandler(logging.NullHandler()) 
elif opts.verbosity > 0: 
    logging.basicConfig() 
    logging.getLogger().setLevel(50 - min(40, 10*opts.verbosity)) 
    # UGLY BUT IT WORKS. 
    # logging.CRITICAL is 50, 
    # each -v reduces log filter by 10 down to 10 

을 그 이상 자세한 아래로 가장 자세한쪽으로. (이것은 파이썬 2.7.x입니다.)

logging.basicConfig()은 "핸들을 찾을 수 없습니다"라는 경고 메시지를 표시하지 않고이 유틸리티가 프로덕션 (수년) 동안 지속되는 동안 (무해하게) 발생한 몇 가지 기본 오류 메시지를 표시합니다. (그렇다면 처음에는 0으로 기본 설정을 시작했는데 예상대로 사용자에게 놀라운 소리가 들렸습니다.

하지만 제 질문은 더 적절한 "적절한"방법입니다. logging.setLevel()로 설정 숫자 상세에서 번역?이 구현 세부 (logging.CRITICAL, logging.ERROR, logging.WARN,... 등과 관련된 숫자 값)를 사용하는 더러운 것 같다.

확실히 내가 파이썬의 표준 OptionParserlogging 모듈 -vvv를 사용하여 하나가 될 수 없습니다 그러나 docs을 읽고 주위를 인터넷 검색하면 어떤 종류의 '우수 사례'도 발견되지 않았습니다.

답변

4

클리너, 적어도 :

level = { 
    1: logging.ERROR, 
    2: logging.WARNING, 
    3: logging.INFO, 
    4: logging.DEBUG 
}.get(opts.verbosity, logging.DEBUG) 

(. 내가 너무 argparseoptparse에서 변환 좋을 것)

0

(야호 부활 된 게시물)

내가 최근뿐만 아니라 이런 식으로 뭔가 싶었어요하지만, dict을 사용하고 싶지 않았습니다. 구현 방법은 다음과 같습니다.

def logging_level(verbosity): 
    """ Converts a verbosity number to a logging level 

    Args: 
     verbosity - a number, possibly collected from ``argparse``'s ``count`` 
     action. If ``verbosity`` is out of the range of possible logging levels 
     it will be normalized to the nearest level. Does not take into 
     consideration custom levels. 
    """ 
    levels = [ 
     logging.CRITICAL, 
     logging.ERROR, 
     logging.WARNING, 
     logging.INFO, 
     logging.DEBUG 
    ] 

    return levels[max(min(len(levels) - 1, verbosity), 0)]