방금 애플리케이션을 구축했는데 의도한 대로 작동하지 않는 것을 발견했습니다. 방금 구현한 기능이 예상하지 못한 방식으로 작동하고 있습니다. 당신은 무엇을해야합니까? 이 문제를 어떻게 해결하시겠습니까?
소프트웨어 개발에서 프로그래머는 소프트웨어가 실행되는 동안 이벤트를 추적하기 위해 로깅에 의존합니다. 이는 문제가 발생할 경우 문제의 원인을 효과적으로 추적하는 데 도움이 됩니다.
이 가이드에서는 애플리케이션 로그를 유지해야 하는 이유와 Python 로깅 모듈을 사용하여 프로그램의 이벤트를 추적하는 방법에 대해 설명합니다.
로그를 유지해야 하는 이유
로그를 유지하면 유지 관리가 더 쉬운 코드를 작성하는 데 도움이 됩니다. 로깅과 같은 모듈을 사용하면 프로그램에서 발생하는 모든 이벤트를 정확하게 기록할 수 있습니다. 즉, 어떤 코드 라인이 실행되었고 어떤 코드가 실행되지 않았는지 확인할 수 있습니다.
Python에서 개발자는 종종 print()
에 의존합니다. 코드를 기록하는 문. 초보자부터 전문가에 이르기까지 모든 사람이 사용하는 데에는 합당한 이유가 있는 관행입니다. print()
문은 사용하기 쉽습니다. 간단 해.
그러나 print()
문은 코드 로그를 유지하는 가장 좋은 방법이 아닙니다. 한 가지 예로, print()
명령문은 콘솔에 출력을 인쇄하는 데 사용할 수 있습니다. 이것은 어떤 출력이 로그로 저장되고 어떤 출력이 주 프로그램의 일부인지 구별하는 것이 혼란스러울 수 있음을 의미합니다. 게다가 print()
문은 기본적으로 로그를 저장하지 않습니다.
바로 여기에서 Python 로깅 모듈이 유용합니다. 로깅 시스템 모듈을 사용하면 코드에서 실행된 이벤트에 대한 보다 정확한 기록을 유지할 수 있습니다. 이렇게 하면 코드를 보다 효과적으로 디버그하고 오류를 수정하는 데 도움이 됩니다.
Python 로깅 모듈 사용 방법
이 튜토리얼에서는 학생의 성적 목록을 살펴보고 시험에 실패했는지 또는 통과했는지를 계산하는 프로그램에 기본 로깅 메시지를 추가할 것입니다. 다음 코드를 고려하십시오.
참가자의 81%는 부트캠프에 참석한 후 기술 직업 전망에 대해 더 자신감을 느꼈다고 말했습니다. 지금 부트캠프에 참여하십시오.
부트캠프 졸업생은 부트캠프 시작부터 첫 직장을 찾는 데까지 6개월도 채 걸리지 않았습니다.
students = ["Martin", "Lewis", "Terri", "Bart"] grades = [92, 78, 72, 38] pass_fail = [] for i in range(0, len(students)): print("Calculating grade for {}".format(students[i])) if grades[i] > 55: pass_fail.append(True) print("{} has passed their exam.".format(students[i))) else: pass_fail.append(False) print("{} has failed their exam.".format(students[i))) print("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")
위의 코드는 4학년 수업에 5명의 학생이 각각 시험에 합격했는지 여부를 계산합니다. 우리 프로그램에서는 세 개의 목록을 선언합니다. 하나의 목록은 각 학생의 이름을 저장합니다. 또 다른 목록은 각 학생이 얻은 성적을 저장합니다. 최종 목록은 학생이 시험을 통과했는지 여부를 저장합니다.
프로그램을 실행하면 다음이 반환됩니다.
Calculating grade for Martin. Martin has passed their exam. Calculating grade for Lewis. Lewis has passed their exam. Calculating grades for Terri. Terri has passed their exam. Calculating grades for Bart. Bart has failed their exam.
print()
문은 코드가 작동하고 있음을 보여주지만 logging()
을 사용할 수 있습니다. 대신 이 데이터를 표시하는 모듈입니다. 이렇게 하면 디버깅 메시지를 프로그램 출력과 구별할 수 있습니다.
시작하려면 프로그램 상단에 로깅 표준 라이브러리를 추가해 보겠습니다.
import logging
이제 로깅 라이브러리를 가져왔으므로 코드에서 로그를 추적할 수 있습니다. 이 예에서는 DEBUG 구성을 사용하여 로그를 추적할 것입니다. 이는 현재로서는 경고 추적에 관심이 없기 때문입니다. 참고로 지정할 수 있는 로깅 옵션은 다음과 같습니다.
- CRITICAL:심각한 오류를 표시하는 데 사용됨(logging.critical())
- 오류:문제를 표시하는 데 사용됨(logging.error())
- 경고:예기치 않은 동작을 표시하는 데 사용됨(logging.warning())
- INFO:프로그램이 작동 중임을 표시하는 데 사용됩니다(logging.info())
- DEBUG:디버그 코드에 사용(logging.debug())
로깅 라이브러리의 기본 구성은 WARNING이므로 다음 코드를 사용하여 재설정해야 합니다.
import logging logging.basicConfig(level=logging.DEBUG)
이제 코드 디버깅을 시작할 준비가 되었습니다. print()
를 교체해 보겠습니다. 성적이 계산 중이거나 프로그램이 디버깅 문으로 완료되었음을 알려주는 문:
import logging logging.basicConfig(level=logging.DEBUG) students = ["Martin", "Lewis", "Terri", "Bart"] grades = [92, 78, 72, 38] pass_fail = [] for i in range(0, len(students)): logging.debug("Calculating grade for {}".format(students[i])) if grades[i] > 55: pass_fail.append(True) print("{} has passed their exam.".format(students[i])) else: pass_fail.append(False) print("{} has failed their exam.".format(students[i])) logging.debug("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")
코드를 실행하면 다음이 반환됩니다.
DEBUG:root:Calculating grade for Martin Martin has passed their exam. DEBUG:root:Calculating grade for Lewis Lewis has passed their exam. DEBUG:root:Calculating grade for Terri Terri has passed their exam. DEBUG:root:Calculating grade for Bart Bart has failed their exam. DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
출력에 이전과 동일한 내용이 포함되어 있음을 알 수 있습니다. 그러나 "등급 계산 중..." 메시지와 등급이 계산되었음을 알리는 메시지가 다르게 나타납니다. "DEBUG:root:"라는 텍스트가 해당 명령문 앞에 나타납니다.
이것은 우리 프로그램이 주어진 시간에 무엇을 하고 있는지 추적할 수 있게 합니다. 로깅 이벤트 모듈은 앞서 언급한 텍스트를 우리 프로그램에 추가하기 때문에 우리 프로그램에서 어떤 텍스트가 출력되었고 어떤 텍스트가 디버깅을 위한 것인지 쉽게 알 수 있습니다.
이 경우 "[student]"가 시험에 실패했습니다"라는 메시지는 각 학생이 시험에 통과했는지 여부를 알려주는 중요한 정보입니다. 다른 모든 것은 우리 프로그램이 어떻게 실행되는지 보는 데 유용하지만 사용자에게는 유용하지 않습니다. 따라서 로깅 호출을 사용하여 이러한 명령문을 추적합니다.
파일에 로그를 보관하는 방법
로깅 모듈을 사용하면 파일에서 로그를 추적할 수 있습니다. 이것은 파이썬 셸을 닫은 후에 로그를 잃지 않는다는 것을 의미하기 때문에 유용합니다. 특정 경우에 프로그램이 어떻게 실행되었는지 영구적으로 기록할 수 있습니다.
로깅 핸들러 구성 라인에 파일 이름 인수를 포함하기만 하면 프로그램이 자동으로 로그를 파일에 저장합니다.
import logging logging.basicConfig(level=logging.DEBUG, filename="student_data.log") …
코드를 실행하면 로그가 지정한 파일 이름에 추가됩니다. "student_data.log" 파일을 열면 다음이 반환됩니다.
DEBUG:root:Calculating grade for Martin DEBUG:root:Calculating grade for Lewis DEBUG:root:Calculating grade for Terri DEBUG:root:Calculating grade for Bart DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
디버그 출력에는 logging.debug()
를 사용하여 로그로 지정한 메시지만 포함됩니다. 방법. 이것은 print()
를 사용하여 표시되는 프로그램 출력을 구별하는 데 도움이 되기 때문에 유용합니다. 문 - 디버그 로그에서.
로그에 항목이 추가된 시기를 추적하기 위해 매개변수를 추가할 수도 있습니다. 다음 코드를 사용하여 수행할 수 있습니다.
logging.basicConfig( level=logging.DEBUG, filename="student_data.log", format="%(asctime)s:%(levelname)s:%(message)s" )
이 코드는 다음을 student_data.log 파일에 추가합니다.
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Martin 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Lewis 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Terri 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Bart 2020-06-18 08:27:50,124:DEBUG:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
이제 우리는 코드의 각 줄이 언제 실행되었는지 압니다. 더 긴 프로그램에서 이 데이터는 코드 실행 순서와 코드 속도를 이해하는 데 도움이 되기 때문에 특히 유용합니다.
결론
Python 로깅 모듈은 디버깅에 매우 유용한 도구입니다. 프로그램에서 실행되는 모든 이벤트를 추적하고 해당 이벤트를 별도의 파일로 저장할 수 있는 옵션을 제공합니다. 이렇게 하면 코드를 보다 효과적으로 디버그하고 프로그램을 실행할 때 실행된 이벤트를 이해하는 데 도움이 됩니다.