선언하기 전에 logging.info()를 호출하면 Python의 logging.basicConfig가 작동하지 않습니다. (logging.basicConfig in Python won't work if calling logging.info() before declaring)


문제 설명

선언하기 전에 logging.info()를 호출하면 Python의 logging.basicConfig가 작동하지 않습니다. (logging.basicConfig in Python won't work if calling logging.info() before declaring)

이 답변을 기반으로 상세 로깅을 활성화하는 더 쉬운 방법

이 Python 스크립트를 사용하겠습니다.

import argparse
import logging


def main():
    import argparse
    import logging

    parser = argparse.ArgumentParser(
        description='A test script for http://stackoverflow.com/q/14097061/78845'
    )
    parser.add_argument("‑v", "‑‑verbose", help="increase output verbosity",
                        action="store_true")

    args = parser.parse_args()
    if args.verbose:
        logging.basicConfig(level=logging.DEBUG)

    logging.info('Shown in debug and info mode')
    logging.debug('Only shown in debug mode')


if __name__ == "__main__":
    logging.info('Starting script!')
    main()

터미널에서 이 스크립트를 python ‑m verbose ‑v로 실행하면 아무 것도 인쇄되지 않습니다.

if __name__ == "__main__":
    #logging.info('Starting script!')
    main()

에서와 같이 파일에서 logging.info('Starting script!') 줄을 주석 처리하면 예상대로 로깅이 작동합니다.

그것 basicConfig가 정의되기 전에 logging.info()를 호출하려는 시도는 모든 로깅을 완전히 비활성화하는 것 같습니다.

로깅또는 일반적인 문제이며 왜 이런 일이 발생합니까?

저는 Python 3.6.7을 사용 중입니다.


참조 솔루션

방법 1:

From the logging documentation: (Emphasis mine)

 logging.basicConfig(**kwargs)

Does basic configuration for the logging system by creating a StreamHandler with a default Formatter and adding it to the root logger.

The functions debug(), info(), warning(), error() and critical() will call basicConfig() automatically if no handlers are defined for the root logger.

This function does nothing if the root logger already has handlers configured for it.

So basically your first call to logging.info made some automatic configuration. Your later configuration attempt silently failed because of the automatic configuration that already happend.

방법 2:

Don't use basicConfig to change the level. Use logging.getLogger().setLevel(logging.DEBUG) to change the level on the root logger. One can do this on any logger or handler as well.

(by Alex TereshenkovdgwDan D.)

참조 문서

  1. logging.basicConfig in Python won't work if calling logging.info() before declaring (CC BY‑SA 2.5/3.0/4.0)

#Python #python-logging #logging






관련 질문

Python - 파일 이름에 특수 문자가 있는 파일의 이름을 바꿀 수 없습니다. (Python - Unable to rename a file with special characters in the file name)

구조화된 배열의 dtype을 변경하면 문자열 데이터가 0이 됩니다. (Changing dtype of structured array zeros out string data)

목록 목록의 효과적인 구현 (Effective implementation of list of lists)

for 루프를 중단하지 않고 if 문을 중지하고 다른 if에 영향을 줍니다. (Stop if statement without breaking for loop and affect other ifs)

기본 숫자를 10 ^ 9 이상으로 늘리면 코드가 작동하지 않습니다. (Code fails to work when i increase the base numbers to anything over 10 ^ 9)

사용자 지정 대화 상자 PyQT5를 닫고 데이터 가져오기 (Close and get data from a custom dialog PyQT5)

Enthought Canopy의 Python: csv 파일 조작 (Python in Enthought Canopy: manipulating csv files)

학생의 이름을 인쇄하려고 하는 것이 잘못된 것은 무엇입니까? (What is wrong with trying to print the name of the student?)

다단계 열 테이블에 부분합 열 추가 (Adding a subtotal column to a multilevel column table)

여러 함수의 변수를 다른 함수로 사용 (Use variables from multiple functions into another function)

리프 텐서의 값을 업데이트하는 적절한 방법은 무엇입니까(예: 경사하강법 업데이트 단계 중) (What's the proper way to update a leaf tensor's values (e.g. during the update step of gradient descent))

Boto3: 조직 단위의 AMI에 시작 권한을 추가하려고 하면 ParamValidationError가 발생합니다. (Boto3: trying to add launch permission to AMI for an organizational unit raises ParamValidationError)







코멘트