programing

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

instargram 2023. 6. 6. 00:25
반응형

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)sGetLogger 기능을 사용하여 모든 파일에 다른 이름을 지정할 수 있으며, 로그가 생성되면 설정한 이름을 통해 어떤 파일에서 왔는지 알 수 있습니다.

예:

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

반응형