Python에서 소스 파일 이름과 줄 번호를 기록하는 방법
python 표준 로깅 시스템을 장식/확장하여 로깅 방법이 호출될 때 파일과 호출된 줄 번호 또는 호출된 방법도 기록할 수 있습니까?
물론입니다. 기록 문서의 내용을 확인하십시오.특히 lineno 및 pathname 변수입니다.
%(pathname)s 로깅 호출이 실행된 원본 파일의 전체 경로 이름(사용 가능한 경우).
%(filename)s 경로 이름의 파일 이름 부분입니다.
%(모듈)의 모듈(파일 이름 부분)입니다.
%(funcName)s 로깅 호출을 포함하는 함수의 이름입니다.
%(lineeno)d 로깅 호출이 실행된 소스 라인 번호(사용 가능한 경우).
다음과 같이 보입니다.
formatter = logging.Formatter('[%(asctime)s] p%(process)s {%(pathname)s:%(lineno)d} %(levelname)s - %(message)s','%m-%d %H:%M:%S')
Seb의 매우 유용한 답변 위에 합리적인 형식의 로거 사용을 보여주는 유용한 코드 조각이 있습니다.
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s,%(msecs)03d %(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
import logging
# 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 ...
# A very naive sample of usage:
try:
logger.info('Sample of info log')
# your code here
except Exception as e:
logger.error(e)
다른 답변과 달리, 오류가 발생했을 수 있는 파일의 전체 경로와 함수 이름이 기록됩니다.이 기능은 두 개 이상의 모듈이 포함된 프로젝트와 이러한 모듈에 동일한 이름의 파일이 여러 개 배포된 경우에 유용합니다.
출력 예:
2022-12-02:10:00:00,000 INFO [<stdin>:2 in function <module>] Sample of info log
2022-12-02:10:00:00,000 INFO [<full path>/logging_test_file.py:15 in function <module>] Sample of info log
디버그 로깅을 표준 아웃으로 전송하는 방식으로 위에 빌드하려면:
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()
진술들.여기서 디버그 출력을 제출하기 전에 한 곳에서 디버그 출력을 끌 수 있습니다.
PyCharm 또는 Eclipse pydev를 사용하는 개발자의 경우 다음과 같이 콘솔 로그 출력에 log 문 원본에 대한 링크가 생성됩니다.
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 원본 파일 하이퍼링크를 참조하십시오.
로거가 GetLogger(name) 옵션으로 설정된 경우(여기서 name은 지정한 이름), 다음을 사용하여 로거를 포맷할 수도 있습니다.%(name)s
GetLogger 기능을 사용하여 모든 파일에 다른 이름을 지정할 수 있으며, 로그가 생성되면 설정한 이름을 통해 어떤 파일에서 왔는지 알 수 있습니다.
예:
import logging
logging.getLogger("main")
logging.basicConfig(#filename=log_fpath,
level=log_level,
format='[%(asctime)s] src:%(name)s %(levelname)s:%(message)s',
handlers=[logging.FileHandler(log_fpath)])
언급URL : https://stackoverflow.com/questions/533048/how-to-log-source-file-name-and-line-number-in-python
'programing' 카테고리의 다른 글
UITableView에서 데이터 요청이 완료되면 알림을 받으시겠습니까? (0) | 2023.06.06 |
---|---|
조건에 따라 목록을 분할(분할, 분할)하려면 어떻게 해야 합니까? (0) | 2023.06.06 |
Firestore 문서에서 필드를 삭제하는 방법은 무엇입니까? (0) | 2023.06.06 |
gem을 설치할 수 없음 - gem 네이티브 확장을 빌드하지 못함 - 해당 파일을 로드할 수 없음 -- mkmf(LoadError) (0) | 2023.06.06 |
원격 Ubuntu 시스템에서 시도/캐치 선량이 탐지되지 않음 (0) | 2023.06.06 |