JSON 및 일반 텍스트 로그 형식 구성 - AWS Lambda

JSON 및 일반 텍스트 로그 형식 구성

로그 출력을 JSON 키 값 쌍으로 캡처하면 함수를 디버깅할 때 더 쉽게 검색하고 필터링할 수 있습니다. JSON 형식의 로그를 사용하면 로그에 태그와 컨텍스트 정보를 추가할 수도 있습니다. 이를 통해 대량의 로그 데이터를 자동으로 분석할 수 있습니다. 개발 워크플로가 Lambda 로그를 일반 텍스트로 사용하는 기존 도구를 사용하지 않는 한, 로그 형식으로 JSON을 선택하는 것이 좋습니다.

모든 Lambda 관리형 런타임의 경우, 함수의 시스템 로그를 구조화되지 않은 일반 텍스트와 JSON 형식 중 어떻게 CloudWatch Logs에 보낼지 선택할 수 있습니다. 시스템 로그는 Lambda가 생성하는 로그이며 플랫폼 이벤트 로그라고도 합니다.

지원되는 런타임의 경우, 지원되는 내장 로깅 방법 중 하나를 사용하면 Lambda는 함수의 애플리케이션 로그(함수 코드가 생성하는 로그)를 구조화된 JSON 형식으로 출력할 수도 있습니다. 이러한 런타임에 대해 함수의 로그 형식을 구성할 때 선택한 구성이 시스템 및 애플리케이션 로그 모두에 적용됩니다.

지원되는 런타임의 경우 함수가 지원되는 로깅 라이브러리 또는 메서드를 사용하는 경우 구조화된 JSON으로 로그를 캡처하기 위해 Lambda의 기존 코드를 변경할 필요가 없습니다.

참고

JSON 로그 형식을 사용하면 메타데이터가 추가되고 로그 메시지가 일련의 키 값 쌍을 포함하는 JSON 객체로 인코딩됩니다. 이로 인해 함수의 로그 메시지 크기가 커질 수 있습니다.

지원되는 런타임 및 로깅 메서드

Lambda는 현재 다음 런타임에 대해 JSON 구조화된 애플리케이션 로그를 출력하는 옵션을 지원합니다.

런타임 지원되는 버전
Java Amazon Linux 1에서 Java 8을 제외한 모든 Java 런타임
.NET .NET 8
Node.js Node.js 16 이상
Python Python 3.8 이상

Lambda가 함수의 애플리케이션 로그를 구조화된 JSON 형식으로 CloudWatch에 보내려면 함수가 다음과 같은 내장 로깅 도구를 사용하여 로그를 출력해야 합니다.

  • Java - LambdaLogger 로거 또는 Log4j2

  • .NET - 컨텍스트 객체의 ILambdaLogger 인스턴스.

  • Node.js - 콘솔 메서드console.trace, console.debug, console.log, console.info, console.errorconsole.warn

  • Python - 표준 Python logging 라이브러리

지원되는 런타임으로 고급 로깅 컨트롤을 사용하는 방법에 대한 자세한 내용은 Java Lambda 함수 로깅 및 모니터링, Node.js Lambda 함수 로깅 및 모니터링Python Lambda 함수 로깅 및 모니터링을 참조하십시오.

다른 관리형 Lambda 런타임의 경우, Lambda는 현재 구조화된 JSON 형식의 시스템 로그 캡처만 기본적으로 지원합니다. 하지만 JSON 형식의 로그 출력 출력에 대해 AWS Lambda용 Powertools와 같은 로깅 도구를 사용하면 모든 런타임에서 구조화된 JSON 형식으로 애플리케이션 로그를 캡처할 수 있습니다.

기본 로그 형식

현재 모든 Lambda 런타임의 기본 로그 형식은 일반 텍스트입니다.

이미 AWS Lambda용 Powertools과 같은 로깅 라이브러리를 사용하여 함수 로그를 JSON 구조 형식으로 생성하고 있다면 JSON 로그 형식 지정을 선택하면 코드를 변경할 필요가 없습니다. Lambda는 이미 JSON으로 인코딩된 로그를 이중 인코딩하지 않으므로 함수의 애플리케이션 로그는 이전과 같이 계속 캡처됩니다.

시스템 로그의 JSON 형식

함수의 로그 형식을 JSON으로 구성하면 각 시스템 로그 항목(플랫폼 이벤트)이 다음 키가 있는 키 값 쌍을 포함하는 JSON 객체로 캡처됩니다.

  • "time" - 로그 메시지가 생성된 시간

  • "type" - 로그되는 이벤트 유형

  • "record" - 로그 출력 내용

"record" 값 형식은 로그되는 이벤트 유형에 따라 달라집니다. 자세한 내용은 텔레메트리 API Event 객체 유형을 참조하세요. 시스템 로그 이벤트에 할당된 로그 수준에 대한 자세한 내용은 시스템 로그 수준 이벤트 매핑을 참조하세요.

비교를 위해 다음 두 예제는 일반 텍스트 형식과 구조화된 JSON 형식 모두에서 동일한 로그 출력을 보여줍니다. 대부분의 경우 시스템 로그 이벤트는 JSON 형식으로 출력할 때 일반 텍스트로 출력할 때보다 더 많은 정보를 포함합니다.

예 일반 텍스트
2024-03-13 18:56:24.046000 fbe8c1 INIT_START Runtime Version: python:3.12.v18 Runtime Version ARN: arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0
예 구조화된 JSON
{ "time": "2024-03-13T18:56:24.046Z", "type": "platform.initStart", "record": { "initializationType": "on-demand", "phase": "init", "runtimeVersion": "python:3.12.v18", "runtimeVersionArn": "arn:aws:lambda:eu-west-1::runtime:edb5a058bfa782cb9cedc6d534ac8b8c193bc28e9a9879d9f5ebaaf619cd0fc0" } }
참고

텔레메트리 API를 사용하여 확장의 실시간 텔레메트리 데이터에 액세스은 항상 JSON 형식으로 STARTREPORT 등의 플랫폼 이벤트를 방출합니다. Lambda가 CloudWatch로 보내는 시스템 로그의 형식을 구성해도 Lambda Telemetry API 동작에는 영향을 주지 않습니다.

애플리케이션 로그의 JSON 형식

함수의 로그 형식을 JSON으로 구성하면 지원되는 로깅 라이브러리 및 메서드를 사용하여 작성된 애플리케이션 로그 출력이 다음 키와 함께 키 값 페어를 포함하는 JSON 객체로 캡처됩니다.

  • "timestamp" - 로그 메시지가 생성된 시간

  • "level" - 메시지에 할당된 로그 수준

  • "message" - 로그 메시지의 내용

  • "requestId"(Python, .NET 및 Node.js) 또는 "AWSrequestId"(Java) - 함수 간접 호출에 대한 고유한 요청 ID

함수에서 사용하는 런타임 및 로깅 방법에 따라 이 JSON 객체에 추가 키 페어가 포함될 수도 있습니다. 예를 들어 Node.js에서 함수가 console 메서드를 통해 여러 인수를 사용하여 오류 객체를 기록하는 경우 JSON 객체에는 키 errorMessage, errorType, stackTrace와 함께 추가 키 값 페어가 포함됩니다. 다양한 Lambda 런타임에서 JSON 형식 로그에 대한 자세한 내용은 Python Lambda 함수 로깅 및 모니터링, Node.js Lambda 함수 로깅 및 모니터링, Java Lambda 함수 로깅 및 모니터링 섹션을 참조하세요.

참고

Lambda가 타임스탬프 값에 사용하는 키는 시스템 로그와 애플리케이션 로그마다 다릅니다. 시스템 로그의 경우 Lambda는 "time" 키를 사용하여 텔레메트리 API와의 일관성을 유지합니다. 애플리케이션 로그의 경우 Lambda는 지원되는 런타임 의 규칙을 따르며 "timestamp"를 사용합니다.

비교를 위해 다음 두 예제는 일반 텍스트 형식과 구조화된 JSON 형식 모두에서 동일한 로그 출력을 보여줍니다.

예 일반 텍스트
2024-10-27T19:17:45.586Z 79b4f56e-95b1-4643-9700-2807f4e68189 INFO some log message
예 구조화된 JSON
{ "timestamp":"2024-10-27T19:17:45.586Z", "level":"INFO", "message":"some log message", "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189" }

함수의 로그 형식 설정

함수의 로그 형식을 구성하려면 Lambda 콘솔 또는 AWS Command Line Interface(AWS CLI)을 사용할 수 있습니다. CreateFunctionUpdateFunctionConfiguration Lambda API 명령, AWS Serverless Application Model(AWS SAM) AWS::Serverless::Function 리소스, AWS CloudFormation AWS::Lambda::Function 리소스를 사용하여 함수의 로그 형식을 구성할 수도 있습니다.

함수의 로그 형식을 변경해도 CloudWatch Logs에 저장된 기존 로그에는 영향을 주지 않습니다. 새 로그만 업데이트된 형식을 사용합니다.

함수의 로그 형식을 JSON으로 변경하고 로그 수준을 설정하지 않으면 Lambda는 함수의 애플리케이션 로그 수준과 시스템 로그 수준을 정보로 자동 설정합니다. 즉, Lambda는 정보 수준 이하의 로그 출력만 CloudWatch Logs로 전송합니다. 애플리케이션 및 시스템 로그 수준 필터링에 대한 자세한 내용은 로그 수준 필터링 섹션을 참조하세요.

참고

Python 런타임의 경우 함수의 로그 형식이 일반 텍스트로 설정된 경우 기본 로그 수준 설정은 경고입니다. 즉, Lambda는 경고 수준 이하의 로그 출력만 CloudWatch Logs로 전송합니다. 함수의 로그 형식을 JSON으로 변경하면 이 기본 동작이 변경됩니다. Python에서 로깅에 대해 자세한 내용은 Python Lambda 함수 로깅 및 모니터링 섹션을 참조하세요.

임베디드 지표 형식 (EMF) 로그를 내보내는 Node.js 함수의 경우 함수의 로그 형식을 JSON으로 변경하면 CloudWatch에서 지표를 인식하지 못할 수 있습니다.

중요

함수가 AWS Lambda용 Powertools(TypeScript) 또는 오픈 소스 EMF 클라이언트 라이브러리를 사용하여 EMF 로그를 방출하는 경우 CloudWatch가 계속해서 로그를 올바르게 구문분석할 수 있도록 PowertoolsEMF 라이브러리를 최신 버전으로 업데이트합니다. JSON 로그 형식으로 전환하는 경우 함수에 내장된 지표와의 호환성을 확인하기 위한 테스트도 수행하는 것이 좋습니다. EMF 로그를 내보내는 node.js 함수에 대한 자세한 내용은 구조화된 JSON 로그가 포함된 임베디드 메트릭 형식(EMF) 클라이언트 라이브러리 사용을 참조하십시오.

함수의 로그 형식 구성하기(콘솔)
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수 선택

  3. 함수 구성 페이지에서 모니터링 및 작업 도구를 선택합니다.

  4. 로깅 구성 창에서 편집을 선택합니다.

  5. 로그 콘텐츠에서 로그 형식에 대해 텍스트 또는 JSON을 선택합니다.

  6. 저장을 선택합니다.

기존 함수의 로그 형식 변경하기(AWS CLI)
  • 기존 함수의 로그 형식을 변경하려면 update-function-configuration 명령을 사용합니다. LoggingConfig에서 LogFormat 옵션을 JSON 또는 Text로 설정합니다.

    aws lambda update-function-configuration \ --function-name myFunction \ --logging-config LogFormat=JSON
함수를 생성할 때 로그 형식 설정하기(AWS CLI)
  • 새 함수를 만들 때 로그 형식을 구성하려면 --logging-config 옵션을 create-function 명령에서 사용합니다. LogFormatJSON 또는 Text로 설정합니다. 다음 예제 명령은 구조화된 JSON으로 로그를 출력하는 Node.js 함수를 생성합니다.

    함수를 생성할 때 로그 형식을 지정하지 않으면 Lambda는 선택한 런타임 버전의 기본 로그 형식을 사용합니다. 기본 로깅 형식에 대한 자세한 내용은 기본 로그 형식을 참조하세요.

    aws lambda create-function \ --function-name myFunction \ --runtime nodejs22.x \ --handler index.handler \ --zip-file fileb://function.zip \ --role arn:aws:iam::123456789012:role/LambdaRole \ --logging-config LogFormat=JSON