Skip to main content

로그 생성 및 분석

학습 목표

이 유닛을 완료하면 다음을 수행할 수 있습니다.
  • 로그 인스펙터 또는 텍스트 편집기에서 디버그 로그를 확인합니다.
  • 디버그 로그의 다양한 로그 수준을 설정합니다.
  • 로그 인스펙터를 사용하여 관점을 관리하고 전환합니다.
참고

참고

한국어로 학습하시겠어요? 이 배지에서는 Trailhead 실습과제 검증이 영어로 진행됩니다. 참조용 번역이 괄호로 제공됩니다. Trailhead Playground에서 (1) 로캘을 미국으로 바꾸고 (2) 언어를 영어로 바꾼 후 (3) 영문으로 표시된 값을 복사해 붙여 넣으세요. 여기에 나와 있는 지침을 따르세요.

원하는 언어로 Trailhead 사용하기 배지를 확인해 현지화된 Trailhead 경험을 활용하는 방법에 대해 자세히 알아보세요.

디버그 로그 보기

훌륭한 사령관으로서 시스템 로그를 검토하여 모든 것이 정상인지 확인합니다. 로그는 시스템 또는 프로그램의 문제를 확인하는 가장 좋은 방법 중 하나입니다. 개발자 콘솔을 사용해 다양한 디버그 로그를 살펴봄으로써 코드가 어떻게 작동하는지 이해하고 성능 문제를 확인할 수 있습니다.

텍스트 편집기에서 로그 보기

디버그 로그는 간단하게 확인할 수 있습니다. 로그를 생성하기 위해, 전에 만들었던 EmailMissionSpecialist Apex 클래스를 실행해 보겠습니다.

로그를 두 가지 방법으로 확인할 수 있습니다.
  • 실행 전에 Enter Apex Code(Apex 코드 입력) 창에서 Open Log(로그 열기)를 활성화합니다. 코드가 실행된 후에 로그가 열립니다.
  • 실행 후에 Logs(로그) 탭에 표시되는 로그를 두 번 클릭합니다.
첫 번째 방법을 사용해 보겠습니다.
  1. Debug(디버그) | Open Execute Anonymous Window(익명 실행 창 열기)를 선택합니다.
  2. 마지막으로 입력하고 실행한 코드가 Apex 코드 입력 창에 표시됩니다. 이 코드가 아래의 코드와 다르면 삭제하고 아래의 코드를 붙여 넣으세요. Enter your email address를 자신의 이메일 주소로 바꿔야 합니다.
    EmailMissionSpecialist em = new EmailMissionSpecialist();
    em.sendMail('Enter your email address', 'Flight Path Change', 
       'Mission Control 123: Your flight path has been changed to avoid collision '
       + 'with asteroid 2014 QO441.');
  3. Open Log(로그 열기) 옵션을 선택합니다.
  4. Execute(실행)를 클릭합니다.

표시되는 실행 로그는 혼란스럽게 뒤섞인 숫자와 단어처럼 보일 수 있으므로, 로그 데이터를 읽고 이해할 수 있는 방법에 대해 알아보겠습니다.

로그 결과

로그 데이터 읽기

EmailMissionSpecialist 클래스를 다시 실행하되, 이번에는 오류를 삽입해 보겠습니다. 그런 다음 그 결과로 생성되는 로그를 로그 탭에서 찾아보겠습니다.

  1. Debug(디버그) | Open Execute Anonymous Window(익명 실행 창 열기)를 선택합니다. testingemail 같은 잘못된 이메일 주소를 입력합니다.
    EmailMissionSpecialist em = new EmailMissionSpecialist();
    em.sendMail('testingemail', 'Flight Path Change', 
       'Mission Control 123: Your flight path has been changed to avoid collision '
       + 'with asteroid 2014 QO441.');
  2. Open Log(로그 열기) 옵션을 선택 해제합니다.
  3. Execute(실행)를 클릭합니다.코드를 실행한 후 오류가 포함된 대화 상자가 표시됩니다. 익명 실행 오류
  4. OK(확인)를 클릭한 다음 로그 탭에서 새 로그를 두 번 클릭합니다. 어느 로그가 최신 로그인지 확실히 모르겠으면 시간 열의 제목을 클릭하여 로그가 생성된 시간을 기준으로 로그를 정렬하세요.로그 결과
각 열이 무엇을 나타내는지 확인하여 디버그 로그를 읽을 수 있습니다.
  • Timestamp(타임스탬프)—이벤트가 발생한 시간입니다. 타임스탬프는 항상 사용자의 시간대와 HH:mm:ss:SSS 형식으로 표시됩니다.
  • Event(이벤트)—디버그 로그 항목을 트리거한 이벤트입니다. 예를 들어 사용자가 생성한 실행 로그에서 FATAL_ERROR 이벤트는 이메일 주소가 잘못되었다고 확인되는 경우에 로그에 기록됩니다.
  • Details(세부 정보)—코드가 실행된 코드 줄과 메서드 이름에 대한 세부 정보입니다.
로그 결과 보기 옵션

This Frame(현재 프레임)(a), Executable(실행 가능)(b), 또는 Debug Only(디버그만)(c)를 선택하여 실행 로그에 표시되는 내용을 변경할 수 있습니다. 옵션을 선택하면 특정 이벤트 유형만 표시됩니다. 예를 들어 Debug Only(디버그만)를 선택하면 USER_DEBUG 이벤트가 표시됩니다. Filter(필터)(d)를 사용해 로그의 다른 부분을 필터링할 수도 있습니다. 메서드 이름이나 검색할 특정 텍스트를 입력하면 로그에 필터를 적용한 결과가 표시됩니다.

디버그 로그를 더 많은 정보를 표시하는 원시 로그로 볼 수도 있습니다. File(파일) | Open Raw Log(원시 로그 열기)를 선택하세요. 원시 로그의 타임스탬프는 이벤트 시작 후에 경과한 시간을 나노초 단위로 (괄호 안에) 표시합니다.

로그의 타임스탬프, 이벤트 및 세부 정보

이 타임스탬프, 이벤트 및 세부 정보를 함께 확인하면 코드가 작동하는 방법과 발생하는 오류에 대한 소중한 통찰력을 얻을 수 있습니다.

이 정보는 매우 유용하지만, 디버그 로그에서 특정 값을 빨리 찾고 싶으면 어떻게 해야 할까요? 여러 다른 책임을 맡고 있는 사령관이라면 시간을 아껴야 하니까요. Apex에서 System.debug() 메서드를 사용하면 아주 효과적입니다.

System.debug()는 값을 추적하기 위해 코드의 원하는 위치에 추가할 수 있어 직접 쓴 코드를 디버깅하는 데 유용하다는 커다란 장점이 있습니다.

다음은 System.debug()의 구문입니다. 메시지를 표시하는 구문:
System.debug('Your Message');
변수 값을 표시하는 구문:
System.debug(yourVariable);
레이블이 있는 값을 표시하는 구문:
System.debug('Your Label: ' + yourVariable);

로그 인스펙터 사용

유용한 로그 인스펙터는 큰 로그를 더 쉽게 볼 수 있도록 하기 위해 개발되었습니다! 로그 인스펙터는 로그 패널 보기를 사용하여 코드의 다양한 관점을 제시합니다. Debug(디버그) | View Log Panels(로그 패널 보기)를 선택하여 확인해 보세요.

참고

Debug(디버그) | View Log Panels(로그 패널 보기) 메뉴 옵션은 디버그 로그 탭을 보고 있는 경우에만 사용할 수 있습니다. 예를 들어 원시 로그 탭을 보고 있는 경우에는 이 옵션이 회색으로 표시됩니다.

로그 패널은 로그 구조를 바꿔 실행 중인 코드의 컨텍스트에 대한 다른 유용한 정보를 제시합니다. 예를 들어 소스, 실행 시간, 힙 크기 및 호출 계층 구조가 각기 다른 패널에 표시될 수 있습니다. (기술적인 용어가 많아서 죄송해요. 이 부분의 내용이 좀 그렇거든요. 하지만 여기서는 디버깅에 대한 자세한 내용이 아니라 개발자 콘솔에 대해 알아보고 있다는 것을 기억하세요. 그러니 이해가 안 되는 내용이 있더라도 너무 걱정하지 마세요.)

이런 로그 패널은 서로 상호작용하여 코드를 디버깅하는 데 도움이 됩니다. 예를 들어 실행 로그 또는 스택 트리에서 로그 항목을 클릭하면 나머지 패널(소스, 소스 목록, 변수 및 실행 스택)이 새로 고침되어 관련 정보가 표시됩니다.

모든 로그 패널
로그 인스펙터에서 사용할 수 있는 패널은 다음과 같습니다.
  1. Stack Tree(스택 트리)—로그 항목을 하향식 트리 보기를 사용하여 항목의 개체 및 실행 계층 구조 안에 표시합니다. 예를 들어 클래스 하나가 두 번째 클래스를 호출하면 두 번째 클래스가 첫 번째 클래스의 하위 클래스로 표시됩니다.
  2. Execution Stack(실행 스택)—선택한 항목의 상향식 보기를 표시합니다. 로그 항목에 이어 해당 항목을 호출한 작업을 표시합니다.
  3. Execution Log(실행 로그)—코드를 실행하는 동안 발생한 모든 동작을 표시합니다.
  4. Source(소스)—소스 파일의 내용을 표시하고 선택한 로그 항목이 생성된 시점에 실행되었던 코드 줄을 나타냅니다.
  5. Source List(소스 목록)—이벤트가 로그에 기록된 시점에 실행되었던 코드의 컨텍스트를 표시합니다. 예를 들어 잘못된 이메일 주소 값을 입력할 때 생성된 로그 항목을 선택하면 소스 목록에 execute_anonymous_apex가 표시됩니다.
  6. Variables(변수)—선택한 로그 항목을 생성한 코드가 실행된 시점에 범위 안에 있던 변수에 할당된 값과 변수를 표시합니다.
  7. Execution Overview(실행 개요)—실행 중인 코드의 실행 시간과 힙 크기 같은 통계를 표시합니다.

관점 관리자는 무엇이고, 관점을 어떻게 전환할 수 있나요?

관점은 그룹화된 패널의 레이아웃입니다. 예를 들어 미리 정의된 디버그 관점은 Execution Log(실행 로그), Source(소스) 및 Variables(변수)를 표시하는 한편, 분석 관점은 Stack Tree(스택 트리), Execution Log(실행 로그), Execution Stack(실행 스택) 및 Execution Overview(실행 개요)를 표시합니다.

Debug(디버그) | Switch Perspectives(관점 전환) 또는 Debug(디버그) | Perspective Manager(관점 관리자)를 선택하여 관점을 선택할 수 있습니다. 관점을 전환하기는 통신 패널을 전환하는 것만큼 쉽고, 관점을 사용하면 미션 스페셜리스트, 지구 우주 정거장, 화성 우주 비행 관제 센터의 로그를 모두 같은 보기에서 해독하려고 하는 것보다 훨씬 더 편리합니다.

관점을 직접 만들 수도 있습니다. 표시할 패널의 선호하는 조합을 설정한 다음 Debug(디버그) | Save Perspective As(다른 이름으로 관점 저장)를 선택합니다. 관점의 이름을 입력하고 OK(확인)를 클릭합니다.

로그 데이터를 조작하여 필요한 정보 찾기

3번 엔진이 때때로 부드럽게 작동하지 않는 문제가 있음을 알고 있습니다. 우주선을 조종하여 2014 QO441 소행성을 피하려면 이 엔진이 최대 용량으로 작동해야 합니다. 하지만 시스템 점검을 수행하려고 할 때마다 우주선의 우울한 로봇이 보내는 정보도 수신됩니다. 이 로봇이 보내는 로봇 봉기를 예상하는 복잡한 보고서 때문에 로그 줄 수가 많아져 소중한 정보를 놓칠 수도 있습니다.

로그에 기록되는 정보의 양을 통제할 방법이 필요합니다. 다행히 개발자 콘솔은 로그 범주와 로그 수준을 사용하여 이 기능을 수행합니다.

로그 범주

로그 범주는 로그에 기록되는 정보 유형입니다.

가장 일반적인 두 가지의 로그 범주는 다음과 같습니다.
  • ApexCode. 이 범주는 Apex 코드에 관한 이벤트를 로그에 기록하고, Apex 메서드의 시작과 끝에 대한 정보를 포함합니다.
  • Database(데이터베이스). 이 범주는 DML(Database Manipulation Language), SOSL 및 SOQL 쿼리(나중에 다룰 예정임) 등 데이터베이스 이벤트에 관한 로그를 포함합니다.

로그 수준과 로그 수준을 변경하는 방법

3번 엔진에 다시 문제가 발생하는 것 같습니다. 문제의 가능한 원인을 확인하기 위해 로그를 살펴보고 있을 때 우울한 로봇이 보낸 로봇 봉기에 대한 경고 메시지가 표시됩니다.

로봇 하나가 반항한다고 봉기가 되는 것은 아니어서 그리 걱정되는 경고는 아닙니다. 하지만 엔진 고장은 시급한 문제입니다. 3번 엔진에서 실제로 전송된 메시지를 많은 로그 데이터 속에서 놓치면 안 되니까요. 이 문제는 로그 수준으로 해결하세요!

로그 수준은 각 로그 범주에 대해 로그에 기록되는 세부 정보의 양을 조정합니다. 개발자 콘솔에서 사용할 수 있는 로그 수준은 로그에 기록되는 가장 적은 데이터의 양(수준 = NONE)부터 가장 많은 양(수준 = FINEST)까지 다음과 같습니다.
  • NONE
  • ERROR
  • WARN
  • INFO
  • DEBUG
  • FINE
  • FINER
  • FINEST

로그 수준은 누적됩니다. 예를 들어 이벤트의 로그 수준이 INFO인 경우 ERRORWARN 수준의 로그 정보도 포함됩니다. 하지만 로그 수준이 ERROR인 경우 오류 메시지만 수신됩니다. 해당 로그 범주에 대한 경고 메시지나 기타 로그 정보는 수신되지 않습니다.

로그 수준별로 제공되는 정보는 로그 이벤트에 따라 다르기도 합니다. 로그 이벤트가 로그에 기록되기 시작하는 로그 수준은 저마다 다릅니다. 예를 들어 일부 ApexCode 이벤트는 INFO부터 로그에 기록되기 시작합니다. ERROR를 로그 수준으로 설정하면 해당 이벤트에 대한 로그 정보가 수신되지 않습니다.

원하는 정보를 받으려면 각 이벤트마다 로그 수준을 수정하세요. 예상되는 봉기에 대한 메시지를 로봇이 데이터베이스에 저장해도 메시지가 로그에 기록되지 않게 하려고 하므로, 데이터베이스(DB) 범주의 로그 수준을 NONE 또는 ERROR로 설정하세요.

Debug(디버그) | Change Log Levels(로그 수준 변경)를 선택하여 수준을 설정할 수 있습니다.

로그 수준 선택

사용자의 일반 추적 설정 탭에서 Add/Change(추가/변경)(1)를 클릭합니다. DebugLevel 변경 창에서 각 범주의 로그 수준을 선택합니다. 로그 수준은 신중하게 사용해야 합니다. 로그 수준이 FINEST(2)면 코드가 로그 제한에 도달하여 실행 시간이 길어질 수 있습니다. 범주의 로그 수준을 업데이트할 때 모든 수준이 보이지 않아도 걱정하지 마세요. 범주에 대한 로그를 더 추가하는 수준만 나열됩니다.

다행히 로봇의 경고를 로그에 기록하지 않도록 설정한 후 3번 엔진의 문제를 확인하기가 쉬워졌습니다. 엔진 냉매의 양이 부족합니다. 엔지니어를 보내 냉매를 보충합니다. 이 참에 엔지니어에게 로봇의 조인트에 오일도 발라 달라고 합니다. 새 윤활유를 바르면 로봇의 기분이 좀 더 나아질 수 있기를 바랍니다.

계속해서 무료로 학습하세요!
계속 진행하려면 계정을 가입하세요.
얻을 수 있는 이점
  • 커리어 목표에 대한 개인화된 권장 사항 제공받기
  • 실습 과제 및 퀴즈를 통해 스킬 연습
  • 진행 상황을 추적하고 고용주에게 공유
  • 멘토십과 커리어 기회에 연결