로깅 사용 pprint 출력 인쇄


101

pprint의 출력을 사용하여 복잡한 데이터 구조를 표시하고 싶지만 stdout이 아닌 로깅 모듈을 사용하여 출력하고 싶습니다.

ds = [{'hello': 'there'}]
logging.debug( pprint.pprint(ds) ) # outputs as STDOUT

나는 문서를 훑어보고을 찾았 pprint( {}, stream )지만 다소 어색하다는 것을 알았습니다. 나는 같은 spprint것이 pformat(처럼 c) 보다 더 좋았을 것이라고 생각 했을 것 입니다.
yee379

6
pprint.pformat()그 페이지에 있었다.
가레스 Latty

27
@Lattywayre-이와 같은 질문을하는 모든 사람이 문서를 건너 뛴 것은 아닙니다. 나는 같은 문서를 읽었고 또한 pformat을 놓쳤다. stackoverflow에서는 때때로 문서에 전혀 없었던 다른 사람들의 경험에서 보석을 얻습니다. 이 질문에 감사드립니다 yee379.
Mnebuerquo 2014 년

답변:


214

사용 pprint.pformat하여 문자열을 가져온 다음 로깅 프레임 워크로 보냅니다.

from pprint import pformat
ds = [{'hello': 'there'}]
logging.debug(pformat(ds))

11
디버깅을 완료 한 후이 코드를 제거하지 않으면 출력을 사용하지 않을 때 pformat 실행을 피하기 위해 "if Logger.isEnabledFor (logging.DEBUG) :"로 보호해야합니다 : docs.python. org / 2 / library /…
Ed Brannin 2013-08-13

2
@EdBrannin pformat은 모든 DEBUG 로그 문에 조건문을 추가하는 데 문제가 될만큼 많은 오버 헤드를 추가합니까?
undefinedvariable

2
@undefinedvariable 좋은 질문입니다. Me-today는 Me-2-years-ago에게 A / B 성능 메트릭을 생성하도록 지시하려고합니다.
Ed Brannin 2015 년

1
내가받을 AttributeError: 'function' object has no attribute 'pformat'이유는 어떤 생각을?
JinSnow

3
솔루션 : from pprint import pprint,pformat 그때 필요했습니다logging.debug((pformat(stuff))
JinSnow

20

이 솔루션은 위하지 않았다 나는 또한 때 로깅 이름과 levelname을 추가 할 포맷을 사용하고 있기 때문에 나를 위해 그것을 잘라. 약간 어수선 해 보입니다.

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
'bbbbbbbbbbbbbbbbbbbb',
'cccccccccccccccccccc',
'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

더 우아한 해결책이있을 수 있지만 다음과 같습니다.

for line in pprint.pformat(ds).split('\n'):
    logging.debug(line)

좀 더 좋은 것을 생성합니다.

__main__    : DEBUG   : ['aaaaaaaaaaaaaaaaaaaa',
__main__    : DEBUG   :  'bbbbbbbbbbbbbbbbbbbb',
__main__    : DEBUG   :  'cccccccccccccccccccc',
__main__    : DEBUG   :  'dddddddddddddddddddd']
__main__    : DEBUG   : Some other logging text

14
인간 소비에 더 좋습니다. logstash 또는 유사한 도구로 로그를 전달하고 단일 다중 행 메시지를 하나의 메시지로 전송하려는 경우에는 그리 좋지 않습니다.
Charles Duffy 2014 년

5
로거 구성의 처리기 / 포맷터 수준에서 예쁜 인쇄 방법이 있습니까? 콘솔에 고급 인쇄에 유효한 사용 사례처럼 보인다,하지만 파일 포맷되지 않은 이동
jon_darkstar

@CharlesDuffy 두 경우 모두 쉽게 처리 할 수있는 방법이 있습니까?
jtlz2 2018

1
내 해결책은 pformat에 추가 \n문자를 추가하는 것입니다. 적어도 이런 식으로 블록이 함께 있습니다.
ricekab
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.