플랫폼 로그 사용

이 페이지에서는 Cloud Logging의 일부로 Live Stream API로 생성된 플랫폼 로그를 사용하는 방법을 설명합니다. Live Stream API는 Logging API 서비스 이름 livestream.googleapis.com을 사용하여 채널 관련 활동을 로깅합니다.

시작하기 전에

플랫폼 로깅 활성화

기본적으로 Live Stream API의 livestream.googleapis.com/channel_activities 플랫폼 로그는 비활성화됩니다. 로그를 활성화하려면 채널 리소스를 만들거나 업데이트할 때 심각도 수준을 지정해야 합니다.

로그를 활성화하려면 projects.locations.channels.create 또는 projects.locations.channels.patch 메서드의 요청 JSON 본문에 다음 필드를 추가합니다.

   "logConfig": {
     "logSeverity": "SEVERITY_LEVEL"
   },
  

여기서 SEVERITY_LEVEL은 다음 중 하나입니다.

  • OFF
  • DEBUG
  • INFO
  • WARNING
  • ERROR

채널의 로그 심각도 수준을 선택하면 선택한 심각도 수준 이상의 플랫폼 로그만 로깅됩니다. 예를 들어 심각도 수준이 WARNING이면 심각도 수준이 WARNINGERROR인 로그만 로깅됩니다. 심각도 수준이 INFO이면 DEBUG를 제외한 모든 심각도 수준의 로그가 로깅됩니다.

로그 심각도 수준에 대한 자세한 내용은 LogSeverity를 참조하세요.

플랫폼 로그 보기

플랫폼 로그를 보려면 다음 안내를 따르세요.

콘솔

Google Cloud 콘솔에서 플랫폼 로그를 보려면 다음 안내를 따르세요.

  1. 로그 탐색기로 이동합니다.

    로그 탐색기로 이동

  2. 적합한 Google Cloud 프로젝트를 선택합니다.

  3. 쿼리 필드에 다음 쿼리 명령어를 입력합니다.

    resource.labels.channel_id=CHANNEL_ID
    resource.labels.location=LOCATION
    logName="projects/PROJECT_ID/logs/livestream.googleapis.com%2Fchannel_activities"
    

    각 항목의 의미는 다음과 같습니다.

    • CHANNEL_ID는 디버깅하거나 모니터링할 채널의 ID입니다. 예를 들면 my-channel입니다.

    • LOCATION은 디버깅하거나 모니터링할 채널의 위치입니다. 예를 들면 us-central1입니다.

    • PROJECT_ID는 디버깅하거나 모니터링할 채널이 포함된 프로젝트의 ID입니다. 예를 들면 my-project입니다.

  4. 쿼리 실행을 클릭합니다.

로그 탐색기에 대한 자세한 내용은 로그 탐색기 개요로그 탐색기 사용을 참조하세요.

gcloud

gcloud 명령줄 도구는 Cloud Logging에 대한 명령줄 인터페이스를 제공합니다.

프로젝트의 channel_activities 로그를 보려면 다음 명령어를 실행합니다.

gcloud logging read "logName:projects/PROJECT_ID/logs/livestream.googleapis.com%2Fchannel_activities" --project=PROJECT_ID

PROJECT_ID는 Google Cloud 프로젝트의 ID입니다.

Cloud Logging에서 gcloud 도구를 사용하는 방법에 대한 자세한 내용은 gcloud logging을 참조하세요.

플랫폼 로그 사용

이 섹션에서는 Live Stream API에 대한 특정 플랫폼 로그를 사용하고 해석하는 방법을 설명합니다.

eventStateChange

eventStateChange 로그는 채널 이벤트의 상태가 변경되면 생성됩니다. 채널 이벤트의 새 상태가 FAILED인 경우 eventStateChange 로그의 심각도 수준은 ERROR입니다. 그렇지 않은 경우 eventStateChange 로그의 심각도 수준은 INFO입니다.

다음은 eventStateChange 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    eventStateChange: {
      eventId: "my-ad-break"
      newState: "SCHEDULED"
      previousState: "PENDING"
    }
    message: "State of event "my-ad-break" changed from "PENDING" to "SCHEDULED"."
  }
  ...
  severity: "INFO"
  ...
}

scte35CommandReceived

입력 스트림이 SCTE35 명령어를 수신하면 scte35CommandReceived 로그가 생성됩니다. scte35CommandReceived 로그의 심각도 수준은 INFO입니다.

durationFlag, breakDuration, spliceTime, outOfNetworkIndicator만 처리됩니다. spliceTime이 없으면 SCTE35 명령어가 즉시 실행됩니다. 다른 모든 필드는 노옵스(no-ops)로 처리됩니다.

다음은 scte35CommandReceived 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    scte35CommandReceived: {
      spliceInfoSection: {
        ptsAdjustment: "123456789"
        spliceInsert: {
          availNum: 0
          availsExpected: 0
          breakDuration: null
          componentCount: 0
          components: [0]
          durationFlag: false
          outOfNetworkIndicator: true
          programSpliceFlag: true
          spliceEventCancelIndicator: false
          spliceEventId: 123456789
          spliceImmediateFlag: true
          spliceTime: null
          uniqueProgramId: 5
        }
      }
    }
    message: "Received inband SCTE35 command, eventID=123456789."
  }
  ...
  severity: "INFO"
  ...
}

streamingStateChange

streamingStateChange 로그는 채널의 스트리밍 상태가 변경될 때 생성됩니다. 채널의 새 상태가 STREAMING_ERROR인 경우 streamingStateChange 로그의 심각도 수준은 ERROR입니다. 그렇지 않은 경우 streamingStateChange 로그의 심각도 수준은 INFO입니다.

다음은 이전 상태가 STREAMING_ERROR이고 새 상태가 STREAMINGstreamingStateChange 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    message: "streaming state of channel "CHANNEL_ID" changes from "STREAMING_ERROR" to "STREAMING""
    streamingStateChange: {
      newState: "STREAMING"
      previousState: "STREAMING_ERROR"
      ...
    type: "livestream.googleapis.com/Channel"
  }
  severity: "INFO"
  ...
}

로그 탐색기 쿼리 필드에 명령어를 추가하여 표시되는 로그의 범위를 좁힐 수 있습니다.

다음 명령어를 추가하여 새 상태가 STREAMING인 모든 streamingStateChange 로그를 표시합니다.

jsonPayload.streamingStateChange.newState="STREAMING"

다음 명령어를 추가하여 streamingStateChange 로그만 표시합니다.

jsonPayload.streamingStateChange.newState:*

streamingError

streamingError 로그는 채널에서 스트리밍 관련 오류를 발견하면 생성됩니다. streamingError 로그의 로그 심각도 수준은 ERROR입니다.

다음은 지정된 Cloud Storage 버킷에 출력 파일을 업로드하기 위해 Live Stream API에 대한 권한이 거부된 streamingError 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    message: "A live streaming encounters an error."
    streamingError: {
      error: {
        ...
        message: "Permission denied to access the Cloud Storage bucket "STORAGE_BUCKET_NAME""
  ...
  severity: "ERROR"
  ...
}

지정된 Cloud Storage 버킷이 없는 경우에도 이 오류가 발생할 수 있습니다.

streamingError.messageThis is due to an internal error. If the error persists, please contact support team 메시지를 표시하면 로그 콘텐츠를 복사하고 문제 해결을 위해 지원팀으로 보냅니다.

inputAccept

입력 스트림이 Live Stream API 입력 엔드포인트에 성공적으로 연결되면 inputAccept 로그가 생성됩니다. inputAccept 로그의 심각도 수준은 INFO입니다.

inputAccept 로그의 inputStreamProperty 필드에는 입력 스트림의 동영상 및 오디오 하위 스트림에 대한 다음 정보가 포함됩니다.

동영상 스트림
  • 색인
  • 코덱
  • 프레임 속도
  • 해상도
오디오 스트림
  • 색인
  • 채널 수
  • 채널 레이아웃
  • 코덱 정보

inputAccept 로그를 사용하여 입력 스트림의 형식 및 승인 상태를 확인할 수 있습니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    inputAccept: {
      inputAttachment: "input-primary"
      inputStreamProperty: {
        audioStreams: [
          0: {
            audioFormat: {
              channelCount: 2
              channelLayout: [
                0: "fl"
                1: "fr"
              ]
              codec: "aac"
            }
            index: 1
          }
        ]
        videoStreams: [
          0: {
            videoFormat: {
              codec: "h264"
              frameRate: 60
              heightPixels: 720
              widthPixels: 1280
      ...
      streamId: "STREAM_ID"
    }
    message: "Input stream "STREAM_ID" is accepted by channel "CHANNEL_ID" for input attachment "input-primary""
  }
  ...
  severity: "INFO"
  ...
}

로그 탐색기 쿼리 필드에 다음 명령어를 추가하여 특정 스트림의 inputAccept 로그만 표시합니다.

jsonPayload.inputAccept.streamId="STREAM_ID"

여기서 STREAM_ID입력 엔드포인트 URI에 포함된 스트림의 고유 식별자입니다.

inputError

inputError 로그는 Live Stream API에서 입력 스트림을 거부할 때 생성됩니다. inputError 로그의 심각도 수준은 ERROR입니다.

다음은 입력 스트림이 아직 시작되지 않은 채널로 전송된 inputError 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    inputError: {
      error: {
        ...
        message: "The channel has not been started yet"
      }
      streamId: "STREAM_ID"
  ...
  severity: "ERROR"
  ...
}

다음은 중복 입력 스트림이 이미 스트리밍 중인 채널로 전송된 inputError 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    inputError: {
      error: {
        code: 9
        message: "input stream "STREAM_ID" has been accepted. Please verify if another input stream has been streaming to the same endpoint."
      }
      streamId: "STREAM_ID"
  ...
  severity: "ERROR"
  ...
}

로그 탐색기 쿼리 필드에 다음 명령어를 추가하여 특정 스트림의 inputError 로그만 표시합니다.

jsonPayload.inputError.streamId="STREAM_ID"

여기서 STREAM_ID입력 엔드포인트 URI에 포함된 스트림의 고유 식별자입니다.

inputDisconnect

inputDisconnect 로그는 입력 스트림이 Live Stream API에서 연결 해제될 때 생성됩니다. inputDisconnect 로그를 사용하여 예기치 않은 실시간 스트림 연결 해제를 확인할 수 있습니다. inputDisconnect 로그의 심각도 수준은 INFO입니다.

다음은 inputDisconnect 로그의 예시입니다.

{
  jsonPayload: {
    @type: "type.googleapis.com/google.cloud.video.livestream.logging.v1.ChannelActivity"
    inputDisconnect: {
      inputAttachment: "input-primary"
      streamId: "STREAM_ID"
    }
    message: "Input stream "STREAM_ID" is disconnected by channel "CHANNEL_ID" for input attachment "input-primary""
  ...
  severity: "INFO"
  ...
}