Skip to main content

crashReporter

원격 서버에 크래시 리포트를 전송한다.

프로세스: Main, Renderer

다음은 Electron을 설정하여 크래시 리포트를 자동으로 원격 서버에 전송하는 예제다:

const { crashReporter } = require('electron')

crashReporter.start({ submitURL: 'https://your-domain.com/url-to-submit' })

크래시 리포트를 수신하고 처리할 서버를 설정하려면 다음 프로젝트를 사용할 수 있다:

참고: Electron은 크래시 수집 및 업로드에 Breakpad 대신 Crashpad를 사용하지만, 현재는 업로드 프로토콜이 동일하다.

또는 다음과 같은 제3자 호스팅 솔루션을 사용할 수도 있다:

크래시 리포트는 업로드 전에 앱의 사용자 데이터 디렉토리 아래 'Crashpad'라는 디렉토리에 임시로 저장된다. crashReporter를 시작하기 전에 app.setPath('crashDumps', '/path/to/crashes')를 호출하여 이 디렉토리를 재정의할 수 있다.

Electron은 크래시를 모니터링하고 리포트하기 위해 crashpad를 사용한다.

메서드

crashReporter 모듈은 다음과 같은 메서드를 제공한다:

crashReporter.start(options)

  • options Object
    • submitURL string (선택 사항) - 크래시 리포트가 POST로 전송될 URL. uploadToServerfalse가 아닌 경우 필수.
    • productName string (선택 사항) - 기본값은 app.name.
    • companyName string (선택 사항) Deprecated - { globalExtra: { _companyName: ... } }의 별칭으로 더 이상 사용되지 않음.
    • uploadToServer boolean (선택 사항) - 크래시 리포트를 서버로 전송할지 여부. false인 경우 크래시 리포트는 수집되어 crashes 디렉토리에 저장되지만 업로드되지 않음. 기본값은 true.
    • ignoreSystemCrashHandler boolean (선택 사항) - true인 경우 메인 프로세스에서 발생한 크래시가 시스템 크래시 핸들러로 전달되지 않음. 기본값은 false.
    • rateLimit boolean (선택 사항) macOS Windows - true인 경우 크래시 업로드 횟수를 1시간에 1회로 제한. 기본값은 false.
    • compress boolean (선택 사항) - true인 경우 크래시 리포트가 압축되어 Content-Encoding: gzip으로 업로드됨. 기본값은 true.
    • extra Record<string, string> (선택 사항) - 메인 프로세스에서 생성된 크래시 리포트와 함께 전송될 추가 문자열 키/값 주석. 문자열 값만 지원됨. 자식 프로세스에서 생성된 크래시는 이 추가 파라미터를 포함하지 않음. 자식 프로세스에서 생성된 크래시 리포트에 추가 파라미터를 포함하려면 자식 프로세스에서 addExtraParameter를 호출해야 함.
    • globalExtra Record<string, string> (선택 사항) - 모든 프로세스에서 생성된 크래시 리포트와 함께 전송될 추가 문자열 키/값 주석. 이 주석은 크래시 리포터가 시작된 후 변경할 수 없음. 키가 전역 추가 파라미터와 프로세스별 추가 파라미터에 모두 존재하는 경우 전역 파라미터가 우선순위를 가짐. 기본적으로 productName, 앱 버전, Electron 버전이 포함됨.

이 메서드는 다른 crashReporter API를 사용하기 전에 반드시 호출해야 한다. 이렇게 초기화되면 crashpad 핸들러는 이후 생성된 모든 프로세스의 크래시를 수집한다. 크래시 리포터는 일단 시작되면 비활성화할 수 없다.

이 메서드는 앱 시작 시 가능한 한 빨리 호출하는 것이 좋으며, app.on('ready') 이전에 호출하는 것이 바람직하다. 크래시 리포터가 렌더러 프로세스 생성 시점에 초기화되지 않은 경우, 해당 렌더러 프로세스는 크래시 리포터에 의해 모니터링되지 않는다.

참고: process.crash()를 사용해 크래시를 발생시켜 크래시 리포터를 테스트할 수 있다.

참고: start를 처음 호출한 후 추가/업데이트된 extra 파라미터를 전송해야 하는 경우 addExtraParameter를 호출할 수 있다.

참고: extra, globalExtra에 전달되거나 addExtraParameter로 설정된 파라미터는 키와 값의 길이에 제한이 있다. 키 이름은 최대 39바이트, 값은 최대 127바이트여야 한다. 최대 길이를 초과하는 키 이름은 무시되며, 최대 길이를 초과하는 키 값은 잘린다.

참고: 이 메서드는 메인 프로세스에서만 사용할 수 있다.

crashReporter.getLastCrashReport()

CrashReport | null 타입을 반환한다. 마지막으로 업로드된 크래시 리포트의 날짜와 ID를 제공한다. 업로드된 크래시 리포트만 반환되며, 디스크에 크래시 리포트가 존재하더라도 업로드되기 전에는 반환되지 않는다. 업로드된 리포트가 없는 경우 null을 반환한다.

참고: 이 메서드는 메인 프로세스에서만 사용할 수 있다.

crashReporter.getUploadedReports()

CrashReport[] 타입을 반환한다:

업로드된 모든 크래시 리포트를 반환한다. 각 리포트에는 날짜와 업로드 ID가 포함된다.

참고: 이 메서드는 메인 프로세스에서만 사용할 수 있다.

crashReporter.getUploadToServer()boolean 타입의 값을 반환한다. 이 값은 크래시 리포트를 서버로 전송할지 여부를 나타낸다. 이 설정은 start 메서드나 setUploadToServer를 통해 조정할 수 있다.

참고: 이 메서드는 메인 프로세스에서만 사용할 수 있다.

crashReporter.setUploadToServer(uploadToServer)

  • uploadToServer boolean - 크래시 보고서를 서버로 제출할지 여부를 결정한다.

일반적으로 이 설정은 사용자 환경설정에 의해 제어된다. start 메서드가 호출되기 전에 이 메서드를 호출하면 아무런 효과가 없다.

참고: 이 메서드는 메인 프로세스에서만 사용할 수 있다.

crashReporter.addExtraParameter(key, value)

  • key string - 파라미터 키. 39바이트를 초과할 수 없다.
  • value string - 파라미터 값. 127바이트를 초과할 수 없다.

크래시 리포트와 함께 전송될 추가 파라미터를 설정한다. 여기서 지정한 값은 start가 호출될 때 extra 옵션을 통해 설정된 값에 추가로 전송된다.

이 방식으로 추가된 파라미터(또는 crashReporter.startextra 파라미터를 통해 추가된 파라미터)는 호출한 프로세스에 한정된다. 메인 프로세스에서 추가 파라미터를 설정해도, 렌더러나 다른 자식 프로세스에서 발생한 크래시와 함께 해당 파라미터가 전송되지는 않는다. 마찬가지로, 렌더러 프로세스에서 추가 파라미터를 설정해도, 다른 렌더러 프로세스나 메인 프로세스에서 발생한 크래시와 함께 해당 파라미터가 전송되지는 않는다.

참고: 파라미터의 키와 값 길이에 제한이 있다. 키 이름은 39바이트를 초과할 수 없으며, 값은 20320바이트를 초과할 수 없다. 최대 길이를 초과하는 키 이름은 자동으로 무시된다. 최대 길이를 초과하는 키 값은 잘려서 전송된다.

crashReporter.removeExtraParameter(key)

  • key string - 파라미터 키, 39바이트를 초과할 수 없음.

현재 설정된 파라미터에서 추가 파라미터를 제거한다. 이후 발생하는 크래시에는 이 파라미터가 포함되지 않는다.

crashReporter.getParameters()

Record<string, string> 타입을 반환한다. 이 함수는 현재 크래시 리포터의 '추가' 파라미터를 가져온다.

Node 자식 프로세스에서

Node 자식 프로세스에서는 require('electron')을 사용할 수 없다. 따라서 Node 자식 프로세스에서 process 객체를 통해 다음 API를 사용한다.

process.crashReporter.start(options)

crashReporter.start()를 참고한다.

크래시 리포터를 메인 프로세스에서 시작하면 자동으로 자식 프로세스를 모니터링한다. 따라서 자식 프로세스에서는 크래시 리포터를 시작하지 않아도 된다. 이 메서드는 메인 프로세스가 크래시 리포터를 초기화하지 않는 경우에만 사용한다.

process.crashReporter.getParameters()

crashReporter.getParameters()를 참고한다.

process.crashReporter.addExtraParameter(key, value)

crashReporter.addExtraParameter(key, value)를 참고하세요.

process.crashReporter.removeExtraParameter(key)

crashReporter.removeExtraParameter(key)를 참고하세요.

크래시 리포트 전송 데이터

크래시 리포터는 submitURLmultipart/form-data 형식의 POST 요청을 보내며, 이때 다음 데이터를 포함한다:

  • ver 문자열 - Electron 버전
  • platform 문자열 - 예: 'win32'
  • process_type 문자열 - 예: 'renderer'
  • guid 문자열 - 예: '5e1286fc-da97-479e-918b-6bfb0c3d1c72'
  • _version 문자열 - package.json에 명시된 버전
  • _productName 문자열 - crashReporter options 객체에 정의된 제품명
  • prod 문자열 - 기본 제품명. 이 경우 'Electron'
  • _companyName 문자열 - crashReporter options 객체에 정의된 회사명
  • upload_file_minidump 파일 - minidump 형식의 크래시 리포트
  • crashReporter options 객체의 extra 객체에 포함된 모든 1단계 속성들