Python에서 소스 파일 이름 및 줄 번호를 기록하는 방법


123

파이썬 표준 로깅 시스템을 장식 / 확장하여 로깅 메서드가 호출 될 때 파일과 호출 된 줄 번호 또는 호출 한 메서드도 기록 할 수 있습니까?

답변:


227

물론 로깅 문서에서 포맷터 를 확인하세요 . 특히 lineno 및 경로 이름 변수.

% (pathname) s 로깅 호출이 발행 된 소스 파일 전체 경로 이름 (사용 가능한 경우).

% (filename) s 경로 이름 파일 이름 부분.

% (module) s 모듈 (파일 이름의 이름 부분).

% (funcName) s 로깅 호출을 포함하는 함수 이름입니다.

% (lineno) d 로깅 호출이 발행 된 소스 라인 번호 (사용 가능한 경우).

다음과 같이 보입니다.

formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')

1
그리고 예, 변수의 대 / 소문자 엉망 이 고려되어야합니다.
Tom Pohl

1
그렇지 않으면 "매우 잘못 구현 된 낙타 케이스"라고합니다.
Jon Spencer

80

Seb의 매우 유용한 답변 위에 합리적인 형식으로 로거 사용법을 보여주는 편리한 코드 스 니펫이 있습니다.

#!/usr/bin/env python
import logging

logging.basicConfig(format='%(asctime)s,%(msecs)d %(levelname)-8s [%(filename)s:%(lineno)d] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG)

logger = logging.getLogger(__name__)
logger.debug("This is a debug log")
logger.info("This is an info log")
logger.critical("This is critical")
logger.error("An error occurred")

다음 출력을 생성합니다.

2017-06-06:17:07:02,158 DEBUG    [log.py:11] This is a debug log
2017-06-06:17:07:02,158 INFO     [log.py:12] This is an info log
2017-06-06:17:07:02,158 CRITICAL [log.py:13] This is critical
2017-06-06:17:07:02,158 ERROR    [log.py:14] An error occurred

5
자세한 내용은 다음을 사용하십시오 : formatter = logging.Formatter ( '% (asctime) s, % (levelname) -8s [% (filename) s : % (module) s : % (funcName) s : % (lineno) d] % (message) s ')
Girish Gupta

로깅 메시지가 인쇄되는지 여부를 코드 상단의 한 곳에서만 변경할 수있는 방법이 있습니까? 프로그램이 정확히 무엇을하는지보기 위해 많은 인쇄물이있는 두 가지 모드를 원합니다. 하나는 출력이 표시되지 않는 충분히 안정적 일 때입니다.
마리. P.

3
@ Marie.P. 댓글에 다른 질문을하지 마세요. 대답은 로깅 수준입니다.
bugmenot123

4

디버그 로깅을 표준 출력으로 보내는 방식으로 위를 빌드하려면 :

import logging
import sys

root = logging.getLogger()
root.setLevel(logging.DEBUG)

ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
FORMAT = "[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
formatter = logging.Formatter(FORMAT)
ch.setFormatter(formatter)
root.addHandler(ch)

logging.debug("I am sent to standard out.")

위의 내용을라는 파일에 넣으면 debug_logging_example.py출력이 생성됩니다.

[debug_logging_example.py:14 -             <module>() ] I am sent to standard out.

그런 다음 로그 아웃을 끄려면 주석 처리하십시오 root.setLevel(logging.DEBUG).

단일 파일 (예 : 클래스 할당)의 경우 print()문 을 사용하는 것보다이 작업을 수행하는 것이 훨씬 더 나은 방법이라는 것을 알았습니다 . 제출하기 전에 한 곳에서 디버그 출력을 끌 수 있습니다.


1

PyCharm 또는 Eclipse pydev를 사용하는 개발자의 경우 다음은 콘솔 로그 출력에 로그 문의 소스에 대한 링크를 생성합니다.

import logging, sys, os
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, format='%(message)s | \'%(name)s:%(lineno)s\'')
log = logging.getLogger(os.path.basename(__file__))


log.debug("hello logging linked to source")

더 긴 토론과 역사 는 Eclipse 콘솔의 Pydev 소스 파일 하이퍼 링크를 참조하십시오 .


0
# your imports above ...


logging.basicConfig(
    format='%(asctime)s,%(msecs)d %(levelname)-8s [%(pathname)s:%(lineno)d in 
    function %(funcName)s] %(message)s',
    datefmt='%Y-%m-%d:%H:%M:%S',
    level=logging.DEBUG
)

logger = logging.getLogger(__name__)

# your classes and methods below ...
# An naive Sample of usage:
try:
    logger.info('Sample of info log')
    # your code here
except Exception as e:
    logger.error(e)

다른 답변과 달리 오류가 발생했을 수있는 파일의 전체 경로와 함수 이름을 기록합니다. 이는 둘 이상의 모듈이있는 프로젝트와 이러한 모듈에 배포 된 동일한 이름의 여러 파일이있는 경우 유용합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.