

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 지원되는 쿼리 언어
<a name="CWL_AnalyzeLogData_Languages"></a>

다음 섹션에서는 각 쿼리 언어에서 지원되는 명령을 나열합니다. 또한 구문 형식을 설명하고 샘플 쿼리를 제공합니다.

**Topics**
+ [

# CloudWatch Logs Insights 쿼리 언어(Logs Insights QL)
](CWL_AnalyzeLogData_LogsInsights.md)
+ [

# OpenSearch Piped Processing Language(PPL)
](CWL_AnalyzeLogData_PPL.md)
+ [

# OpenSearch Structured Query Language(SQL)
](CWL_AnalyzeLogData_SQL.md)

# CloudWatch Logs Insights 쿼리 언어(Logs Insights QL)
<a name="CWL_AnalyzeLogData_LogsInsights"></a>

이 섹션에는 Logs Insights QL 명령 및 함수에 대한 전체 설명서가 포함되어 있습니다. 또한이 언어에 대한 샘플 쿼리도 포함되어 있습니다.

사용할 수 있는 다른 쿼리 언어에 대한 자세한 내용은 [OpenSearch Service PPL](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_PPL.html), [OpenSearch Service SQL](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_SQL.html) 및 [CloudWatch Metrics Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/query_with_cloudwatch-metrics-insights.html)를 참조하세요.

**Topics**
+ [

# CloudWatch Logs Insights 언어 쿼리 구문
](CWL_QuerySyntax.md)
+ [

# Logs Insights QL 시작하기: 쿼리 자습서
](CWL_AnalyzeLogData_Tutorials.md)
+ [

# 샘플 쿼리
](CWL_QuerySyntax-examples.md)
+ [

# (diff)를 이전 시간 범위와 비교
](CWL_AnalyzeLogData_Compare.md)
+ [

# 그래프로 로그 데이터 시각화
](CWL_Insights-Visualizing-Log-Data.md)

# CloudWatch Logs Insights 언어 쿼리 구문
<a name="CWL_QuerySyntax"></a>

 이 섹션에서는 Logs Insights QL에 대한 세부 정보를 제공합니다. 쿼리 구문은 일반 함수, 산술 및 비교 연산, 정규 표현식을 포함하되 이에 국한되지 않는 다양한 함수 및 연산을 지원합니다.

**중요**  
대규모 쿼리 실행으로 과도한 요금이 발생하는 것을 피하려면 다음 모범 사례를 명심하세요.  
각 쿼리에 필요한 로그 그룹만 선택합니다.
쿼리의 시간 범위는 항상 가능한 한 가장 좁게 지정합니다.
콘솔을 사용하여 쿼리를 실행하는 경우 CloudWatch Logs Insights 콘솔 페이지를 닫기 전에 모든 쿼리를 취소합니다. 그러지 않으면 쿼리가 완료될 때까지 계속 실행됩니다.
CloudWatch Logs Insights 위젯을 대시보드에 추가할 때는 새로 고침할 때마다 새 쿼리가 시작되므로 대시보드가 자주 새로 고쳐지지 않도록 해야 합니다.

여러 명령이 포함된 쿼리를 생성하려면 파이프 문자(**\$1**)로 명령을 구분합니다.

코멘트가 포함된 쿼리를 생성하려면 설명을 해시 문자(**\$1**)로 설정합니다.

**참고**  
 CloudWatch Logs Insights에서는 다양한 로그 유형의 필드를 자동으로 검색하고 **@** 문자로 시작하는 필드를 생성합니다. 이러한 필드에 대한 자세한 내용은 *Amazon CloudWatch 사용 설명서*의 [지원되는 로그 및 검색된 필드](https://docs.aws.amazon.com/en_us/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData-discoverable-fields.html)를 참조하세요.

다음 표에는 각 명령에 대한 간략한 설명이 나와 있습니다. 다음 표에는 예제와 함께 각 명령에 대한 보다 포괄적인 설명이 나와 있습니다.

**참고**  
모든 Log Insights QL 쿼리 명령은 Standard 로그 클래스의 로그 그룹에서 지원됩니다. Infrequent Access 로그 클래스의 로그 그룹은 `pattern`, `diff` 및 `unmask`을 제외한 모든 Log Insights QL 쿼리 명령을 지원합니다.


|  |  | 
| --- |--- |
| **` anomaly`**  | 기계 학습을 사용하여 로그 데이터의 비정상적인 패턴을 식별합니다. | 
| **` display`**  |  쿼리 결과에 하나 이상의 특정 필드를 표시합니다. | 
| **` fields`**  |  쿼리 결과에 특정 필드를 표시하고, 필드 값을 수정하고 쿼리에 사용할 새 필드를 생성하는 데 사용할 수 있는 함수와 연산을 지원합니다. | 
| **` filter`**  |  하나 이상의 조건과 일치하는 로그 이벤트만 반환하도록 쿼리를 필터링합니다. | 
| **` filterIndex`**  |  쿼리가 필드 인덱스에 언급된 필드에 인덱싱되고 해당 필드 인덱스에 대한 값도 포함하는 로그 그룹만 스캔하도록 강제합니다. 이렇게 하면이 필드 인덱스에 대한 쿼리에 지정된 값이 포함된 이러한 로그 그룹의 로그 이벤트만 스캔하려고 시도하여 스캔 볼륨이 줄어듭니다. 이 명령은 Infrequent Access 로그 클래스의 로그 그룹에는 지원되지 않습니다. | 
| **` pattern`**  | 로그 데이터를 패턴으로 자동 클러스터링합니다. 패턴은 로그 필드 간에 반복되는 공유 텍스트 구조입니다. CloudWatch Logs Insights는 로그 이벤트에서 발견된 패턴을 분석할 수 있는 방법을 제공합니다. 자세한 내용은 [패턴 분석](CWL_AnalyzeLogData_Patterns.md) 단원을 참조하십시오. | 
| **` diff`**  | 요청된 기간에서 발견된 로그 이벤트를 길이가 동일한 이전 기간의 로그 이벤트와 비교하여 추세를 찾고 특정 로그 이벤트가 새 이벤트인지 확인할 수 있습니다.  | 
| **` parse`**  |  로그 필드에서 데이터를 추출하여 쿼리에서 처리할 수 있는 추출된 필드를 생성합니다. **`parse`**는 와일드카드를 사용하는 글로브 모드와 정규 표현식을 모두 지원합니다. | 
| **` sort`**  | 반환된 로그 이벤트를 오름차순(`asc`) 또는 내림차순(`desc`)으로 표시합니다. | 
| **` SOURCE`**  | 쿼리에 `SOURCE`를 포함시키는 것은 쿼리에 포함할 로그 그룹 이름 접두사, 계정 식별자 및 로그 그룹 클래스를 기반으로 많은 양의 로그 그룹을 지정하는 유용한 방법입니다. 이 명령은 CloudWatch 콘솔이 아닌 AWS CLI 또는 프로그래밍 방식으로 쿼리를 생성하는 경우에만 지원됩니다. | 
| **` stats`**  |  로그 필드의 값을 사용하여 집계 통계를 계산합니다. | 
| **` limit`**  | 쿼리에서 반환할 최대 로그 이벤트의 수를 지정합니다. '상위 20개' 또는 '최근 20개' 결과를 반환하는 **`sort`**에 유용합니다. | 
| **` dedup`**  |  지정한 필드의 특정 값을 기준으로 중복 결과를 제거합니다. | 
| **` unmask`**  |  데이터 보호 정책으로 인해 일부 내용이 마스킹 처리된 로그 이벤트의 모든 내용을 표시합니다. 로그 그룹의 데이터 보호에 대한 자세한 내용은 [마스킹 처리를 통해 민감한 로그 데이터를 보호하도록 지원](mask-sensitive-log-data.md) 섹션을 참조하세요. | 
|   **`[unnest](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-Unnest.html)`**   |   입력으로 취해진 목록을 평면화하여 목록의 각 요소에 대해 단일 레코드로 여러 레코드를 생성합니다.  | 
| **` lookup`**  | 필드 값을 일치시켜 조회 테이블의 데이터로 로그 이벤트를 강화합니다. 조회 테이블을 사용하여 사용자 세부 정보, 애플리케이션 이름 또는 제품 정보와 같은 참조 데이터를 쿼리 결과에 추가합니다. | 
| ** [기타 연산 및 함수](CWL_QuerySyntax-operations-functions.md)**  | CloudWatch Logs Insights는 또한 많은 비교, 산술, 날짜/시간, 숫자, 문자열, IP 주소, 일반 함수 및 연산을 지원합니다. | 

다음 섹션에서는 CloudWatch Logs Insights 쿼리 명령에 대한 자세한 내용을 제공합니다.

**Topics**
+ [

# 로그 클래스에서 지원되는 Logs Insights QL 명령
](CWL_AnalyzeLogData_Classes.md)
+ [

# 이상
](CWL_QuerySyntax-Anomaly.md)
+ [

# **표시**
](CWL_QuerySyntax-Display.md)
+ [

# 필드
](CWL_QuerySyntax-Fields.md)
+ [

# 필터
](CWL_QuerySyntax-Filter.md)
+ [

# filterIndex
](CWL_QuerySyntax-FilterIndex.md)
+ [

# 소스
](CWL_QuerySyntax-Source.md)
+ [

# pattern
](CWL_QuerySyntax-Pattern.md)
+ [

# DIFF
](CWL_QuerySyntax-Diff.md)
+ [

# parse
](CWL_QuerySyntax-Parse.md)
+ [

# sort
](CWL_QuerySyntax-Sort.md)
+ [

# 통계
](CWL_QuerySyntax-Stats.md)
+ [

# limit
](CWL_QuerySyntax-Limit.md)
+ [

# dedup
](CWL_QuerySyntax-Dedup.md)
+ [

# unmask
](CWL_QuerySyntax-Unmask.md)
+ [

# unnest
](CWL_QuerySyntax-Unnest.md)
+ [

# lookup
](CWL_QuerySyntax-Lookup.md)
+ [

# 부울, 비교, 숫자, 날짜/시간 및 기타 함수
](CWL_QuerySyntax-operations-functions.md)
+ [

# 특수 문자가 포함된 필드
](CWL_QuerySyntax-Guidelines.md)
+ [

# 쿼리에 별칭 및 코멘트 사용
](CWL_QuerySyntax-alias.md)

# 로그 클래스에서 지원되는 Logs Insights QL 명령
<a name="CWL_AnalyzeLogData_Classes"></a>

모든 Log Insights QL 쿼리 명령은 Standard 로그 클래스의 로그 그룹에서 지원됩니다. Infrequent Access 로그 클래스의 로그 그룹은 `pattern`, `diff`. `filterIndex`, `unmask`를 제외한 모든 쿼리 명령을 지원합니다.

# 이상
<a name="CWL_QuerySyntax-Anomaly"></a>

 `anomaly`를 사용하면 기계 학습을 사용하여 로그 데이터 내 비정상적인 패턴과 잠재적 문제를 자동으로 식별할 수 있습니다.

이 `anomaly` 명령은 기존 `pattern` 기능을 확장하고 고급 분석을 활용하여 로그 데이터의 잠재적 이상을 식별하는 데 도움이 됩니다. `anomaly`를 사용하면 로그에서 비정상적인 패턴이나 동작을 자동으로 표시하여 연산 문제를 식별하고 해결하는 데 걸리는 시간을 줄일 수 있습니다.

`anomaly` 명령은 ` pattern` 명령과 작동하여 먼저 로그 패턴을 식별한 다음 해당 패턴 내에서 이상을 감지합니다. `anomaly`를 ` filter` 또는 ` sort` 명령과 결합하여 데이터의 특정 하위 집합에 이상 탐지를 집중할 수도 있습니다.

**이상 명령 입력**

 `anomaly` 명령은 일반적으로 ` pattern` 명령 다음에 로그 데이터에서 식별된 패턴을 분석하는 데 사용됩니다. 명령에는 추가 파라미터가 필요하지 않으며 쿼리에서 이전 명령의 출력을 분석합니다.

**식별된 이상 유형**

 `anomaly` 명령은 다음과 같은 5가지 유형의 이상을 식별합니다.
+ *패턴 빈도 이상*: 애플리케이션이 평소보다 더 많은 오류 메시지를 생성하기 시작하는 경우와 같이 특정 로그 패턴의 비정상적인 빈도.
+ *새 패턴 이상*: 로그에 나타나는 새 유형의 오류 또는 메시지를 나타낼 수 있는 이전에 보이지 않았던 로그 패턴입니다.
+ *토큰 변형 이상*: 예상 로그 형식의 비정상적인 변형을 나타낼 수 있는 로그 메시지 내용의 예기치 않은 변경 사항입니다.
+ *숫자 토큰 이상*: 잠재적 성능 문제 또는 예상치 못한 지표 변동을 감지하는 데 도움이 될 수 있는 로그 내 숫자 값의 비정상적인 변경입니다.
+ *HTTP 오류 코드 이상*: HTTP 오류 응답과 관련된 패턴으로, 웹 애플리케이션 및 API를 모니터링할 때 특히 유용합니다.

**이상 명령 출력**

 `anomaly` 명령은 입력 데이터의 모든 필드를 보존하고 이상 탐지 결과를 추가하여 로그 데이터에서 비정상적인 패턴을 식별하는 데 도움이 됩니다.

**예제**

다음 명령은 로그 데이터의 패턴을 식별한 다음 해당 패턴 내에서 이상을 감지합니다.

```
fields @timestamp, @message
| pattern @message
| anomaly
```

`anomaly` 명령을 필터링과 함께 사용하여 특정 로그 유형에 집중할 수 있습니다.

```
fields @timestamp, @message
| filter @type = "REPORT"
| pattern @message
| anomaly
```

`anomaly` 명령을 정렬과 결합하여 결과를 구성할 수 있습니다.

```
fields @timestamp, @message
| filter @type = "ERROR"
| pattern @message
| anomaly
| sort @timestamp desc
```

# **표시**
<a name="CWL_QuerySyntax-Display"></a>

 `display` 명령을 사용하여 쿼리 결과에 하나 또는 여러 개의 특정 필드를 표시할 수 있습니다.

 `display` 명령은 사용자가 지정한 필드만 표시합니다. 쿼리에 여러 `display` 명령이 포함된 경우 쿼리 결과는 마지막 `display` 명령에서 지정한 필드만 표시합니다.

 **예: 하나의 필드 표시** 

 아래 코드 조각은 parse 명령을 사용하여 `@message`에서 데이터를 추출하여 추출된 필드 `loggingType` 및 `loggingMessage`를 생성하는 쿼리의 예를 보여줍니다. 쿼리는 `loggingType`에 대한 값이 **ERROR**인 모든 로그 이벤트를 반환합니다. `display`은 쿼리 결과에서 `loggingMessage`에 대한 값만 표시합니다.

```
fields @message
| parse @message "[*] *" as loggingType, loggingMessage
| filter loggingType = "ERROR"
| display loggingMessage
```

**작은 정보**  
 쿼리에서 `display`를 한 번만 사용하세요. 쿼리에서 `display`를 두 번 이상 사용할 경우, 쿼리 결과에는 마지막으로 사용된 `display` 명령에서 지정한 필드만 표시됩니다.

# 필드
<a name="CWL_QuerySyntax-Fields"></a>

 `fields`를 사용하여 쿼리 결과에 특정 필드를 표시할 수 있습니다.

쿼리에 `fields` 명령이 여러 개 포함되어 있는데 `display` 명령은 포함되지 않은 경우 결과에 `fields` 명령에 지정된 모든 필드가 표시됩니다.

 **예: 특정 필드 표시** 

 다음 예제에서는 20개의 로그 이벤트를 반환하고 내림차순으로 표시하는 쿼리를 보여줍니다. 쿼리 결과에 `@timestamp` 및 `@message`에 대한 값이 표시됩니다.

```
fields @timestamp, @message
| sort @timestamp desc
| limit 20
```

필드 값을 수정하고 쿼리에 사용할 수 있는 새 필드를 생성하기 위해 `fields`에서 지원하는 다양한 함수와 연산을 사용하려는 경우 `display` 대신 `fields`를 사용하세요.

*as* 키워드와 함께 `fields` 명령을 사용하면 로그 이벤트에 있는 필드 및 함수를 사용하는 추출된 필드를 생성할 수 있습니다. 예를 들어, `fields ispresent as isRes`은 이름이 `isRes`인 추출된 필드를 생성하며, 쿼리의 나머지 부분에서 추출된 필드를 사용할 수 있습니다.

# 필터
<a name="CWL_QuerySyntax-Filter"></a>

 `filter` 명령을 사용하여 하나 이상의 조건과 일치하는 로그 이벤트를 가져올 수 있습니다.

 **예: 하나의 조건을 사용한 로그 이벤트 필터링** 

 아래 코드 조각은 `range`에 대한 값이 ***3000***보다 큰 모든 로그 이벤트를 반환하는 쿼리의 예를 보여줍니다. 쿼리는 결과를 20개의 로그 이벤트로 제한하며, 로그 이벤트를 내림차순의 `@timestamp`로 정렬합니다.

```
fields @timestamp, @message
| filter (range>3000)
| sort @timestamp desc
| limit 20
```

 **예: 둘 이상의 조건을 사용한 로그 이벤트 필터링** 

 키워드 `and` 및 `or`을 사용하여 둘 이상의 조건을 결합할 수 있습니다.

 아래 코드 조각은 `range`에 대한 값이 ***3000***보다 크고 `accountId`에 대한 값이 ***123456789012***와 동일한 로그 이벤트를 반환하는 쿼리의 예를 보여줍니다. 쿼리는 결과를 20개의 로그 이벤트로 제한하며, 로그 이벤트를 내림차순의 `@timestamp`로 정렬합니다.

```
fields @timestamp, @message
| filter (range>3000 and accountId=123456789012)
| sort @timestamp desc
| limit 20
```

## 인덱싱된 필드 및 필터 명령
<a name="CWL_QuerySyntax-index"></a>

로그 그룹에 대한 필드 인덱스를 생성한 경우 해당 필드 인덱스를 활용하여 `filter` 쿼리를 더 효율적으로 만들고 스캔 볼륨을 줄일 수 있습니다. 예를 들어, `requestId`에 대한 필드 인덱스를 생성했다고 가정해 보겠습니다. 그런 다음 인덱싱된 필드를 포함하지 않는 것으로 알려진 로그 이벤트 처리를 건너뛰`filter requestId = value`거나 건너뛰`filter requestId IN [value, value, ...]`려고 시도하는 해당 로그 그룹에 대한 CloudWatch Logs Insights 쿼리입니다. 인덱싱된 필드를 포함하는 것으로 알려진 로그 이벤트만 스캔하려고 하면 스캔 볼륨을 줄일 수 있으며 쿼리 속도가 빨라집니다.

필드 인덱스와 필드 인덱스 생성 방법에 대한 자세한 내용은 [쿼리 성능을 개선하고 스캔 볼륨을 줄이기 위한 필드 인덱스 생성](CloudWatchLogs-Field-Indexing.md) 섹션을 참조하세요.

**중요**  
`filter fieldName =...` 및 `filter fieldName IN...`을 사용하는 쿼리만 필드 인덱스 개선의 이점을 누릴 수 있습니다. `filter fieldName like`을 사용하는 쿼리는 인덱스를 사용하지 않으며 항상 선택한 로그 그룹의 모든 로그 이벤트를 스캔합니다.

**예: 인덱스를 사용하여 특정 요청 ID와 관련된 로그 이벤트 찾기** 

 이 예제에서는 `requestId`에서 필드 인덱스를 생성했다고 가정합니다. 이 필드 인덱스를 사용하는 로그 그룹의 경우 쿼리는 필드 인덱스를 활용하여 최소한의 로그 이벤트를 스캔하여 값이 `123456`인 `requestId`이 있는 이벤트를 찾으려고 시도합니다.

```
fields @timestamp, @message
| filter requestId = "1234656"
| limit 20
```

## 필터 명령의 일치 항목 및 정규식
<a name="CWL_QuerySyntax-regex"></a>

필터 명령은 정규 표현식 사용을 지원합니다. 비교 연산자(`=`, `!=`, `<`, `<=`, `>`, `>=`) 및 부울 연산자(`and`, `or`, `not`)를 사용할 수 있습니다.

`in` 키워드를 사용하여 설정된 멤버십을 테스트하고 배열의 요소를 확인할 수 있습니다. 배열에서 요소를 확인하려면 `in` 뒤에 해당 배열을 넣습니다. `in`과 함께 부울 연산자 `not`을 사용할 수 있습니다. `in`을 사용하여 필드가 문자열과 일치하는 로그 이벤트를 반환하는 쿼리를 생성할 수 있습니다. 필드는 완전한 문자열이어야 합니다. 예를 들어, 다음 코드 조각은 `in`을 사용하여 `logGroup` 필드가 완전한 문자열 `example_group`인 로그 이벤트를 반환하는 쿼리를 보여줍니다.

```
fields @timestamp, @message
| filter logGroup in ["example_group"]
```

키워드 구문 `like` 및 `not like`를 사용하여 하위 문자열을 일치시킬 수 있습니다. 정규 표현식 연산자 `=~`를 사용하여 하위 문자열을 일치시킬 수 있습니다. `like` 및 `not like`로 하위 문자열을 일치시키려면, 일치해야 하는 하위 문자열을 큰따옴표 또는 작은따옴표로 둘러쌉니다. `like` 및 `not like`와 함께 정규식 패턴을 사용할 수 있습니다. 하위 문자열을 정규식 연산자와 일치시키려면 원하는 하위 문자열을 슬래시로 둘러쌉니다. 다음 예제에는 `filter` 명령을 사용하여 하위 문자열을 일치시키는 방법을 보여주는 코드 조각이 포함되어 있습니다.

**예: 하위 문자열 일치**

 다음 예제에서는 `f1`에 단어 ***Exception***이 포함된 모든 이벤트를 반환합니다. 세 예제 모두 대/소문자를 구별합니다.

첫 번째 예제에서는 `like`를 사용하여 하위 문자열과 일치시킵니다.

```
fields f1, f2, f3 
| filter f1 like "Exception"
```

 두 번째 예제에서는 `like` 및 정규 표현식 패턴을 사용하여 하위 문자열을 일치시킵니다.

```
fields f1, f2, f3 
| filter f1 like /Exception/
```

 세 번째 예제에서는 정규 표현식을 사용하여 하위 문자열을 일치시킵니다.

```
fields f1, f2, f3 
| filter f1 =~ /Exception/
```

**예: 와일드카드를 사용하여 하위 문자열 일치**

 정규 표현식에서 마침표 기호(`.`)를 와일드카드로 사용하여 하위 문자열을 일치시킬 수 있습니다. 다음 예에서 쿼리는 `f1`에 대한 값이 `ServiceLog` 문자열로 시작하는 일치 항목을 반환합니다.

```
fields f1, f2, f3
| filter f1 like /ServiceLog./
```

 마침표 기호(`.*`) 뒤에 별표 기호를 배치하여 가능한 한 많은 일치 항목을 반환하는 탐욕적 수량자(Greedy Quantifier)를 생성할 수 있습니다. 예를 들어, 다음 쿼리는 `f1` 값이 `ServiceLog` 문자열로 시작할 뿐만 아니라 `ServiceLog` 문자열도 포함하는 일치 항목을 반환합니다.

```
fields f1, f2, f3
| filter f1 like /ServiceLog.*/
```

 가능한 일치 항목은 다음과 같습니다.
+  `ServiceLogSampleApiLogGroup` 
+  `SampleApiLogGroupServiceLog` 

**예제: 일치 항목에서 하위 문자열 제외**

다음 예제에서는 `f1`에 단어 ***Exception***이 포함되지 않은 모든 로그 이벤트를 반환하는 쿼리를 보여줍니다. 이 예제에서는 대/소문자를 구분합니다.

```
fields f1, f2, f3 
| filter f1 not like "Exception"
```

**예제: 대/소문자를 구분하지 않는 패턴으로 하위 문자열 일치**

대/소문자를 구분하지 않는 하위 문자열을 `like` 및 정규 표현식을 사용하여 일치시킬 수 있습니다. 일치시키려는 하위 문자열 앞에 다음 파라미터(**?i**)를 입력합니다. 다음 예제에서는 `f1`에 단어 ***Exception*** 또는 ***exception***이 포함된 모든 로그 이벤트를 반환하는 쿼리를 보여줍니다.

```
fields f1, f2, f3 
| filter f1 like /(?i)Exception/
```

# filterIndex
<a name="CWL_QuerySyntax-FilterIndex"></a>

 `filterIndex`를 사용하여 쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 강제하여 인덱스된 데이터만 반환합니다. 해당 필드에 인덱싱된 이러한 로그 그룹의 경우, 인덱싱된 필드의 쿼리에 지정된 필드가 포함된 로그 이벤트가 없는 로그 그룹을 건너뛰어 쿼리를 추가로 최적화합니다. 또한 해당 필드 인덱스의 쿼리에 지정된 값과 일치하는 이러한 로그 그룹의 로그 이벤트만 스캔하려고 시도하여 스캔 볼륨을 줄입니다. 필드 인덱스와 필드 인덱스 생성 방법에 대한 자세한 내용은 [쿼리 성능을 개선하고 스캔 볼륨을 줄이기 위한 필드 인덱스 생성](CloudWatchLogs-Field-Indexing.md) 섹션을 참조하세요.

인덱싱된 필드와 `filterIndex`를 사용하면 실제 검색 공간을 필드 인덱스가 있는 로그 그룹 및 로그 이벤트로 제한하여 페타바이트의 로그 데이터가 포함된 로그 그룹을 효율적으로 쿼리할 수 있습니다.

예를 들어, 계정의 일부 로그 그룹에서 `IPaddress`에 대한 필드 인덱스를 생성했다고 가정해 보겠습니다. 그런 다음 아래 쿼리를 생성하고 계정의 모든 로그 그룹을 쿼리하여 `IPaddress` 필드에 `198.51.100.0` 값이 포함된 로그 이벤트를 찾도록 선택할 수 있습니다.

```
fields @timestamp, @message
| filterIndex IPaddress = "198.51.100.0"
| limit 20
```

`filterIndex` 명령을 실행하면 이 쿼리가 `IPaddress`에 대해 인덱싱되지 않은 모든 로그 그룹을 건너뛰려고 시도합니다. 또한 인덱싱된 로그 그룹 내에서 쿼리는 `IPaddress` 필드가 있지만 해당 필드의 값으로 관찰된 `198.51.100.0`은 없는 로그 이벤트를 건너뜁니다.

`IN` 연산자를 사용하여 인덱싱된 필드의 여러 값 중 하나로 결과를 확장합니다. 다음 예제는 `IPaddress` 필드에 값 `198.51.100.0` 또는 `198.51.100.1`을 포함하는 로그 이벤트를 찾습니다.

```
fields @timestamp, @message 
| filterIndex IPaddress in ["198.51.100.0", "198.51.100.1"]
| limit 20
```

CloudWatch Logs는 Standard 로그 클래스의 모든 로그 그룹에 대한 기본 필드 인덱스를 제공합니다. 기본 필드 인덱스는 다음 필드에 자동으로 사용할 수 있습니다.
+ `@logStream`
+ `@aws.region`
+ `@aws.account`
+ `@source.log`
+ `@data_source_name`
+ `@data_source_type`
+ `@data_format`
+ `traceId`
+ `severityText`
+ `attributes.session.id`

CloudWatch Logs는 특정 데이터 소스 이름 및 유형 조합에 대한 기본 필드 인덱스도 제공합니다. 기본 필드 인덱스는 다음 데이터 소스 이름 및 유형 조합에 자동으로 사용할 수 있습니다.


| 데이터 소스 이름 및 유형 | 기본 필드 인덱스 | 
| --- | --- | 
|  `amazon_vpc.flow`  |  `action` `logStatus` `region` `flowDirection` `type`  | 
|  `amazon_route53.resolver_query`  |  `query_type` `transport` `rcode`  | 
|  `aws_waf.access`  |  `action` `httpRequest.country`  | 
|  `aws_cloudtrail.data` ` aws_cloudtrail.management`  |  `eventSource` `eventName` `awsRegion` `userAgent` `errorCode` `eventType` `managementEvent` `readOnly` `eventCategory` `requestId`  | 

기본 필드 인덱스는 정책 내에서 정의하는 사용자 지정 필드 인덱스에 추가됩니다. 기본 필드 인덱스는 [필드 인덱스 할당량](CloudWatchLogs-Field-Indexing-Syntax.md)에 포함되지 않습니다.

## filterIndex와 filter 비교
<a name="CWL_QuerySyntax-FilterIndex-Filter"></a>

`filterIndex` 및 `filter`의 차이를 이해하려면 다음 예제 쿼리를 고려합니다. 로그 그룹 4개에 대해 `IPaddress`에 대한 필드 인덱스를 생성했지만 다섯 번째 로그 그룹에 대해서는 생성하지 않았다고 가정합니다. `filterIndex`를 사용하는 다음 쿼리는 필드가 인덱싱되지 않은 로그 그룹의 스캔을 건너뜁니다. 각 인덱싱된 로그 그룹에 대해 인덱싱된 필드가 있는 로그 이벤트만 스캔하려고 시도하고 필드 인덱스가 생성된 후의 결과만 반환합니다.

```
fields @timestamp, @message 
| filterIndex IPaddress = "198.51.100.0" 
| limit 20
```

반대로 동일한 5개 로그 그룹의 쿼리에 `filterIndex` 대신 `filter`를 사용하는 경우 쿼리는 인덱싱된 로그 그룹의 값을 포함하는 로그 이벤트뿐만 아니라 인덱싱되지 않은 다섯 번째 로그 그룹도 스캔하려고 시도하고 해당 다섯 번째 로그 그룹의 모든 로그 이벤트를 스캔합니다.

```
fields @timestamp, @message 
| filter IPaddress = "198.51.100.0" 
| limit 20
```

# 소스
<a name="CWL_QuerySyntax-Source"></a>

쿼리`SOURCE`에를 포함시키는 것은 AWS CLI 또는 API를 사용하여 쿼리를 생성할 때 쿼리에 포함할 로그 그룹 및/또는 데이터 소스를 지정하는 유용한 방법입니다. `SOURCE` 명령은 CloudWatch 콘솔이 아닌 AWS CLI 및 API에서만 지원됩니다. CloudWatch 콘솔을 사용하여 쿼리를 시작할 때는 콘솔 인터페이스를 사용하여 로그 그룹을 지정합니다.

쿼리 로그 그룹

`SOURCE`를 사용하여 쿼리할 로그 그룹을 지정하려면 다음 키워드를 사용할 수 있습니다.
+ `namePrefix`는 지정한 문자열로 시작하는 이름이 있는 로그 그룹에 대해 쿼리를 실행합니다. 이를 생략하면 모든 로그 그룹이 쿼리됩니다.

  목록에 최대 5개의 접두사를 포함할 수 있습니다.
+ `accountIdentifier`는 지정된 AWS 계정의 로그 그룹에 대해 쿼리를 실행합니다. 이는 모니터링 계정에서 쿼리를 실행하는 경우에만 작동합니다. 이를 생략하면 연결된 모든 소스 계정과 현재 모니터링 계정을 쿼리하는 것이 기본값입니다. 교차 계정 관찰성에 대한 자세한 내용은 [CloudWatch 크로스 계정 관측성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Unified-Cross-Account.html)을 참조하세요.

  목록에 최대 20개의 계정 식별자를 포함할 수 있습니다.
+ `logGroupClass`는 지정된 로그 클래스인 Standard 또는 Infrequent Access에 있는 로그 그룹에 대해 쿼리를 실행합니다. 이를 생략하면 기본적으로 Standard 로그 클래스가 사용됩니다. 로그 클래스에 대한 자세한 내용은 [로그 클래스](CloudWatch_Logs_Log_Classes.md)을 참조하세요.

이러한 방식으로 쿼리할 많은 수의 로그 그룹을 지정할 수 있으므로 생성한 필드 인덱스를 활용하는 쿼리에만 `SOURCE`를 사용하는 것이 좋습니다. 로그 그룹에서의 필드 인덱싱에 대한 자세한 내용은 [쿼리 성능을 개선하고 스캔 볼륨을 줄이기 위한 필드 인덱스 생성](CloudWatchLogs-Field-Indexing.md) 섹션을 참조하세요.

다음 예제에서는 계정의 모든 로그 그룹을 선택합니다. 모니터링 계정인 경우 모니터링 및 모든 소스 계정의 로그 그룹이 선택됩니다. 총 로그 그룹의 수가 10,000개를 초과하면 다른 로그 그룹 선택 방법을 사용하여 로그 그룹의 수를 줄이라는 오류가 표시됩니다.

```
SOURCE logGroups()
```

다음 예제에서는 `111122223333` 소스 계정의 로그 그룹을 선택합니다. CloudWatch 크로스 계정 관측성에서 모니터링 계정에서 쿼리를 시작하면 모든 소스 계정과 모니터링 계정의 로그 그룹이 기본적으로 선택됩니다.

```
SOURCE logGroups(accountIdentifiers:['111122223333'])
```

다음 예제에서는 이름 접두사를 기반으로 로그 그룹을 선택합니다.

```
SOURCE logGroups(namePrefix: ['namePrefix1', 'namePrefix2'])
```

다음 예제에서는 Infrequent Access 로그 클래스의 모든 로그 그룹을 선택합니다. `class` 식별자를 포함하지 않으면 쿼리는 기본값인 Standard 로그 클래스의 로그 그룹에만 적용됩니다.

```
SOURCE logGroups(class: ['INFREQUENT_ACCESS'])
```

다음 예제에서는 특정 이름 접두사로 시작하고 Standard 로그 클래스에 있는 111122223333 계정의 로그 그룹을 선택합니다. Standard가 기본 로그 클래스 값이므로 명령에 클래스가 언급되지 않습니다.

```
SOURCE logGroups(accountIdentifiers:['111122223333'], namePrefix: ['namePrefix1', 'namePrefix2']
```

마지막 예제에서는 `SOURCE` 명령과 함께 `start-query` AWS CLI 명령을 사용하는 방법을 보여줍니다.

```
aws logs start-query 
--region us-east-1 
--start-time 1729728200 
--end-time 1729728215 
--query-string "SOURCE logGroups(namePrefix: ['Query']) | fields @message | limit 5"
```

데이터 소스 쿼리

`SOURCE`를 사용하여 쿼리할 데이터 소스를 지정하려면 `dataSource` 키워드를 사용할 수 있습니다. 목록에 최대 10개의 데이터 소스를 포함할 수 있습니다.

 다음 예제에서는 `amazon_vpc.flow` 데이터 소스를 선택합니다.

```
SOURCE dataSource(['amazon_vpc.flow'])
```

 다음 예제에서는 `amazon_vpc.flow` 데이터 소스를 선택하고 로그 그룹 이름 접두사를 기반으로 로그 그룹을 제한합니다.

```
SOURCE dataSource(['amazon_vpc.flow']) logGroups(namePrefix: ['namePrefix1'])
```

# pattern
<a name="CWL_QuerySyntax-Pattern"></a>

 `pattern`을 사용하여 로그 데이터를 패턴으로 자동 클러스터링합니다.

패턴은 로그 필드 간에 반복되는 공유 텍스트 구조입니다. `pattern`을 사용하여 새로운 추세를 파악하고, 알려진 오류를 모니터링하고, 자주 발생하거나 비용이 많이 드는 로그 라인을 식별할 수 있습니다. CloudWatch Logs Insights는 로그 이벤트의 패턴을 찾고 추가로 분석하는 데 사용할 수 있는 콘솔 환경도 제공합니다. 자세한 내용은 [패턴 분석](CWL_AnalyzeLogData_Patterns.md) 단원을 참조하십시오.

`pattern` 명령은 공통 패턴을 자동으로 식별하므로 로그를 검색하고 분석하기 위한 시작점으로 사용할 수 있습니다. `pattern`을 ` filter`, ` parse` 또는 ` sort` 명령과 결합하여 더 세밀하게 조정된 쿼리에서 패턴을 식별할 수도 있습니다.

**패턴 명령 입력**

 `pattern` 명령에는 `@message` 필드, ` parse` 명령을 사용하여 생성한 추출된 필드 또는 하나 이상의 [문자열 함수](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-operations-functions.html#CWL_QuerySyntax-string-functions)를 사용하여 조작된 문자열과 같은 입력이 필요합니다.

CloudWatch Logs는 동적 토큰이 나타내는 데이터 유형을 추론할 수 없는 경우 해당 데이터를 <Token-*number*>로 표시하며, *number*는 패턴에서 이 토큰이 나타나는 위치를 다른 동적 토큰과 비교하여 나타냅니다.

동적 토큰의 일반적인 예로는 오류 코드, IP 주소, 타임스탬프, 요청 ID가 있습니다.

**패턴 명령 출력**

 `pattern` 명령으로 다음 출력이 생성됩니다.
+ `@pattern`: 로그 이벤트 필드 간에 반복되는 공유 텍스트 구조. 요청 ID 또는 타임스탬프와 같이 패턴 내에서 서로 다른 필드는 *토큰*으로 표시됩니다. CloudWatch Logs는 동적 토큰이 나타내는 데이터 유형을 확인할 수 있는 경우 토큰을 `<string-number>`으로 표시합니다. *string*은 토큰이 나타내는 데이터 유형에 대한 설명입니다. *number*는 다른 동적 토큰과 비교하여 패턴에서 이 토큰이 나타나는 위치를 보여줍니다.

  CloudWatch Logs는 문자열을 포함하는 로그 이벤트의 콘텐츠 분석을 기반으로 이름의 문자열 부분을 할당합니다.

  CloudWatch Logs는 동적 토큰이 나타내는 데이터 유형을 추론할 수 없는 경우 해당 데이터를 <Token-*number*>로 표시하며, *number*는 패턴에서 이 토큰이 나타나는 위치를 다른 동적 토큰과 비교하여 나타냅니다.

  예를 들어, `[INFO] Request time: <Time-1> ms`은 로그 메시지 `[INFO] Request time: 327 ms`의 잠재적 출력입니다.
+ `@ratio`: 선택한 기간 및 식별된 패턴과 일치하는 지정된 로그 그룹의 로그 이벤트 비율입니다. 예를 들어 선택한 로그 그룹 및 기간에 있는 로그 이벤트의 절반이 패턴과 일치할 경우 `@ratio`는 `0.50`을 반환합니다.
+ `@sampleCount`: 선택한 기간 및 식별된 패턴과 일치하는 지정된 로그 그룹의 로그 이벤트의 수입니다.
+ `@severityLabel`: 로그에 포함된 정보의 유형을 나타내는 로그 심각도 또는 수준입니다. 예: `Error`, `Warning`, `Info` 또는 `Debug`.

**예제**

다음 명령은 선택한 시간 범위 동안 지정된 로그 그룹에서 구조가 비슷한 로그를 식별하여 패턴 및 개수별로 그룹화합니다.

```
pattern @message
```

`pattern` 명령은 ` filter` 명령과 함께 사용할 수 있습니다.

```
filter @message like /ERROR/
| pattern @message
```

`pattern` 명령은 ` parse` 및 ` sort` 명령과 함께 사용할 수 있습니다.

```
filter @message like /ERROR/
| parse @message 'Failed to do: *' as cause
| pattern cause
| sort @sampleCount asc
```

# DIFF
<a name="CWL_QuerySyntax-Diff"></a>

요청한 기간에서 발견된 로그 이벤트를 길이가 동일한 이전 기간의 로그 이벤트와 비교합니다. 이렇게 하면 추세를 찾고 특정 로그 이벤트가 새로운지 여부를 확인할 수 있습니다.

`diff` 명령에 한정자를 추가하여 비교할 기간을 지정합니다.
+ `diff`는 현재 선택된 시간 범위의 로그 이벤트를 바로 이전 시간 범위의 로그 이벤트와 비교합니다.
+ `diff previousDay`는 현재 선택된 시간 범위의 로그 이벤트를 전날 같은 시간의 로그 이벤트와 비교합니다.
+ `diff previousWeek`는 현재 선택된 시간 범위의 로그 이벤트를 이전 주의 같은 시간의 로그 이벤트와 비교합니다.
+ `diff previousMonth`는 현재 선택된 시간 범위의 로그 이벤트를 전월의 같은 시간의 로그 이벤트와 비교합니다.

자세한 내용은 [(diff)를 이전 시간 범위와 비교](CWL_AnalyzeLogData_Compare.md) 단원을 참조하십시오.

# parse
<a name="CWL_QuerySyntax-Parse"></a>

 `parse`를 사용하여 로그 필드에서 데이터를 추출하고 쿼리에서 처리할 수 있는 추출된 필드를 생성합니다. **`parse`**는 와일드카드를 사용하는 글로브 모드와 정규 표현식을 모두 지원합니다. 정규 표현식 구문에 대한 자세한 내용은 [지원되는 정규식 구문](FilterAndPatternSyntax.md#regex-expressions) 섹션을 참조하세요.

 정규 표현식을 사용하여 중첩된 JSON 필드를 구문 분석할 수 있습니다.

**예: 중첩된 JSON 필드 구문 분석**

 아래 코드 조각은 수집 중에 평면화된 JSON 로그 이벤트를 구문 분석하는 방법을 보여줍니다.

```
{'fieldsA': 'logs', 'fieldsB': [{'fA': 'a1'}, {'fA': 'a2'}]}
```

 아래 코드 조각은 추출된 필드 `fld` 및 `array`를 생성하기 위해 `fieldsA` 및 `fieldsB`에 대한 값을 추출하는 정규식이 포함된 쿼리를 보여줍니다.

```
parse @message "'fieldsA': '*', 'fieldsB': ['*']" as fld, array
```

**이름이 지정된 캡처 그룹**

정규식과 **`parse`**를 함께 사용하는 경우 이름이 지정된 캡처 그룹을 사용하여 패턴을 필드에 캡처할 수 있습니다. 구문은 `parse @message (?<Name>pattern)`입니다.

다음 예제에서는 VPC 흐름 로그의 캡처 그룹을 사용하여 `NetworkInterface`라는 이름의 필드에 ENI를 추출합니다.

```
parse @message /(?<NetworkInterface>eni-.*?) / | display NetworkInterface, @message
```

**참고**  
 JSON 로그 이벤트는 수집 중에 평면화됩니다. 현재 glob 표현식을 사용한 중첩 JSON 필드 구문 분석은 지원되지 않습니다. 200개 이하의 로그 이벤트 필드를 포함하는 JSON 로그 이벤트만 구문 분석할 수 있습니다. 중첩된 JSON 필드를 구문 분석할 때 JSON 로그 이벤트의 형식과 일치하도록 쿼리의 정규식 형식을 지정해야 합니다.

## 구문 분석 명령의 예제
<a name="CWL_QuerySyntax-parse-examples"></a>

**glob 표현식을 사용하여 로그 필드 `@message`에서 필드 `@user`, `@method` 및 `@latency`를 추출하고 `@method` 및 `@user`의 고유한 개별 조합에 대한 평균 지연 시간을 반환합니다.**

```
parse @message "user=*, method:*, latency := *" as @user,
    @method, @latency | stats avg(@latency) by @method,
    @user
```

**정규식을 사용하여 로그 필드 `@message`에서 필드 `@user2`, `@method2` 및 `@latency2`를 추출하고 `@method2` 및 `@user2`의 고유한 개별 조합에 대한 평균 지연 시간을 반환합니다.**

```
parse @message /user=(?<user2>.*?), method:(?<method2>.*?),
    latency := (?<latency2>.*?)/ | stats avg(latency2) by @method2, 
    @user2
```

**`loggingTime`, `loggingType` 및 `loggingMessage` 필드를 추출하고 `ERROR` 또는 `INFO` 문자열이 포함된 이벤트를 기록하도록 필터링한 다음 `ERROR` 문자열이 포함된 이벤트에 대해 `loggingMessage` 및 `loggingType` 필드만 표시합니다.**

```
FIELDS @message
    | PARSE @message "* [*] *" as loggingTime, loggingType, loggingMessage
    | FILTER loggingType IN ["ERROR", "INFO"]
    | DISPLAY loggingMessage, loggingType = "ERROR" as isError
```

# sort
<a name="CWL_QuerySyntax-Sort"></a>

 `sort`를 사용하여 지정된 필드에 로그 이벤트를 오름차순(`asc`) 또는 내림차순(`desc`)으로 표시합니다. 이를 `limit` 명령과 함께 사용하여 '상위 N개' 또는 '하위 N개' 쿼리를 생성할 수 있습니다.

이 정렬 알고리즘은 자연 정렬의 업데이트된 버전입니다. 오름차순으로 정렬하면 다음 로직이 사용됩니다.
+  숫자가 아닌 모든 값은 모든 숫자 값 앞에 옵니다. *숫자 값*은 숫자와 다른 문자의 혼합이 아니라 숫자만 포함하는 값입니다.
+ 숫자가 아닌 값의 경우 알고리즘은 비교를 위해 연속된 숫자와 연속된 영문자를 별도의 청크로 그룹화합니다. 알고리즘은 숫자가 아닌 부분을 유니코드 값으로 정렬하고 숫자 부분은 먼저 길이로 정렬한 다음 숫자 값으로 정렬합니다.

유니코드 순서에 대한 자세한 내용은 [유니코드 문자 목록](https://en.wikipedia.org/wiki/List_of_Unicode_characters)을 참조하세요.

예를 들어, 다음은 오름차순 정렬 결과입니다.

```
!:	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> sorted by unicode order
#
*%04
0#	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Alphanumeric starting with numbers
5A
111A   >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>  Starts with more digits than 5A, so it sorted to be later than 5A
2345_
@	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 2345 is compared with @ in the unicode order, 
@_
A	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Values starting with letters
A9876fghj
a12345hfh
0	>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Number values
01
1
2
3
```

내림차순으로 정렬하면 정렬 결과가 반대가 됩니다.

예를 들어, Amazon VPC 흐름 로그에 대한 다음 쿼리는 호스트 전반의 상위 15개 패킷 전송을 찾습니다.

```
stats sum(packets) as packetsTransferred by srcAddr, dstAddr
    | sort packetsTransferred  desc
    | limit 15
```

# 통계
<a name="CWL_QuerySyntax-Stats"></a>

 `stats`를 사용하여 막대형 차트, 꺾은선형 차트, 누적 영역 차트와 같은 로그 데이터의 시각화를 생성합니다. 이를 통해 로그 데이터에서 패턴을 더 효율적으로 식별할 수 있습니다. CloudWatch Logs Insights는 `stats` 함수와 집계 함수를 하나 이상 사용하는 쿼리에 대한 시각화를 생성합니다.

예를 들어, Route 53 로그 그룹의 다음 쿼리는 시간당 Route 53 레코드의 분포를 쿼리 유형별로 보여주는 시각화를 반환합니다.

```
stats count(*) by queryType, bin(1h)
```

이러한 쿼리는 모두 막대 차트를 생성할 수 있습니다. 쿼리가 `bin()` 함수를 사용하여 필드별로 데이터를 그룹화하는 경우 선형 차트 및 누적 영역 차트도 볼 수 있습니다.

`bin` 함수에서는 다음과 같은 시간 단위 및 약어가 지원됩니다. 둘 이상의 문자를 포함하는 모든 단위 및 약어의 경우 s를 추가하여 복수화할 수 있습니다. 따라서 `hr` 및 `hrs` 모두 시간을 지정하는 데 사용됩니다.
+ `millisecond` `ms` `msec`
+ `second` `s` `sec`
+ `minute` `m` `min`
+ `hour` `h` `hr`
+ `day` `d` 
+ `week` `w` 
+ `month` `mo` `mon`
+ `quarter` `q` `qtr`
+ `year` `y` `yr`

**Topics**
+ [

## 시계열 데이터 시각화
](#CWL_Insights-Visualizing-TimeSeries)
+ [

## 필드별로 그룹화된 로그 데이터 시각화
](#CWL_Insights-Visualizing-ByFields)
+ [

## 단일 쿼리에서 여러 통계 명령 사용
](#CWL_QuerySyntax-stats-multi)
+ [

## 통계와 함께 사용할 함수
](#CWL_QuerySyntax-stats-functions)

## 시계열 데이터 시각화
<a name="CWL_Insights-Visualizing-TimeSeries"></a>

시계열 시각화는 다음과 같은 특성을 가진 쿼리에 사용할 수 있습니다.
+ 쿼리에 집계 함수가 하나 이상 포함되어 있습니다. 자세한 정보는 [Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions) 섹션을 참조하세요.
+ 쿼리가 `bin()` 함수를 사용하여 필드 하나를 기준으로 데이터를 그룹화합니다.

이러한 쿼리는 선형 차트, 누적 영역 차트, 막대 차트 및 파이 차트를 생성할 수 있습니다.

**예제**

전체 자습서는 [자습서: 시계열 시각화를 생성하는 쿼리 실행](CWL_AnalyzeLogData_VisualizationQuery.md) 섹션을 참조하세요.

다음은 시계열 시각화에 사용할 수 있는 예제 쿼리입니다.

다음 쿼리는 5분마다 생성된 데이터 포인트와 함께 `myfield1` 필드의 평균 값에 대한 시각화를 생성합니다. 각 데이터 포인트는 이전 5분 동안 생성된 로그의 `myfield1` 값 평균을 집계한 것입니다.

```
stats avg(myfield1) by bin(5m)
```

다음 쿼리는 5분마다 생성된 데이터 포인트와 함께 여러 필드를 기준으로 세 값의 시각화를 생성합니다. 쿼리가 집계 함수를 포함하고 있고 그룹화 필드로 `bin()`을 사용하기 때문에 시각화가 생성됩니다.

```
stats avg(myfield1), min(myfield2), max(myfield3) by bin(5m)
```

**선형 차트 및 누적 영역 차트 제한 사항**

로그 항목 정보를 집계하지만 `bin()` 함수를 사용하지 않는 쿼리는 막대 차트를 생성할 수 있습니다. 그러나 이러한 쿼리는 선형 차트 또는 누적 영역 차트를 생성할 수 없습니다. 이러한 쿼리 유형에 대한 자세한 내용은 [필드별로 그룹화된 로그 데이터 시각화](#CWL_Insights-Visualizing-ByFields)을 참조하세요.

## 필드별로 그룹화된 로그 데이터 시각화
<a name="CWL_Insights-Visualizing-ByFields"></a>

`stats` 함수와 하나 이상의 집계 함수를 사용하는 쿼리에 대해 막대 차트를 생성할 수 있습니다. 자세한 정보는 [Aggregation Functions in the Stats Command](#CWL_Insights_Aggregation_Functions) 섹션을 참조하세요.

시각화를 보려면 쿼리를 실행합니다. 그런 다음 **시각화** 탭을 선택하고 **줄** 옆의 화살표를 선택한 다음, **막대**를 선택합니다. 막대 차트에서는 시각화가 최대 100개 막대로 제한됩니다.

**예제**

전체 자습서는 [자습서: 로그 필드로 그룹화된 시각화를 생성하는 쿼리 실행](CWL_AnalyzeLogData_VisualizationFieldQuery.md) 섹션을 참조하세요. 다음 단락에는 필드별 시각화에 대한 더 많은 예제 쿼리가 포함되어 있습니다.

다음 VPC 흐름 로그 쿼리는 각 대상 주소에 대해 세션당 전송된 평균 바이트의 수를 찾습니다.

```
stats avg(bytes) by dstAddr
```

각 결과 값에 대해 둘 이상의 막대가 포함된 차트를 생성할 수도 있습니다. 예를 들어, 다음 VPC 흐름 로그 쿼리는 각 대상 주소에 대해 세션당 전송된 평균 및 최대 바이트의 수를 찾습니다.

```
stats avg(bytes), max(bytes) by dstAddr
```

다음 쿼리는 각 쿼리 유형에 대해 Amazon Route 53 쿼리 로그의 수를 찾습니다.

```
stats count(*) by queryType
```

## 단일 쿼리에서 여러 통계 명령 사용
<a name="CWL_QuerySyntax-stats-multi"></a>

단일 쿼리에 최대 두 개의 `stats` 명령을 사용할 수 있습니다. 이렇게 하면 첫 번째 집계의 출력에 대해 추가 집계를 수행할 수 있습니다.

**예: 두 개의 `stats` 명령을 사용한 쿼리**

예를 들어, 다음 쿼리는 먼저 5분 빈(bin)의 총 트래픽 볼륨을 찾아낸 다음 해당 5분 빈 중 최고, 최저, 평균 트래픽 볼륨을 계산합니다.

```
FIELDS strlen(@message) AS message_length
| STATS sum(message_length)/1024/1024 as logs_mb BY bin(5m)
| STATS max(logs_mb) AS peak_ingest_mb, 
        min(logs_mb) AS min_ingest_mb, 
        avg(logs_mb) AS avg_ingest_mb
```

**예: 여러 통계 명령을 다른 함수(`filter`, `fields`, `bin`)와 결합**

단일 쿼리에서 두 개의 `stats` 명령을 다른 명령(`filter` 및 `fields`)과 결합할 수 있습니다. 예를 들어, 다음 쿼리는 세션에서 고유한 IP 주소의 수 및 클라이언트 플랫폼별 세션의 수를 찾고, 해당 IP 주소를 필터링한 다음, 마지막으로 클라이언트 플랫폼별 평균 세션 요청을 찾습니다.

```
STATS count_distinct(client_ip) AS session_ips, 
      count(*) AS requests BY session_id, client_platform
| FILTER session_ips > 1
| STATS count(*) AS multiple_ip_sessions, 
        sum(requests) / count(*) AS avg_session_requests BY client_platform
```

여러 `stats` 명령을 사용하여 쿼리에서 `bin` 및 `dateceil` 함수를 사용할 수 있습니다. 예를 들어, 다음 쿼리는 먼저 메시지를 5분 블록으로 결합한 다음 5분 블록을 10분 블록으로 집계하고 각 10분 블록 내의 최고, 최저 및 평균 트래픽 볼륨을 계산합니다.

```
FIELDS strlen(@message) AS message_length
| STATS sum(message_length) / 1024 / 1024 AS logs_mb BY BIN(5m) as @t
| STATS max(logs_mb) AS peak_ingest_mb, 
        min(logs_mb) AS min_ingest_mb,
        avg(logs_mb) AS avg_ingest_mb BY dateceil(@t, 10m)
```

**참고 및 제한 사항**

쿼리당 최대 두 개의 `stats` 명령을 사용할 수 있습니다. 이 할당량은 변경할 수 없습니다.

`sort` 또는 `limit` 명령을 사용하는 경우 이 명령은 두 번째 `stats` 명령 뒤에 나타나야 합니다. 두 번째 `stats` 명령 앞에 있는 경우 쿼리는 유효하지 않습니다.

쿼리에 두 개의 `stats` 명령이 있는 경우 첫 번째 `stats` 집계가 완료될 때까지 쿼리의 일부 결과가 표시되지 않습니다.

단일 쿼리의 두 번째 `stats` 명령에서는 첫 번째 `stats` 명령에 정의된 필드만 참조할 수 있습니다. 예를 들어, 첫 번째 `stats` 집계 후에는 `@message` 필드를 사용할 수 없으므로 다음 쿼리는 유효하지 않습니다.

```
FIELDS @message
| STATS SUM(Fault) by Operation
# You can only reference `SUM(Fault)` or Operation at this point
| STATS MAX(strlen(@message)) AS MaxMessageSize # Invalid reference to @message
```

첫 번째 `stats` 명령 이후에 참조하는 모든 필드는 첫 번째 `stats` 명령에서 정의해야 합니다.

```
STATS sum(x) as sum_x by y, z
| STATS max(sum_x) as max_x by z
# You can only reference `max(sum_x)`, max_x or z at this point
```

**중요**  
`bin` 함수는 항상 `@timestamp` 필드를 묵시적으로 사용합니다. 즉, 첫 번째 `stats` 명령을 사용하여 `timestamp` 필드를 전파하지 않으면 두 번째 `stats` 명령에서 `bin` 함수를 사용할 수 없습니다. 예를 들어, 다음 쿼리는 유효하지 않습니다.  

```
FIELDS strlen(@message) AS message_length
 | STATS sum(message_length) AS ingested_bytes BY @logStream
 | STATS avg(ingested_bytes) BY bin(5m) # Invalid reference to @timestamp field
```
대신 첫 번째 `stats` 명령에서 `@timestamp` 필드를 정의하면 다음 예제와 같이 두 번째 `stats` 명령에서 `dateceil`과 함께 필드를 사용할 수 있습니다.  

```
FIELDS strlen(@message) AS message_length
 | STATS sum(message_length) AS ingested_bytes, max(@timestamp) as @t BY @logStream
 | STATS avg(ingested_bytes) BY dateceil(@t, 5m)
```

## 통계와 함께 사용할 함수
<a name="CWL_QuerySyntax-stats-functions"></a><a name="CWL_Insights_Aggregation_Functions"></a>

CloudWatch Logs Insights는 통계 집계 함수와 통계 비집계 함수를 모두 지원합니다.

 `stats` 명령에서 statsaggregation 함수를 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `avg(fieldName: NumericLogField)` |  number |  지정된 필드의 값 평균.  | 
|  `count()` `count(fieldName: LogField)` |  number |  로그 이벤트를 계산합니다. `count()`(또는`count(*)`)는 쿼리에서 반환하는 이벤트 수를 모두 세고 `count(fieldName)`은 지정한 필드 이름이 포함된 레코드 수를 모두 계산합니다.  | 
|  `count_distinct(fieldName: LogField)` |  number |  필드에 대해 고유한 값의 수를 반환합니다. 필드의 카디널리티가 매우 높은 경우(고유한 값이 많이 포함되어 있음) `count_distinct`가 반환하는 값은 근사치입니다.  | 
|  `max(fieldName: LogField)` |  LogFieldValue |  쿼리된 로그에서 이 로그 필드에 대한 최댓값입니다.  | 
|  `min(fieldName: LogField)` |  LogFieldValue |  쿼리된 로그에서 이 로그 필드에 대한 최솟값입니다.  | 
|  `pct(fieldName: LogFieldValue, percent: number)` |  LogFieldValue |  백분위수는 데이터세트에서 값의 상대적 위치를 나타냅니다. 예를 들어, `pct(@duration, 95)`는 `@duration`의 값 중 95퍼센트가 이 값보다 낮고 5퍼센트는 이 값보다 큰 `@duration` 값을 반환합니다.  | 
|  `stddev(fieldName: NumericLogField)` |  number |  지정된 필드의 값에 대한 표준 편차.  | 
|  `sum(fieldName: NumericLogField)` |  number |  지정된 필드의 값에 대한 합계.  | 

 **통계 비집계 함수** <a name="CWL_Insights_Non-Aggregation_Functions"></a>

 비집계 함수를 `stats` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `earliest(fieldName: LogField)` |  LogField |  쿼리된 로그에서 가장 이른 타임스탬프가 있는 로그 이벤트에서 `fieldName`의 값을 반환합니다.  | 
|  `latest(fieldName: LogField)` |  LogField |  쿼리된 로그에서 최신 타임스탬프가 있는 로그 이벤트에서 `fieldName`의 값을 반환합니다.  | 
|  `sortsFirst(fieldName: LogField)` |  LogField |  쿼리된 로그에서 가장 빨리 정렬된 `fieldName`의 값을 반환합니다.  | 
|  `sortsLast(fieldName: LogField)` |  LogField |  쿼리된 로그에서 가장 늦게 정렬된 `fieldName`의 값을 반환합니다.  | 

# limit
<a name="CWL_QuerySyntax-Limit"></a>

 `limit`을 사용하여 쿼리에서 반환할 로그 이벤트의 수를 지정할 수 있습니다. `limit`를 생략하면 쿼리는 최대 10,000개의 로그 이벤트를 결과로 반환합니다.

예를 들어, 다음 예제에서는 최신 로그 이벤트 25개만 반환합니다.

```
fields @timestamp, @message | sort @timestamp desc | limit 25
```

# dedup
<a name="CWL_QuerySyntax-Dedup"></a>

 `dedup`을 사용하여 지정한 필드의 특정 값을 기준으로 중복 결과를 제거합니다. 하나 이상의 필드와 함께 `dedup`을 사용할 수 있습니다. `dedup`을 사용하여 하나의 필드를 지정하면 해당 필드의 각 고유 값에 대해 하나의 로그 이벤트만 반환됩니다. 여러 필드를 지정하면 해당 필드의 고유한 값 조합마다 하나의 로그 이벤트가 반환됩니다.

중복 항목은 정렬 순서에 따라 삭제되며 정렬 순서의 첫 번째 결과만 유지됩니다. `dedup` 명령을 실행하기 전에 결과를 정렬하는 것이 좋습니다. `dedup`을 실행하기 전에 결과가 정렬되지 않으면 `@timestamp`을 사용하는 기본 내림차순 정렬 순서가 사용됩니다.

Null 값은 평가를 위해 중복으로 간주되지 않습니다. 지정된 필드에 대해 null 값이 있는 로그 이벤트는 유지됩니다. Null 값이 있는 필드를 제거하려면 `isPresent(field)` 함수를 사용하여 **`filter`**을 사용합니다.

`dedup` 명령 이후 쿼리에서 사용할 수 있는 유일한 쿼리 명령은 `limit`입니다.

쿼리`dedup`에서를 사용하면 콘솔에 **Y 레코드 X 표시**와 같은 메시지가 표시됩니다. 여기서 X는 중복 제거된 결과 수이고 Y는 중복 제거 전에 일치하는 총 레코드 수입니다. 이는 중복 레코드가 제거되었음을 나타내며 데이터가 누락되었음을 의미하지 않습니다.

 **예: 이름이 `server`인 필드의 각 고유 값에 대한 최신 로그 이벤트만 보기** 

 다음 예제에서는 `server`의 각 고유 값에 대해 최신 이벤트에 대한 `timestamp`, `server`, `severity` 및 `message` 필드를 표시합니다.

```
fields @timestamp, server, severity, message 
| sort @timestamp desc 
| dedup server
```

CloudWatch Logs Insights 쿼리의 더 많은 샘플은 [일반 쿼리](CWL_QuerySyntax-examples.md#CWL_QuerySyntax-examples-general) 섹션을 참조하세요.

# unmask
<a name="CWL_QuerySyntax-Unmask"></a>

 `unmask`를 사용하여 데이터 보호 정책으로 인해 일부 내용이 마스킹된 로그 이벤트의 모든 내용을 표시할 수 있습니다. 이 명령을 사용하려면 `logs:Unmask` 권한이 있어야 합니다.

로그 그룹의 데이터 보호에 대한 자세한 내용은 [마스킹 처리를 통해 민감한 로그 데이터를 보호하도록 지원](mask-sensitive-log-data.md) 섹션을 참조하세요.

# unnest
<a name="CWL_QuerySyntax-Unnest"></a>

 `unnest`를 사용하면 입력으로 가져온 목록을 평면화하여 목록의 각 요소에 대해 단일 레코드로 여러 레코드를 생성할 수 있습니다. 필드에 포함된 항목의 수에 따라 이 명령은 현재 레코드를 삭제하고 새 레코드를 생성합니다. 각 레코드에는 항목을 나타내는 `unnested_field`가 포함됩니다. 다른 모든 필드는 원본 레코드에서 가져옵니다.

 `unnest`의 입력값은 `LIST`이며, 이는 `jsonParse` 함수에서 나옵니다. 자세한 내용은 [Structure types](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-operations-functions.html#CWL_QuerySyntax-structure-types)을 참조하세요. `MAP`, `String` 및 `numbers`와 같은 다른 모든 유형은 `unnest`에서 하나의 항목이 있는 목록으로 처리됩니다.

**명령 구조**  
 다음 예제는 이 명령의 형식을 설명합니다.

```
unnest field into unnested_field
```

**예제 쿼리**  
 다음 예제에서는 JSON 객체 문자열을 구문 분석하고 필드 이벤트 목록을 확장합니다.

```
fields jsonParse(@message) as json_message 
| unnest json_message.events into event
| display event.name
```

이 예제 쿼리의 로그 이벤트는 다음과 같은 JSON 문자열일 수 있습니다.

```
{
   "events": [
        {
            "name": "exception"
        },
        {
            "name": "user action"
        }
   ]
}
```

이 경우 샘플 쿼리는 쿼리 결과에서 두 개의 레코드를 생성합니다. 하나는 `event.name`을 `exception`로, 다른 하나는 `event.name`을 **사용자 작업**으로 생성합니다.

**예제 쿼리**  
 다음 예제에서는 목록을 평면화한 다음 항목을 필터링합니다.

```
fields jsonParse(@message) as js 
| unnest js.accounts into account 
| filter account.type = "internal"
```

**예제 쿼리**  
 다음 예제에서는 집계 목록을 평면화합니다.

```
fields jsonParse(trimmedData) as accounts 
| unnest accounts into account 
| stats sum(account.droppedSpans) as n by account.accountId 
| sort n desc 
| limit 10
```

# lookup
<a name="CWL_QuerySyntax-Lookup"></a>

`lookup`를 사용하여 조회 테이블의 참조 데이터로 쿼리 결과를 보강합니다. 조회 테이블에는 Amazon CloudWatch Logs에 업로드하는 CSV 데이터가 포함되어 있습니다. 쿼리가 실행되면 `lookup` 명령은 로그 이벤트의 필드를 조회 테이블의 필드와 일치시키고 지정된 출력 필드를 결과에 추가합니다.

사용자 IDs를 사용자 세부 정보에 매핑하거나, 제품 코드를 제품 정보에 매핑하거나, 오류 코드를 오류 설명에 매핑하는 등의 데이터 보강 시나리오에는 조회 테이블을 사용합니다.

## 조회 테이블 생성 및 관리
<a name="CWL_QuerySyntax-Lookup-tables"></a>

쿼리에서 `lookup` 명령을 사용하려면 먼저 조회 테이블을 생성해야 합니다. CloudWatch 콘솔에서 또는 Amazon CloudWatch Logs API를 사용하여 조회 테이블을 생성하고 관리할 수 있습니다.

**조회 테이블을 생성하려면(콘솔)**  


1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **설정을** 선택한 다음 **로그** 탭을 선택합니다.

1. **조회 테이블**로 스크롤하고 **관리를** 선택합니다.

1. **조회 테이블 생성을** 선택합니다.

1. 조회 테이블의 이름을 입력합니다. 이름은 영숫자 문자, 하이픈 및 밑줄만 포함할 수 있습니다.

1. (선택 사항) 설명을 입력합니다.

1. CSV 파일을 업로드합니다. 파일에는 열 이름이 있는 헤더 행이 포함되어야 하며 UTF-8 인코딩을 사용하고 10MB를 초과하지 않아야 합니다.

1. (선택 사항) 테이블 데이터를 암호화할 AWS KMS 키를 지정합니다.

1. **생성(Create)**을 선택합니다.

조회 테이블을 생성한 후 CloudWatch Logs Insights 쿼리 편집기에서 조회 테이블을 볼 수 있습니다. **테이블 조회** 탭을 선택하여 사용 가능한 테이블과 해당 필드를 찾습니다.

조회 테이블을 업데이트하려면 테이블을 선택하고 **작업**, **업데이트를** 선택합니다. 기존 콘텐츠를 모두 바꾸려면 새 CSV 파일을 업로드합니다. 조회 테이블을 삭제하려면 **작업**, **삭제**를 선택합니다.

**참고**  
당 계정당 최대 100개의 조회 테이블을 생성할 수 있습니다 AWS 리전. CSV 파일은 최대 10MB일 수 있습니다. Amazon CloudWatch Logs API를 사용하여 조회 테이블을 관리할 수도 있습니다. 자세한 내용은 Amazon CloudWatch Logs API 참조의 [CreateLookupTable](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLookupTable.html)을 참조하세요. *Amazon CloudWatch *

**참고**  
조회 테이블이 KMS 키로 암호화된 경우 호출자는 조회 테이블을 참조하는 쿼리와 함께 `StartQuery` API를 사용하려면 키(조회 테이블을 암호화하는 데 사용되는 KMS 키)에 대한 `kms:Decrypt` 권한이 있어야 합니다. 자세한 내용은 [를 사용하여 CloudWatch Logs의 조회 테이블 암호화 AWS Key Management Service](encrypt-lookup-tables-kms.md) 단원을 참조하십시오.

## 조회를 위한 쿼리 구문
<a name="CWL_QuerySyntax-Lookup-syntax"></a>

**명령 구조**  
다음은이 명령의 형식을 보여줍니다.

```
lookup table lookup-field as log-field [,...] output-mode output-field[,...]
```

명령은 다음 인수를 사용합니다.
+ `table` - 사용할 조회 테이블의 이름입니다.
+ `lookup-field` - 일치하는 조회 테이블의 필드입니다.
+ `log-field` - 일치하는 로그 이벤트의 필드입니다. 일치는 정확하고 대/소문자를 구분합니다.
+ `output-mode` - 결과에 출력 필드를 `OUTPUT` 추가하려면를 지정합니다. 동일한 이름의 필드가 로그 이벤트에 이미 있는 경우 덮어씁니다.
+ `output-field` - 조회 테이블에서 결과에 추가할 하나 이상의 필드입니다.

**예: 사용자 세부 정보로 로그 이벤트 강화**  
`id` 필드가 포함된 이벤트가 있는 로그 그룹과 `id`, `name`, `email`및 열이 `user_data` 있는 이름이 인 조회 테이블이 있다고 가정해 보겠습니다`department`. 다음 쿼리는 조회 테이블의 사용자 이름, 이메일 및 부서로 각 로그 이벤트를 보강합니다.

```
fields action, status, name, email, department
| lookup user_data id OUTPUT name, email, department
```

**예: 집계와 함께 조회 사용**  
집계 함수와 함께 조회 출력 필드를 사용할 수 있습니다. 다음 쿼리는 사용자 세부 정보로 로그 이벤트를 보강한 다음 이메일 주소별로 그룹화된 이벤트를 계산합니다.

```
fields user_id, action, username, email, department
| lookup user_data user_id OUTPUT username, email, department
| stats count(*) by email
```

**예: 필터와 함께 조회 사용**  
조회에서 반환된 필드를 기준으로 결과를 필터링할 수 있습니다. 다음 쿼리는 로그 이벤트를 보강한 다음 특정 부서의 이벤트만 표시하도록 필터링합니다.

```
fields user_id, action
| lookup user_data user_id OUTPUT username, email, department
| filter department = "Engineering"
```

# 부울, 비교, 숫자, 날짜/시간 및 기타 함수
<a name="CWL_QuerySyntax-operations-functions"></a>

 CloudWatch Logs Insights는 다음 섹션에 설명된 것처럼 쿼리에서 다른 많은 연산과 함수를 지원합니다.

**Topics**
+ [

## 산술 연산자
](#CWL_QuerySyntax-operations-arithmetic)
+ [

## 부울 연산
](#CWL_QuerySyntax-operations-Boolean)
+ [

## 비교 연산자
](#CWL_QuerySyntax-operations-comparison)
+ [

## 숫자 연산자
](#CWL_QuerySyntax-operations-numeric)
+ [

## 구조 유형
](#CWL_QuerySyntax-structure-types)
+ [

## 날짜/시간 함수
](#CWL_QuerySyntax-datetime)
+ [

## 일반 함수
](#CWL_QuerySyntax-general-functions)
+ [

## JSON 함수
](#CWL_QuerySyntax-json-functions)
+ [

## IP 주소 문자열 함수
](#CWL_QuerySyntax-IPaddress-functions)
+ [

## 문자열 함수
](#CWL_QuerySyntax-string-functions)

## 산술 연산자
<a name="CWL_QuerySyntax-operations-arithmetic"></a>

 산술 연산자에서는 숫자 데이터 형식을 인수로 수락하고 숫자 결과를 반환합니다. 산술 연산자를 `filter` 및 `fields` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 연산 | 설명 | 
| --- | --- | 
|  `a + b` |  덧셈  | 
|  `a - b` |  뺄셈  | 
|  `a * b` |  곱셈  | 
|  `a / b` |  나눗셈  | 
|  `a ^ b` |   거듭제곱(`2 ^ 3`에서 `8` 반환)   | 
|  `a % b` |   나머지 또는 모듈러스(`10 % 3`에서 `1` 반환)   | 

## 부울 연산
<a name="CWL_QuerySyntax-operations-Boolean"></a>

 부울 연산자 `and`, `or` 및 `not`을 사용합니다.

**참고**  
 **TRUE** 또는 **FALSE**의 값을 반환하는 함수에서만 부울 연산자를 사용합니다.

## 비교 연산자
<a name="CWL_QuerySyntax-operations-comparison"></a>

 비교 연산자에서는 모든 데이터 형식을 인수로 수락하고 부울 결과를 반환합니다. 비교 연산은 `filter` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 연산자 | 설명 | 
| --- | --- | 
|   `=`   |   같음   | 
|   `!=`   |   같지 않음   | 
|   `<`   |   보다 작음   | 
|  `>` |   보다 큼   | 
|  `<=` |   작거나 같음   | 
|   `>=`   |   크거나 같음   | 

## 숫자 연산자
<a name="CWL_QuerySyntax-operations-numeric"></a>

 숫자 연산은 숫자 데이터 형식을 인수로 수락하고 숫자 결과를 반환합니다. 숫자 연산은 `filter` 및 `fields` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 연산 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|   `abs(a: number)`   |   number   |   절대값   | 
|   `ceil(a: number)`   |   number   |   천장값으로 반올림(`a`의 값보다 큰 수 중 가장 작은 정수)   | 
|   `floor(a: number)`   |  number |   바닥값으로 반올림(`a` 값보다 작은 수 중 가장 큰 정수)   | 
|   `greatest(a: number, ...numbers: number[])`   |   number   |   가장 큰 값 반환   | 
|   `least(a: number, ...numbers: number[])`   |  number |   가장 작은 값 반환   | 
|   `log(a: number)`   |   number   |   자연 로그   | 
|   `sqrt(a: number)`   |   number   |   제곱근   | 

## 구조 유형
<a name="CWL_QuerySyntax-structure-types"></a>

 맵 또는 목록은 쿼리에 속성을 액세스하고 사용할 수 있는 CloudWatch Logs Insights의 구조 유형입니다.

**예: 맵 또는 목록을 가져오는 방법**  
 `jsonParse`를 사용하여 json 문자열인 필드를 맵 또는 목록으로 구문 분석합니다.

```
fields jsonParse(@message) as json_message
```

**예: 속성에 액세스하려면**  
 점 액세스 연산자(map.attribute)를 사용하여 맵의 항목에 액세스합니다. 맵의 속성에 특수 문자가 포함된 경우 백틱을 사용하여 속성 이름(map.attributes.`special.char`)을 묶습니다.

```
fields jsonParse(@message) as json_message
| stats count() by json_message.status_code
```

 브래킷 액세스 연산자(list[index])를 사용하여 목록 내 특정 위치에서 항목을 검색합니다.

```
fields jsonParse(@message) as json_message
| filter json_message.users[1].action = "PutData"
```

 키 이름에 특수 문자가 있는 경우 특수 문자를 백틱(``)으로 래핑합니다.

```
fields jsonParse(@message) as json_message
| filter json_message.`user.id` = "123"
```

**예: 빈 결과**  
 맵과 목록은 문자열, 숫자 및 날짜/시간 함수에 대해 null로 처리됩니다.

```
fields jsonParse(@message) as json_message
| display toupper(json_message)
```

 맵 및 목록을 다른 필드와 비교하면 `false`가 됩니다.

**참고**  
 `dedup`, `pattern`, `sort` 및 `stats`에서 맵 및 목록을 사용하는 것은 지원되지 않습니다.

## 날짜/시간 함수
<a name="CWL_QuerySyntax-datetime"></a>

 **날짜/시간 함수** 

 날짜/시간 함수를 `fields` 및 `filter` 명령에서 사용하고 다른 함수의 인수로 사용합니다. 이러한 함수를 사용하여 집계 함수가 포함된 쿼리에 대한 시간 버킷을 생성합니다. 숫자와 다음 중 하나로 구성된 기간을 사용합니다.
+ `ms` - 밀리초 
+ `s` - 초 
+ `m` - 분 
+ `h` - 시간 

 예를 들어, `10m`은 10분을, `1h`은 1시간을 나타냅니다.

**참고**  
datetime 함수에 가장 적합한 시간 단위를 사용합니다. CloudWatch Logs는 선택한 시간 단위에 따라 요청의 한도를 지정합니다. 예를 들어, CloudWatch Logs는 `s`을 사용하는 모든 요청의 최대값을 60으로 한정합니다. 따라서 `bin(300s)`을 지정하면 CloudWatch Logs는 실제로 이를 60초로 구현합니다. 60은 분당 초의 수이므로 CloudWatch Logs는 `s`에 60보다 큰 숫자를 사용하지 않기 때문입니다. 5분 버킷을 생성하려면 `bin(5m)`을 대신 사용합니다.  
`ms`의 한도는 1000이고, `s`와 `m`의 한도는 60이며, `h`의 한도는 24입니다.

다음 표에는 쿼리 명령에 사용할 수 있는 다양한 날짜 시간 함수의 목록이 포함되어 있습니다. 이 표에는 각 함수의 결과 유형이 나열되며 각 함수에 대한 설명이 포함되어 있습니다.

**작은 정보**  
 쿼리 명령을 생성할 때 시간 간격 선택기를 사용하여 쿼리할 기간을 선택할 수 있습니다. 예를 들어, 5\$130분 간격, 1, 3, 12시간 간격 또는 사용자 지정 시간 범위 중에서 설정할 수 있습니다. 특정 날짜 사이의 기간을 설정할 수도 있습니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `bin(period: Period)` |  타임스탬프 |  `@timestamp` 값을 지정한 기간으로 반올림한 다음 자릅니다. 예를 들어, `bin(5m)`은 `@timestamp`의 값을 가장 가까운 5분 단위로 반올림합니다. 이를 사용하여 쿼리에서 여러 로그 항목을 함께 그룹화할 수 있습니다. 다음 예제에서는 시간당 발생한 예외 수를 반환합니다. <pre>filter @message like /Exception/ <br />    | stats count(*) as exceptionCount by bin(1h)<br />    | sort exceptionCount desc</pre> `bin` 함수에서는 다음과 같은 시간 단위 및 약어가 지원됩니다. 둘 이상의 문자를 포함하는 모든 단위 및 약어의 경우 s를 추가하여 복수화할 수 있습니다. 따라서 `hr` 및 `hrs` 모두 시간을 지정하는 데 사용됩니다. [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/CWL_QuerySyntax-operations-functions.html)  | 
|  `datefloor(timestamp: Timestamp, period: Period)` |  타임스탬프 |  타임스탬프를 지정한 기간으로 자릅니다. 예를 들어, `datefloor(@timestamp, 1h)`은 `@timestamp`의 모든 값을 해당 시간 아래로 자릅니다.  | 
|  `dateceil(timestamp: Timestamp, period: Period)` |  타임스탬프 |  타임스탬프를 지정한 기간으로 반올림한 다음 자릅니다. 예를 들어, `dateceil(@timestamp, 1h)`은 `@timestamp`의 모든 값을 해당 시간 위로 자릅니다.  | 
|  `fromMillis(fieldName: number)` |  타임스탬프 |  입력 필드를 Unix 에포크 밀리초로 해석하여 타임스탬프로 변환합니다.  | 
|  `toMillis(fieldName: Timestamp)` |  number |  지정된 필드에 있는 타임스탬프를 Unix Epoch 밀리초를 나타내는 숫자로 변환합니다. 예를 들어, `toMillis(@timestamp)`은 타임스탬프를 `2022-01-14T13:18:031.000-08:00`에서 `1642195111000`로 변환합니다.  | 
|  `now()`  |  number  |  쿼리 처리가 시작된 시간을 epoch 초 단위로 반환합니다. 이 함수는 인수를 필요로 하지 않습니다. 이를 사용하여 현재 시간에 따라 쿼리 결과를 필터링할 수 있습니다. 예를 들어, 다음 쿼리는 지난 2시간 동안의 모든 4xx 오류를 반환합니다. <pre>parse @message "Status Code: *;" as statusCode\n <br />| filter statusCode >= 400 and statusCode <= 499  \n <br />| filter toMillis(@timestamp) >= (now() * 1000 - 7200000)</pre> 다음 예제에서는 `error` 또는 `failure` 단어가 포함된 지난 5시간 동안의 모든 로그 항목을 반환합니다. <pre>fields @timestamp, @message <br />| filter @message like /(?i)(error|failure)/ <br />| filter toMillis(@timestamp) >= (now() * 1000 - 18000000)</pre>  | 

**참고**  
 현재 CloudWatch Logs Insights는 사람이 읽을 수 있는 타임스탬프가 있는 로그 필터링을 지원하지 않습니다.

## 일반 함수
<a name="CWL_QuerySyntax-general-functions"></a>

 **일반 함수** 

 일반 함수를 `fields` 및 `filter` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|   `ispresent(fieldName: LogField)`   |   부울   |   이 필드가 존재하는 경우 `true` 반환   | 
|   `coalesce(fieldName: LogField, ...fieldNames: LogField[])`   |   LogField   |   목록에서 null이 아닌 첫 번째 값 반환   | 

## JSON 함수
<a name="CWL_QuerySyntax-json-functions"></a>

 **JSON 함수** 

 JSON 함수를 `fields` 및 `filter` 명령과 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|   `jsonParse(fieldName: string)`   |   맵 \$1 목록 \$1 비어 있음   |   입력이 JSON 객체 또는 JSON 배열의 문자열 표현일 때 맵 또는 목록을 반환합니다. 입력이 표현 중 하나가 아닌 경우 빈 값을 반환합니다.  | 
|   `jsonStringify(fieldName: Map \| List)`   |   문자열   |   맵 또는 목록 데이터에서 JSON 문자열을 반환합니다.  | 

## IP 주소 문자열 함수
<a name="CWL_QuerySyntax-IPaddress-functions"></a>

 **IP 주소 문자열 함수** 

 IP 주소 문자열 함수를 `filter` 및 `fields` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `isValidIp(fieldName: string)` |  부울 |  필드가 유효한 IPv4 또는 IPv6 주소인 경우 `true`을 반환합니다.  | 
|  `isValidIpV4(fieldName: string)` |  부울 |  필드가 유효한 IPv4 주소인 경우 `true`을 반환합니다.  | 
|  `isValidIpV6(fieldName: string)` |  부울 |  필드가 유효한 IPv6 주소인 경우 `true`을 반환합니다.  | 
|  `isIpInSubnet(fieldName: string, subnet: string)` |  부울 |  필드가 지정된 v4 또는 v6 서브넷 내 유효한 IPv4 또는 IPv6 주소인 경우 `true`을 반환합니다. 서브넷을 지정할 때는 `192.0.2.0/24` 또는 `2001:db8::/32`와 같은 CIDR 표기법을 사용합니다. 여기서는 `192.0.2.0` 또는`2001:db8::`이 CIDR 블록의 시작입니다.  | 
|  `isIpv4InSubnet(fieldName: string, subnet: string)` |  부울 |  필드가 지정된 v4 서브넷 내 유효한 IPv4 주소인 경우 `true`을 반환합니다. 서브넷을 지정할 때는 `192.0.2.0/24`와 같은 CIDR 표기법을 사용합니다. 여기서는 `192.0.2.0`이 CIDR 블록의 시작입니다.  | 
|  `isIpv6InSubnet(fieldName: string, subnet: string)` |  부울 |  필드가 지정된 v6 서브넷 내 유효한 IPv6 주소인 경우 `true`을 반환합니다. 서브넷을 지정할 때는 `2001:db8::/32`와 같은 CIDR 표기법을 사용합니다. 여기서는 `2001:db8::`이 CIDR 블록의 시작입니다.  | 

## 문자열 함수
<a name="CWL_QuerySyntax-string-functions"></a>

 **문자열 함수** 

 문자열 함수를 `fields` 및 `filter` 명령에서 사용하고 다른 함수의 인수로 사용합니다.


| 함수 | 결과 유형 | 설명 | 
| --- | --- | --- | 
|  `isempty(fieldName: string)` |  숫자 |  필드가 누락되어 있거나 빈 문자열인 경우 `1`을 반환합니다.  | 
|  `isblank(fieldName: string)` |  숫자 |  필드가 누락되어 있거나 빈 문자열이거나 빈 공백만 포함된 경우 `1`을 반환합니다.  | 
|  `concat(str: string, ...strings: string[])` |  문자열 |  문자열을 연결합니다.  | 
|  `ltrim(str: string)` `ltrim(str: string, trimChars: string)` |  문자열 |  함수에 두 번째 인수가 없는 경우에는 문자열의 왼쪽에서 공백을 제거합니다. 함수에 두 번째 문자열 인수가 없는 경우에는 공백을 제거하지 않습니다. 대신 `str`의 왼쪽에서 `trimChars`의 문자를 제거합니다. 예를 들어, `ltrim("xyZxyfooxyZ","xyZ")`은 `"fooxyZ"`을 반환합니다.  | 
|  `rtrim(str: string)` `rtrim(str: string, trimChars: string)` |  문자열 |  함수에 두 번째 인수가 없는 경우에는 문자열의 오른쪽에서 공백을 제거합니다. 함수에 두 번째 문자열 인수가 없는 경우에는 공백을 제거하지 않습니다. 대신 `str`의 오른쪽에서 `trimChars`의 문자를 제거합니다. 예를 들어, `rtrim("xyZfooxyxyZ","xyZ")`은 `"xyZfoo"`을 반환합니다.  | 
|  `trim(str: string)` `trim(str: string, trimChars: string)` |  문자열 |  함수에 두 번째 인수가 없는 경우에는 문자열의 양쪽 끝에서 공백을 제거합니다. 함수에 두 번째 문자열 인수가 없는 경우에는 공백을 제거하지 않습니다. 대신 `str`의 양쪽에서 `trimChars`의 문자를 제거합니다. 예를 들어, `trim("xyZxyfooxyxyZ","xyZ")`은 `"foo"`을 반환합니다.  | 
|  `strlen(str: string)` |  number |  문자열 길이를 Unicode 코드 포인트로 반환합니다.  | 
|  `toupper(str: string)` |  문자열 |  문자열을 대문자로 변환합니다.  | 
|  `tolower(str: string)` |  문자열 |  문자열을 소문자로 변환합니다.  | 
|  `substr(str: string, startIndex: number)` `substr(str: string, startIndex: number, length: number)` |  문자열 |  숫자 인수가 지정한 인덱스의 하위 문자열을 문자열 끝에 반환합니다. 함수에 두 번째 숫자 인수가 있는 경우 해당 인수에는 검색되는 하위 문자열의 길이가 포함됩니다. 예를 들어, `substr("xyZfooxyZ",3, 3)`은 `"foo"`을 반환합니다.  | 
|  `replace(fieldName: string, searchValue: string, replaceValue: string)` |  문자열 |  `fieldName: string`에서 `searchValue`의 모든 인스턴스를 `replaceValue`로 바꿉니다. 예를 들어, `replace(logGroup,"smoke_test","Smoke")` 함수는 `logGroup` 필드에 문자열 값 `smoke_test`를 포함한 로그 이벤트를 검색하고 해당 값을 `Smoke` 문자열로 바꿉니다.  | 
|  `strcontains(str: string, searchValue: string)` |  number |  `str`에 `searchValue`와 0이 포함되어 있으면 1을 반환합니다.  | 

# 특수 문자가 포함된 필드
<a name="CWL_QuerySyntax-Guidelines"></a>

필드에 `@` 기호 또는 마침표(`.`) 이외의 영숫자가 아닌 문자가 포함된 경우 필드를 백틱 문자(```)로 둘러싸야 합니다. 예를 들어, `foo-bar` 로그 필드는 영숫자가 아닌 문자 하이픈(`-`)을 포함하고 있기 때문에 백틱(``foo-bar``)으로 묶어야 합니다.

# 쿼리에 별칭 및 코멘트 사용
<a name="CWL_QuerySyntax-alias"></a>

 별칭이 포함된 쿼리를 생성합니다. 별칭은 로그 필드의 이름을 바꾸거나 값을 필드로 추출할 때 사용합니다. 키워드 `as`를 사용하여 로그 필드 또는 결과에 별칭을 제공합니다. 쿼리에서 별칭을 2개 이상 사용할 수 있습니다. 다음과 같은 명령에서 별칭을 사용할 수 있습니다.
+  `fields` 
+  `parse` 
+  `sort` 
+  ` stats ` 

 다음 예제에서는 별칭이 있는 쿼리를 생성하는 방법을 보여줍니다.

 **예제** 

 쿼리의 명령 `fields`에 별칭이 포함되어 있습니다.

```
fields @timestamp, @message, accountId as ID
| sort @timestamp desc
| limit 20
```

 쿼리를 통해 `@timestamp`, `@message` 및 `accountId` 필드에 대한 값이 반환됩니다. 결과는 내림차순으로 정렬되며 20개로 제한됩니다. `accountId`에 대한 값이 `ID`라는 별칭 아래에 나열됩니다.

 **예제** 

 쿼리의 명령 `sort` 및 `stats`에 별칭이 포함되어 있습니다.

```
stats count(*) by duration as time 
| sort time desc
```

 쿼리에서는 로그 그룹에서 발생하는 `duration` 필드의 수를 계산하고 결과를 내림차순으로 정렬합니다. `duration`에 대한 값이 `time`라는 별칭 아래에 나열됩니다.

## 코멘트 사용
<a name="CWL_QuerySyntax-comments"></a>

 CloudWatch Logs Insights는 쿼리의 코멘트를 지원합니다. 해시 문자(**\$1**)를 사용하여 코멘트를 시작합니다. 코멘트를 사용하여 쿼리 또는 문서 쿼리의 줄을 무시할 수 있습니다.

 **예: 쿼리** 

 다음 쿼리가 실행되면 두 번째 줄이 무시됩니다.

```
fields @timestamp, @message, accountId
# | filter accountId not like "7983124201998"
| sort @timestamp desc
| limit 20
```

# Logs Insights QL 시작하기: 쿼리 자습서
<a name="CWL_AnalyzeLogData_Tutorials"></a>

다음 섹션에는 Logs Insights QL을 시작하는 데 도움이 되는 샘플 쿼리 자습서가 포함되어 있습니다.

**Topics**
+ [

# 자습서: 샘플 쿼리 실행 및 수정
](CWL_AnalyzeLogData_RunSampleQuery.md)
+ [

# 자습서: 집계 함수를 사용하여 쿼리 실행
](CWL_AnalyzeLogData_AggregationQuery.md)
+ [

# 자습서: 로그 필드로 그룹화된 시각화를 생성하는 쿼리 실행
](CWL_AnalyzeLogData_VisualizationFieldQuery.md)
+ [

# 자습서: 시계열 시각화를 생성하는 쿼리 실행
](CWL_AnalyzeLogData_VisualizationQuery.md)

# 자습서: 샘플 쿼리 실행 및 수정
<a name="CWL_AnalyzeLogData_RunSampleQuery"></a>

다음 자습서에서는 사용자가 CloudWatch Logs Insights를 시작할 수 있도록 도와줍니다. Log Insights QL에서 샘플 쿼리를 실행한 다음, 수정하고 다시 실행하는 방법을 봅니다.

쿼리를 실행하려면 CloudWatch Logs에 이미 저장된 로그가 있어야 합니다. CloudWatch Logs를 이미 사용 중이고 로그 그룹과 로그 스트림이 설정되어 있으면 시작할 준비가 된 것입니다. 또한 AWS CloudTrail, Amazon Route 53 또는 Amazon VPC 등의 서비스를 사용하고 있고 이러한 서비스의 로그가 CloudWatch Logs로 전송되도록 설정한 경우에는 이미 로그가 있을 수도 있습니다. CloudWatch Logs로 로그 전송에 대한 자세한 내용은 [CloudWatch Logs 시작하기](CWL_GettingStarted.md)을 참조하세요.

CloudWatch Logs Insights의 쿼리가 로그 이벤트에서 일련의 필드를 반환하거나 로그 이벤트에 대해 수행된 수학적 집계 또는 다른 연산의 결과를 반환합니다. 이 자습서에서는 로그 이벤트 목록을 반환하는 쿼리를 보여줍니다.

## 샘플 쿼리 실행
<a name="CWL_AnalyzeLogData_RunQuerySample"></a>

**CloudWatch Logs Insights 샘플 쿼리를 실행하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**를 선택한 다음, **로그 인사이트**를 선택합니다.

   **로그 인사이트** 페이지의 쿼리 편집기에는 Logs Insights QL에 최신 로그 이벤트 20개를 반환하는 쿼리가 포함되어 있습니다.

1. **로그 그룹 선택** 드롭다운에서 쿼리할 로그 그룹을 하나 이상 선택합니다.

    CloudWatch 크로스 계정 관측성에서 모니터링 계정인 경우 소스 계정과 모니터링 계정에서 로그 그룹을 선택할 수 있습니다. 하나의 쿼리로 다른 계정의 로그를 한 번에 쿼리할 수 있습니다.

   로그 그룹 이름, 계정 ID 또는 계정 레이블을 기준으로 로그 그룹을 필터링할 수 있습니다.

   Standard 로그 클래스의 로그 그룹을 선택하면 CloudWatch Logs Insights가 로그 그룹의 데이터 필드를 자동으로 탐지합니다. 검색된 필드를 보려면 페이지 오른쪽 상단의 **필드** 메뉴를 선택합니다.
**참고**  
검색된 필드는 Standard 로그 클래스의 로그 그룹에 대해서만 지원됩니다. 로그 클래스에 대한 자세한 내용은 [로그 클래스](CloudWatch_Logs_Log_Classes.md)를 참조하세요.

1. (선택 사항) 시간 간격 선택기를 사용하여 쿼리할 기간을 선택합니다.

   5\$130분 간격, 1, 3, 12시간 간격 또는 사용자 지정 시간 범위 중에서 선택할 수 있습니다.

1. **실행**을 선택하고 결과를 봅니다.

   이 자습서에서는 가장 최근에 추가된 로그 이벤트 20개가 결과에 포함되어 있습니다.

   CloudWatch Logs는 이 로그 그룹의 로그 이벤트를 시간의 흐름에 따라 보여주는 막대 그래프를 표시합니다. 이 막대 그래프는 테이블의 이벤트뿐만 아니라 쿼리 및 시간 범위와 일치하는 로그 그룹 내 이벤트의 분포를 보여줍니다.

1. 반환된 로그 이벤트의 모든 필드를 보려면 번호가 매겨진 이벤트의 왼쪽에 있는 삼각형 드롭다운 아이콘을 선택합니다.

## 샘플 쿼리 수정
<a name="CWL_AnalyzeLogData_ModifySampleQuery"></a>

이 자습서에서는 최신 로그 이벤트 50개를 표시하도록 샘플 쿼리를 수정합니다.

이전 자습서를 아직 실행하지 않은 경우 지금 실행하는 것이 좋습니다. 이 자습서는 이전 자습서를 마친 지점에서 시작합니다.

**참고**  
CloudWatch Logs Insights에서 제공하는 일부 샘플 쿼리는 `limit` 대신 `head` 또는 `tail` 명령을 사용합니다. 이러한 명령은 더 이상 사용되지 않으며 `limit`로 대체되었습니다. 작성하는 모든 쿼리에 `head` 또는 `tail` 대신 `limit`를 사용합니다.

**CloudWatch Logs Insights 샘플 쿼리를 수정하려면**

1. 쿼리 편집기에서 **20**을 **50**으로 변경한 다음 **실행**을 선택합니다.

   새 쿼리의 결과가 표시됩니다. 기본 시간 범위 내에서 로그 파일에 데이터가 충분하다고 가정하고 이제 로그 이벤트 50개가 나열됩니다.

1. (선택 사항) 생성한 쿼리를 저장할 수 있습니다. 이 쿼리를 저장하려면 **저장**을 선택합니다. 자세한 정보는 [CloudWatch Logs Insights 쿼리 저장 및 재실행](CWL_Insights-Saving-Queries.md) 섹션을 참조하세요.

## 샘플 쿼리에 필터 명령 추가
<a name="CWL_AnalyzeLogData_FilterQuery"></a>

이 자습서에서는 쿼리 편집기에서 쿼리를 보다 과감하게 변경하는 방법에 대해 살펴봅니다. 이 자습서에서는 검색된 로그 이벤트의 필드를 기반으로 이전 쿼리의 결과를 필터링합니다.

이전 자습서를 아직 실행하지 않은 경우 지금 실행하는 것이 좋습니다. 이 자습서는 이전 자습서를 마친 지점에서 시작합니다.

**이전 쿼리에 필터 명령을 추가하려면**

1. 필터링할 필드를 결정합니다. 지난 15분 동안 선택한 로그 그룹에 포함된 로그 이벤트에서 CloudWatch Logs가 감지한 가장 일반적인 필드와 각 필드가 나타나는 로그 이벤트의 비율을 보려면 페이지 오른쪽에서 **필드**를 선택합니다.

   특정 로그 이벤트에 포함된 필드를 확인하려면 해당 행 왼쪽에 있는 아이콘을 선택합니다.

   로그에 포함된 이벤트에 따라 로그 이벤트에 **awsRegion** 필드가 나타날 수 있습니다. 이 자습서의 나머지 부분에서는 필터 필드로 **awsRegion**을 사용하는데, 이 필드를 사용할 수 없는 경우에는 다른 필드를 사용할 수 있습니다.

1. 쿼리 편집기 상자에서 **50** 뒤에 커서를 놓고 입력을 누릅니다.

1. 새 줄에 먼저 \$1(파이프 문자)와 공백을 입력합니다. CloudWatch Logs Insights 쿼리 내 명령은 파이프 문자로 구분해야 합니다.

1. **filter awsRegion="us-east-1"**을 입력합니다.

1. **실행**을 선택합니다.

   다시 쿼리를 실행하면 이제 새 필터와 일치하는 최신 결과 50개가 표시됩니다.

   다른 필드를 필터링했는데 오류 결과가 표시되면 해당 필드 이름을 이스케이프해야 할 수 있습니다. 필드 이름에 영숫자가 아닌 문자가 포함되어 있으면 필드 이름의 앞/뒤에 백틱 문자(`)를 입력해야 합니다(예: **`error-code`="102"**).

   영숫자가 아닌 문자를 포함하는 필드 이름에 백틱 문자를 사용해야 하지만 값은 그렇지 않습니다. 값은 항상 따옴표(") 안에 포함됩니다.

Logs Insights QL에는 여러 가지 명령과 정규 표현식, 수학적 연산 및 통계적 연산 지원을 비롯하여 강력한 쿼리 기능이 있습니다. 자세한 내용은 [CloudWatch Logs Insights 언어 쿼리 구문](CWL_QuerySyntax.md) 단원을 참조하십시오.

# 자습서: 집계 함수를 사용하여 쿼리 실행
<a name="CWL_AnalyzeLogData_AggregationQuery"></a>

집계 함수를 `stats` 명령과 사용하고 다른 함수의 인수로 사용할 수 있습니다. 이 자습서에서는 지정된 필드를 포함하는 로그 이벤트의 수를 계산하는 쿼리 명령을 실행합니다. 쿼리 명령은 지정된 필드의 하나 이상의 값으로 그룹화된 총 개수를 반환합니다. 집계 함수에 대한 자세한 내용은 *Amazon CloudWatch Logs 사용 설명서*의 [지원되는 연산 및 함수](https://docs.aws.amazon.com/en_us/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html#CWL_QuerySyntax-operations-functions)를 참조하세요.

**집계 함수를 사용하여 쿼리 실행**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**를 선택한 다음, **로그 인사이트**를 선택합니다.

1. **Logs Insights QL** 탭이 선택되어 있는지 확인합니다.

1. **로그 그룹 선택** 드롭다운에서 쿼리할 로그 그룹을 하나 이상 선택합니다.

    CloudWatch 크로스 계정 관측성에서 모니터링 계정인 경우 소스 계정과 모니터링 계정에서 로그 그룹을 선택할 수 있습니다. 하나의 쿼리로 다른 계정의 로그를 한 번에 쿼리할 수 있습니다.

   로그 그룹 이름, 계정 ID 또는 계정 레이블을 기준으로 로그 그룹을 필터링할 수 있습니다.

   로그 그룹을 선택하면 CloudWatch Logs Insights가 로그 그룹의 데이터 필드를 자동으로 탐지합니다(Standard 클래스 로그 그룹인 경우). 검색된 필드를 보려면 페이지 오른쪽 상단의 **필드** 메뉴를 선택합니다.

1. 쿼리 편집기에서 기본 쿼리를 삭제하고 다음 명령을 입력합니다.

   ```
   stats count(*) by fieldName
   ```

1. *fieldName*을 **필드** 메뉴의 검색된 필드로 바꿉니다.

   **필드** 메뉴는 페이지 오른쪽 상단에 있으며 CloudWatch Logs Insights가 로그 그룹에서 탐지한 모든 검색된 필드를 표시합니다.

1. **실행**을 선택하고 쿼리 결과를 봅니다.

   쿼리 결과에는 쿼리 명령과 일치하는 로그 그룹의 레코드 수와 지정된 필드의 하나 이상의 값으로 그룹화된 총 개수가 표시됩니다.

# 자습서: 로그 필드로 그룹화된 시각화를 생성하는 쿼리 실행
<a name="CWL_AnalyzeLogData_VisualizationFieldQuery"></a>

`stats` 함수를 사용하여 반환된 결과를 로그 항목에 있는 하나 이상의 필드 값으로 그룹화하는 쿼리를 실행하면 결과를 막대 차트, 파이 차트, 선 그래프 또는 누적 영역 그래프로 볼 수 있습니다. 이렇게 하면 로그에서 추세를 보다 효율적으로 시각화할 수 있습니다.

**시각화를 위한 쿼리를 실행하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**를 선택한 다음, **로그 인사이트**를 선택합니다.

1. **로그 그룹 선택** 드롭다운에서 쿼리할 로그 그룹을 하나 이상 선택합니다.

    CloudWatch 크로스 계정 관측성에서 모니터링 계정인 경우 소스 계정과 모니터링 계정에서 로그 그룹을 선택할 수 있습니다. 하나의 쿼리로 다른 계정의 로그를 한 번에 쿼리할 수 있습니다.

   로그 그룹 이름, 계정 ID 또는 계정 레이블을 기준으로 로그 그룹을 필터링할 수 있습니다.

1. 쿼리 편집기에서 현재 내용을 삭제하고 다음 `stats` 함수를 입력한 다음, **쿼리 실행**을 선택합니다.

   ```
   stats count(*) by @logStream 
       | limit 100
   ```

   결과는 로그 그룹에서 각 로그 스트림에 대한 로그 이벤트의 수를 보여줍니다. 결과는 100개 행으로 제한됩니다.

1. **시각화** 탭을 선택합니다.

1. **줄** 옆에 있는 화살표를 선택한 다음, **막대**를 선택합니다.

   막대 차트가 나타나고 로그 그룹의 각 로그 스트림에 대한 막대가 표시됩니다.

# 자습서: 시계열 시각화를 생성하는 쿼리 실행
<a name="CWL_AnalyzeLogData_VisualizationQuery"></a>

`bin()` 함수를 사용해 기간별로 반환되는 결과를 그룹화하는 쿼리를 실행하는 경우 결과를 선 그래프, 누적 영역 그래프, 파이 차트 또는 막대 차트로 볼 수 있습니다. 이렇게 하면 로그 이벤트의 경시적 추세를 보다 효율적으로 시각화할 수 있습니다.

**시각화를 위한 쿼리를 실행하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**를 선택한 다음, **로그 인사이트**를 선택합니다.

1. **Logs Insights QL** 탭이 선택되어 있는지 확인합니다.

1. **로그 그룹 선택** 드롭다운에서 쿼리할 로그 그룹을 하나 이상 선택합니다.

    CloudWatch 크로스 계정 관측성에서 모니터링 계정인 경우 소스 계정과 모니터링 계정에서 로그 그룹을 선택할 수 있습니다. 하나의 쿼리로 다른 계정의 로그를 한 번에 쿼리할 수 있습니다.

   로그 그룹 이름, 계정 ID 또는 계정 레이블을 기준으로 로그 그룹을 필터링할 수 있습니다.

1. 쿼리 편집기에서 현재 내용을 삭제하고 다음 `stats` 함수를 입력한 다음, **쿼리 실행**을 선택합니다.

   ```
   stats count(*) by bin(30s)
   ```

   결과에는 CloudWatch Logs가 30초 동안 매번 수신한 로그 그룹의 로그 이벤트의 수가 표시됩니다.

1. **시각화** 탭을 선택합니다.

   결과가 선 그래프로 표시됩니다. 막대 차트, 파이 차트 또는 누적 영역 차트로 전환하려면 그래프 오른쪽 위 **줄** 옆에 있는 화살표를 선택합니다.

# 샘플 쿼리
<a name="CWL_QuerySyntax-examples"></a>

이 섹션에는 [CloudWatch 콘솔](https://console.aws.amazon.com/cloudwatch/)에서 실행할 수 있는 일반적이고 유용한 쿼리 명령 목록이 포함되어 있습니다. 쿼리 명령을 실행하는 방법에 대한 자세한 내용은 *Amazon CloudWatch Logs User Guide*의 [Tutorial: Run and modify a sample query](https://docs.aws.amazon.com/en_us/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_RunSampleQuery.html)을 참조하세요.

쿼리 구문에 대한 자세한 내용은 [CloudWatch Logs Insights 언어 쿼리 구문](CWL_QuerySyntax.md)을 참조하세요.

**Topics**
+ [

## 일반 쿼리
](#CWL_QuerySyntax-examples-general)
+ [

## Lambda 로그에 대한 쿼리
](#CWL_QuerySyntax-examples-Lambda)
+ [

## Amazon VPC 흐름 로그에 대한 쿼리
](#CWL_QuerySyntax-examples-VPC)
+ [

## Route 53 로그에 대한 쿼리
](#CWL_QuerySyntax-examples-Route53)
+ [

## CloudTrail 로그에 대한 쿼리
](#CWL_QuerySyntax-examples-CloudTrail)
+ [

## 에 대한 쿼리 Amazon API Gateway
](#CWL_QuerySyntax-examples-APIGateway)
+ [

## NAT 게이트웨이에 대한 쿼리
](#CWL_QuerySyntax-examples-NATGateway)
+ [

## Apache 서버 로그에 대한 쿼리
](#CWL_QuerySyntax-examples-Apache)
+ [

## Amazon EventBridge에 대한 쿼리
](#CWL_QuerySyntax-examples-EventBridge)
+ [

## 구문 분석 명령의 예제
](#CWL_QuerySyntax-examples-parse)

## 일반 쿼리
<a name="CWL_QuerySyntax-examples-general"></a>

**최근에 추가된 로그 이벤트 25개를 찾습니다.**

```
fields @timestamp, @message | sort @timestamp desc | limit 25
```

**시간당 발생한 예외 횟수 목록을 가져옵니다.**

```
filter @message like /Exception/ 
    | stats count(*) as exceptionCount by bin(1h)
    | sort exceptionCount desc
```

**예외에 해당되지 않는 로그 이벤트 목록을 가져옵니다.**

```
fields @message | filter @message not like /Exception/
```

**`server` 필드의 각 고유 값에 대한 최신 로그 이벤트를 가져옵니다.**

```
fields @timestamp, server, severity, message 
| sort @timestamp asc 
| dedup server
```

**각 `severity` 유형에 대한 `server` 필드의 각 고유 값에 대한 최신 로그 이벤트를 가져옵니다.**

```
fields @timestamp, server, severity, message 
| sort @timestamp desc 
| dedup server, severity
```

## Lambda 로그에 대한 쿼리
<a name="CWL_QuerySyntax-examples-Lambda"></a>

**과다 프로비저닝된 메모리의 양을 확인합니다.**

```
filter @type = "REPORT"
    | stats max(@memorySize / 1000 / 1000) as provisonedMemoryMB,
        min(@maxMemoryUsed / 1000 / 1000) as smallestMemoryRequestMB,
        avg(@maxMemoryUsed / 1000 / 1000) as avgMemoryUsedMB,
        max(@maxMemoryUsed / 1000 / 1000) as maxMemoryUsedMB,
        provisonedMemoryMB - maxMemoryUsedMB as overProvisionedMB
```

**지연 보고서를 생성합니다.**

```
filter @type = "REPORT" |
    stats avg(@duration), max(@duration), min(@duration) by bin(5m)
```

**느린 함수 간접 호출을 검색하고 재시도 또는 클라이언트측 코드에서 발생할 수 있는 중복 요청을 제거합니다. 이 쿼리에서 `@duration`은 밀리초 단위입니다.**

```
fields @timestamp, @requestId, @message, @logStream 
| filter @type = "REPORT" and @duration > 1000
| sort @timestamp desc
| dedup @requestId 
| limit 20
```

## Amazon VPC 흐름 로그에 대한 쿼리
<a name="CWL_QuerySyntax-examples-VPC"></a>

**호스트 간에 상위 15개의 패킷 전송을 찾습니다.**

```
stats sum(packets) as packetsTransferred by srcAddr, dstAddr
    | sort packetsTransferred  desc
    | limit 15
```

**지정된 서브넷의 호스트에 대해 상위 15개 바이트 전송을 찾습니다.**

```
filter isIpv4InSubnet(srcAddr, "192.0.2.0/24")
    | stats sum(bytes) as bytesTransferred by dstAddr
    | sort bytesTransferred desc
    | limit 15
```

**데이터 전송 프로토콜로 UDP를 사용하는 IP 주소를 찾습니다.**

```
filter protocol=17 | stats count(*) by srcAddr
```

**캡처 기간 중 흐름 레코드를 건너뛴 IP 주소를 찾습니다.**

```
filter logStatus="SKIPDATA"
    | stats count(*) by bin(1h) as t
    | sort t
```

**네트워크 연결 문제 해결에 도움이 되도록 각 연결에 대한 단일 레코드를 찾습니다.**

```
fields @timestamp, srcAddr, dstAddr, srcPort, dstPort, protocol, bytes 
| filter logStream = 'vpc-flow-logs' and interfaceId = 'eni-0123456789abcdef0' 
| sort @timestamp desc 
| dedup srcAddr, dstAddr, srcPort, dstPort, protocol 
| limit 20
```

## Route 53 로그에 대한 쿼리
<a name="CWL_QuerySyntax-examples-Route53"></a>

**시간당 레코드 배포를 쿼리 유형별로 찾습니다.**

```
stats count(*) by queryType, bin(1h)
```

**요청 횟수가 가장 많은 DNS 해석기 10개를 찾습니다.**

```
stats count(*) as numRequests by resolverIp
    | sort numRequests desc
    | limit 10
```

**서버가 DNS 요청을 완료하지 못한 도메인 및 하위 도메인별 레코드의 수를 찾습니다.**

```
filter responseCode="SERVFAIL" | stats count(*) by queryName
```

## CloudTrail 로그에 대한 쿼리
<a name="CWL_QuerySyntax-examples-CloudTrail"></a>

**각 서비스, 이벤트 유형 및 AWS 리전에 대한 로그 항목 수를 찾습니다.**

```
stats count(*) by eventSource, eventName, awsRegion
```

**지정된 AWS 리전에서 시작되거나 중지된 Amazon EC2 호스트를 찾습니다.**

```
filter (eventName="StartInstances" or eventName="StopInstances") and awsRegion="us-east-2"
```

**새로 생성된 IAM 사용자의 AWS 리전, 사용자 이름 및 ARNs 찾습니다.**

```
filter eventName="CreateUser"
    | fields awsRegion, requestParameters.userName, responseElements.user.arn
```

**API `UpdateTrail`을 간접 호출하는 중 예외가 발생한 레코드의 수를 찾습니다.**

```
filter eventName="UpdateTrail" and ispresent(errorCode)
    | stats count(*) by errorCode, errorMessage
```

**TLS 1.0 또는 1.1이 사용된 로그 항목을 찾습니다.**

```
filter tlsDetails.tlsVersion in [ "TLSv1", "TLSv1.1" ]
| stats count(*) as numOutdatedTlsCalls by userIdentity.accountId, recipientAccountId, eventSource, eventName, awsRegion, tlsDetails.tlsVersion, tlsDetails.cipherSuite, userAgent
| sort eventSource, eventName, awsRegion, tlsDetails.tlsVersion
```

**TLS 버전 1.0 또는 1.1을 사용한 서비스당 직접 호출의 수를 찾습니다.**

```
filter tlsDetails.tlsVersion in [ "TLSv1", "TLSv1.1" ]
| stats count(*) as numOutdatedTlsCalls by eventSource
| sort numOutdatedTlsCalls desc
```

## 에 대한 쿼리 Amazon API Gateway
<a name="CWL_QuerySyntax-examples-APIGateway"></a>

마지막 10개의 4XX 오류 찾기

```
fields @timestamp, status, ip, path, httpMethod
| filter status>=400 and status<=499
| sort @timestamp desc
| limit 10
```

 Amazon API Gateway 액세스 로그 그룹에서 가장 오래 실행되는 Amazon API Gateway 요청 10개 식별

```
fields @timestamp, status, ip, path, httpMethod, responseLatency
| sort responseLatency desc
| limit 10
```

 Amazon API Gateway  액세스 로그 그룹에서 가장 많이 사용되는 API 경로 목록 반환

```
stats count(*) as requestCount by path
| sort requestCount desc
| limit 10
```

 Amazon API Gateway  액세스 로그 그룹에 대한 통합 지연 시간 보고서 생성

```
filter status=200
| stats avg(integrationLatency), max(integrationLatency), 
min(integrationLatency) by bin(1m)
```

## NAT 게이트웨이에 대한 쿼리
<a name="CWL_QuerySyntax-examples-NATGateway"></a>

 AWS 청구서에서 일반 비용보다 높은 비용이 발생하는 경우 CloudWatch Logs Insights를 사용하여 상위 기여자를 찾을 수 있습니다. 다음 쿼리 명령에 대한 자세한 내용은 AWS 프리미엄 지원 페이지의 [VPC에서 NAT 게이트웨이를 통한 트래픽에 대한 상위 기여자를 찾으려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/vpc-find-traffic-sources-nat-gateway/)를 참조하세요.

**참고**  
다음 쿼리 명령에서 'x.x.x.x'를 NAT 게이트웨이의 프라이빗 IP로 바꾸고 'y.y'를 VPC CIDR 범위의 처음 두 옥텟으로 바꿉니다.

**NAT 게이트웨이를 통해 가장 많은 트래픽을 전송하는 인스턴스를 찾습니다.**

```
filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') 
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10
```

**NAT 게이트웨이의 인스턴스에서 송수신되는 트래픽을 확인합니다.**

```
filter (dstAddr like 'x.x.x.x' and srcAddr like 'y.y.') or (srcAddr like 'xxx.xx.xx.xx' and dstAddr like 'y.y.')
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10
```

**VPC 인스턴스가 업로드 및 다운로드를 위해 가장 자주 통신하는 인터넷 대상을 결정합니다.**

*****업로드용*****

```
filter (srcAddr like 'x.x.x.x' and dstAddr not like 'y.y.') 
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10
```

*****다운로드용*****

```
filter (dstAddr like 'x.x.x.x' and srcAddr not like 'y.y.') 
| stats sum(bytes) as bytesTransferred by srcAddr, dstAddr
| sort bytesTransferred desc
| limit 10
```

## Apache 서버 로그에 대한 쿼리
<a name="CWL_QuerySyntax-examples-Apache"></a>

CloudWatch Logs Insights를 사용하여 Apache 서버 로그를 쿼리할 수 있습니다. 다음 쿼리에 대한 자세한 내용은 [ Cloud Operations & Migrations 블로그의 Simplifying Apache server logs with CloudWatch Logs Insights](https://aws.amazon.com/blogs/mt/simplifying-apache-server-logs-with-amazon-cloudwatch-logs-insights/)를 참조하세요. AWS 

**가장 관련성이 높은 필드를 찾아서 액세스 로그를 검토하고 애플리케이션의 */admin* 경로에서 트래픽을 확인할 수 있습니다.**

```
fields @timestamp, remoteIP, request, status, filename| sort @timestamp desc
| filter filename="/var/www/html/admin"
| limit 20
```

**상태 코드 '200'(성공)을 사용하여 기본 페이지에 액세스한 고유 GET 요청 수를 찾습니다.**

```
fields @timestamp, remoteIP, method, status
| filter status="200" and referrer= http://34.250.27.141/ and method= "GET"
| stats count_distinct(remoteIP) as UniqueVisits
| limit 10
```

**Apache 서비스가 다시 시작된 횟수를 찾습니다.**

```
fields @timestamp, function, process, message
| filter message like "resuming normal operations"
| sort @timestamp desc
| limit 20
```

## Amazon EventBridge에 대한 쿼리
<a name="CWL_QuerySyntax-examples-EventBridge"></a>

이벤트 세부 정보 유형별로 그룹화된 EventBridge 이벤트의 수 가져오기

```
fields @timestamp, @message
| stats count(*) as numberOfEvents by `detail-type`
| sort numberOfEvents desc
```

## 구문 분석 명령의 예제
<a name="CWL_QuerySyntax-examples-parse"></a>

**glob 표현식을 사용하여 로그 필드 `@message`에서 필드 `@user`, `@method` 및 `@latency`를 추출하고 `@method` 및 `@user`의 고유한 개별 조합에 대한 평균 지연 시간을 반환합니다.**

```
parse @message "user=*, method:*, latency := *" as @user,
    @method, @latency | stats avg(@latency) by @method,
    @user
```

**정규식을 사용하여 로그 필드 `@message`에서 필드 `@user2`, `@method2` 및 `@latency2`를 추출하고 `@method2` 및 `@user2`의 고유한 개별 조합에 대한 평균 지연 시간을 반환합니다.**

```
parse @message /user=(?<user2>.*?), method:(?<method2>.*?),
    latency := (?<latency2>.*?)/ | stats avg(latency2) by @method2, 
    @user2
```

**`loggingTime`, `loggingType` 및 `loggingMessage` 필드를 추출하고 `ERROR` 또는 `INFO` 문자열이 포함된 이벤트를 기록하도록 필터링한 다음 `ERROR` 문자열이 포함된 이벤트에 대해 `loggingMessage` 및 `loggingType` 필드만 표시합니다.**

```
FIELDS @message
    | PARSE @message "* [*] *" as loggingTime, loggingType, loggingMessage
    | FILTER loggingType IN ["ERROR", "INFO"]
    | DISPLAY loggingMessage, loggingType = "ERROR" as isError
```

# (diff)를 이전 시간 범위와 비교
<a name="CWL_AnalyzeLogData_Compare"></a>

CloudWatch Logs Insights와 Logs Insights QL을 함께 사용하여 시간 경과에 따른 로그 이벤트의 변경 사항을 비교할 수 있습니다. 최근 시간 범위 동안 수집된 로그 이벤트를 직전 기간의 로그와 비교할 수 있습니다. 또는 유사한 과거 기간과 비교할 수 있습니다. 이렇게 하면 로그의 오류가 최근에 유입되었는지 또는 이미 발생하고 있었는지 확인하는 데 도움이 되고, 다른 추세를 찾는 데 도움이 될 수 있습니다.

비교 쿼리는 원시 로그 이벤트가 아니라 패턴만 결과에 반환합니다. 반환된 패턴은 시간 경과에 따른 로그 이벤트의 추세와 변경 사항을 빠르게 확인하는 데 도움이 됩니다. 비교 쿼리를 실행하고 패턴 결과를 얻은 후 관심 있는 패턴의 샘플 원시 로그 이벤트를 볼 수 있습니다. 로그 패턴에 대한 자세한 내용은 [패턴 분석](CWL_AnalyzeLogData_Patterns.md)을 참조하세요.

비교 쿼리를 실행하면 두 가지 기간(선택한 원래 쿼리 기간과 비교 기간)에 대해 쿼리가 분석됩니다. 비교 기간은 항상 원래 쿼리 기간과 길이가 동일합니다. 비교의 기본 시간 간격은 다음과 같습니다.
+ **이전 기간** - 쿼리 기간 직전의 기간과 비교합니다.
+ **전일** - 쿼리 기간 하루 전의 기간과 비교합니다.
+ **이전 주** - 쿼리 기간 1주 전의 기간과 비교합니다.
+ **이전 달** - 쿼리 기간 1개월 전의 기간과 비교합니다.

**참고**  
비교를 사용하는 쿼리에는 결합된 시간 범위에서 단일 CloudWatch Logs Insights 쿼리를 실행하는 것과 비슷한 요금이 발생합니다. 자세한 내용은 [Amazon CloudWatch 요금](https://aws.amazon.com/cloudwatch/pricing/)을 참조하세요.

**비교 쿼리를 실행하려면**

1. [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)에서 CloudWatch 콘솔을 엽니다.

1. 탐색 창에서 **로그**, **Logs Insights**를 선택합니다.

   기본 쿼리가 쿼리 상자에 나타납니다.

1. **Logs Insights QL** 탭이 선택되어 있는지 확인합니다.

1. 기본 쿼리를 유지하거나 다른 쿼리를 입력합니다.

1. **로그 그룹 선택** 드롭다운에서 쿼리할 로그 그룹을 하나 이상 선택합니다.

1. (선택 사항) 시간 간격 선택기를 사용하여 쿼리할 기간을 선택합니다. 기본 쿼리는 로그 데이터의 이전 1시간에 대한 쿼리입니다.

1. 시간 범위 선택기에서 **비교**를 선택합니다. 그런 다음 원본 로그를 비교할 이전 기간을 선택하고 **적용**을 선택합니다.

1. **쿼리 실행**을 선택합니다.

   쿼리가 비교 기간의 데이터를 가져오도록 하기 위해 `diff` 명령이 쿼리에 추가됩니다.

1. **패턴** 탭을 선택하여 결과를 확인합니다.

   테이블에는 다음과 같은 정보가 표시됩니다.
   + 패턴의 가변 부분이 동적 토큰 기호 `<string-number>`로 대체된 각 **패턴**. *string*은 토큰이 나타내는 데이터 유형에 대한 설명입니다. *number*는 다른 동적 토큰과 비교하여 패턴에서 이 토큰이 나타나는 위치를 보여줍니다. 자세한 내용은 [패턴 분석](CWL_AnalyzeLogData_Patterns.md) 단원을 참조하십시오.
   + **이벤트 개수**는 원래의 더 최근 기간에 해당 패턴이 있는 로그 이벤트의 수입니다.
   + **이벤트 수 차이**는 현재 기간과 비교 기간의 일치하는 로그 이벤트 수의 차이입니다. 양수의 차이는 현재 기간에 이러한 이벤트가 더 많다는 의미입니다.
   + **차이점 설명**은 현재 기간과 비교 기간 간 해당 패턴의 변화를 간략하게 요약합니다.
   + **심각도 유형**은 `FATAL`, `ERROR` 및 `WARN` 같은 로그 이벤트에서 발견되는 단어를 기반으로 이 패턴이 있는 로그 이벤트에서의 가능한 심각도입니다.

1. 목록의 패턴 중 하나를 추가로 검사하려면 패턴 중 하나의 **검사** 열에서 아이콘을 선택합니다.

   **패턴 검사** 창이 나타나고 다음이 표시됩니다.
   + **패턴**. 패턴 내에서 토큰을 선택하여 해당 토큰의 값을 분석합니다.
   + 쿼리된 시간 범위에서 패턴의 발생 횟수를 보여주는 히스토그램. 이는 패턴 발생의 갑작스러운 증가 등 흥미로운 추세를 식별하는 데 도움이 될 수 있습니다.
   + **로그 샘플** 탭에는 선택한 패턴과 일치하는 몇 가지 로그 이벤트가 표시됩니다.
   + **토큰 값** 탭에는 선택한 동적 토큰의 값이 표시됩니다(동적 토큰을 선택한 경우).
**참고**  
각 토큰마다 최대 10개의 토큰 값이 캡처됩니다. 토큰 개수가 정확하지 않을 수 있습니다. CloudWatch Logs는 확률 계수기를 사용하여 절대값이 아닌 토큰 개수를 생성합니다.
   + **관련 패턴** 탭에는 검사 중인 패턴과 거의 동일한 시간에 자주 발생한 다른 패턴이 표시됩니다. 예를 들어, `ERROR` 메시지의 패턴에 일반적으로 추가 세부 정보와 함께 `INFO`로 표시된 다른 로그 이벤트가 수반된 경우 해당 패턴이 여기에 표시됩니다.

# 그래프로 로그 데이터 시각화
<a name="CWL_Insights-Visualizing-Log-Data"></a>

막대 차트, 선형 차트 및 누적 영역 차트와 같은 시각화를 사용하여 로그 데이터의 패턴을 보다 효율적으로 식별할 수 있습니다. CloudWatch Logs Insights는 `stats` 함수와 집계 함수를 하나 이상 사용하는 쿼리에 대한 시각화를 생성합니다. 자세한 내용은 [통계](CWL_QuerySyntax-Stats.md)를 참조하세요.

# OpenSearch Piped Processing Language(PPL)
<a name="CWL_AnalyzeLogData_PPL"></a>

이 섹션에는 OpenSearch PPL을 사용한 CloudWatch Logs 쿼리에 대한 기본 소개가 포함되어 있습니다. PPL을 사용하면 파이프 조합 명령을 사용하여 데이터를 검색, 쿼리 및 분석할 수 있으므로 복잡한 쿼리를 더 쉽게 이해하고 구성할 수 있습니다. 구문은 Unix 파이프를 기반으로 하며 데이터를 변환하고 처리하기 위한 명령 체인을 활성화합니다. PPL을 사용하면 데이터를 필터링 및 집계하고 분석에 풍부한 수학, 문자열, 날짜, 조건부 및 기타 함수 집합을 사용할 수 있습니다.

PPL 쿼리`SOURCE`에를 포함시키는 것은 로그 그룹 필드 인덱스와 AWS CLI 또는 API를 사용하여 쿼리를 생성할 때 쿼리에 포함할 데이터 소스를 지정하는 유용한 방법입니다. `SOURCE` 명령은 CloudWatch 콘솔이 아닌 AWS CLI 및 API에서만 지원됩니다. CloudWatch 콘솔을 사용하여 쿼리를 시작할 때 콘솔 인터페이스를 사용하여 로그 그룹과 데이터 소스 이름 및 유형을 지정합니다.

`aws:fieldIndex`를 사용하여 쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 강제하여 인덱스된 데이터만 반환합니다. `filterIndex` 명령에 지정된 필드를 기반으로 관련 로그 그룹이 자동으로 선택됩니다. 이렇게 하면 쿼리에 지정된 필드가 포함된 로그 이벤트가 없는 로그 그룹을 건너뛰고이 필드 인덱스의 쿼리에 지정된 값과 일치하는 로그 그룹만 스캔하여 스캔 볼륨이 줄어듭니다. `aws:fieldIndex`를 사용하여 필드 이름을 지정하고 소스 명령의 필드 이름 및 값을 지정하여 지정된 필드 및 값이 포함된 인덱싱된 데이터만 쿼리합니다. 자세한 내용은 [쿼리 성능을 개선하고 스캔 볼륨을 줄이기 위한 필드 인덱스 생성](CloudWatchLogs-Field-Indexing.md) 섹션을 참조하세요.

표준 로그 클래스의 로그 그룹 쿼리에 OpenSearch PPL을 사용할 수 있습니다.

**참고**  
CloudWatch Logs에서 지원되는 모든 OpenSearch PPL 쿼리 명령에 대한 자세한 내용과 구문 및 제한에 대한 자세한 내용은 OpenSearch Service 개발자 가이드의 [Supported PPL commands](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-ppl.html)을 참조하세요.  
 사용할 수 있는 다른 쿼리 언어에 대한 자세한 내용은 [CloudWatch Logs Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html), [OpenSearch Service SQL](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_SQL.html) 및 [CloudWatch Metrics Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/query_with_cloudwatch-metrics-insights.html)을 참조하세요.


| 명령 또는 함수 | 예제 쿼리 | 설명 | 
| --- | --- | --- | 
|  필드 |  `fields field1, field2`  |  프로젝션이 필요한 필드 집합을 표시합니다.  | 
|  join |  `LEFT JOIN left=l, right=r on l.id = r.id `join_right_lg` \| fields l.field_1, r.field_2`  |  두 데이터세트를 함께 조인합니다.  | 
|  where |  `where field1="success" \| where field2 != "i-023fe0a90929d8822" \| fields field3, field4, field5,field6 \| head 1000`  |  지정한 조건에 따라 데이터를 필터링합니다.  | 
|  aws:fieldIndex |  `source = [`aws:fieldIndex`="region", `region` = "us-west-2"] \| where status = 200 \| head 10`  |  쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 쿼리를 강제하여 인덱싱된 데이터만 반환합니다.  | 
|  통계 |  `stats count(), count(field1), min(field1), max(field1), avg(field1) by field2 \| head 1000`  |  집계 및 계산 수행  | 
|  parse |  `parse field1 ".*/(?<field2>[^/]+$)" \| where field2 = "requestId" \| fields field1, field2 \| head 1000`  |  문자열에서 정규식 패턴을 추출하고 추출된 패턴을 표시합니다. 추출된 패턴을 사용하여 새 필드를 생성하거나 데이터를 필터링할 수 있습니다.  | 
|  sort |  `stats count(), count(field1), min(field1) as field1Alias, max(`field1`), avg(`field1`) by field2 \| sort -field1Alias \| head 1000`  |  필드 이름을 기준으로 표시된 결과를 정렬합니다. sort -FieldName을 사용하여 내림차순으로 정렬합니다.  | 
|  eval |  `eval field2 = field1 * 2 \| fields field1, field2 \| head 20`  |  필드 값을 수정 또는 처리하고 다른 필드에 저장합니다. 이는 열을 수학적으로 수정하거나, 열에 문자열 함수를 적용하거나, 열에 날짜 함수를 적용하는 데 유용합니다.  | 
|  rename |  `rename field2 as field1 \| fields field1;`  |  검색 결과에서 하나 이상의 필드 이름을 바꿉니다.  | 
|  head |  `fields `@message` \| head 20`  |  표시된 쿼리 결과를 첫 번째 N개 행으로 제한합니다.  | 
|  top |  `top 2 field1 by field2`  |  필드의 가장 빈번한 값을 찾습니다.  | 
|  dedup |  `dedup field1 \| fields field1, field2, field3`  |  지정한 필드를 기반으로 중복 항목을 제거합니다.  | 
|  rare |  `rare field1 by field2`  |  필드 목록에 있는 모든 필드의 가장 빈도가 낮은 값을 찾습니다.  | 
|  subquery |  `where field_1 IN [ search source= `subquery_lg` \| fields field_2 ] \| fields id, field_1 `  |  PPL 명령문 내에서 복잡한 중첩 쿼리를 수행합니다.  | 
|  trendline |  `trendline sma(2, field1) as field1Alias`  |  필드의 이동 평균을 계산합니다.  | 
|  eventStats |  `eventstats sum(field1) by field2`  |  계산된 요약 통계로 이벤트 데이터를 강화합니다. 이벤트 내에서 지정된 필드를 분석하고 다양한 통계 측정값을 계산한 다음 이러한 결과를 각 원래 이벤트에 새 필드로 추가합니다.  | 
|  확장 |  `eval tags_array_string = json_extract(`@message`, '$.tags')\| eval tags_array = json_array(json_extract(tags_string, '$[0]'), json_extract(tags_string, '$[1]'))\| expand tags_array as color_tags`  |  여러 값이 포함된 필드를 별도의 행으로 분할하여 지정된 필드의 각 값에 대해 새 행을 생성합니다.  | 
|  fillnull |  `fields `@timestamp`, error_code, status_code \| fillnull using status_code = "UNKNOWN", error_code = "UNKNOWN"`  |  입력한 값으로 null 필드를 채웁니다. 하나 이상의 필드에서 사용할 수 있습니다.  | 
|  평면화 |  `eval metadata_struct = json_object('size', json_extract(metadata_string, '$.size'), 'color', json_extract(metadata_string, '$.color')) \| flatten metadata_struct as (meta_size, meta_color) `  |  필드를 평면화합니다. 필드는 `struct<?,?>` 또는 `array<struct<?,?>>` 유형이어야 합니다.  | 
|  cidrmatch |  `where cidrmatch(ip, '2003:db8::/32') \| fields ip `  |  지정된 IP 주소가 지정된 CIDR 범위 내에 있는지 확인합니다. | 
|  fieldsummary |  `where field1 != 200 \| fieldsummary includefields= field1 nulls=true`  |  각 필드(개수, 고유 개수, 최소, 최대, 평균, stddev 및 평균)에 대한 기본 통계를 계산합니다.  | 
|  grok |  `grok email '.+@%{HOSTNAME:host}' \| fields email, host`  |  grok 패턴으로 텍스트 필드를 구문 분석하고 검색 결과에 결과를 추가합니다.  | 
|  문자열 함수 |  `eval field1Len = LENGTH(field1) \| fields field1Len`  |  PPL 쿼리 내에서 문자열 및 텍스트 데이터를 조작하고 변환할 수 있는 PPL의 내장 함수입니다. 예를 들어, 변환 사례, 문자열 결합, 부분 추출, 텍스트 정리 등이 있습니다.  | 
|  날짜/시간 함수 |  `eval newDate = ADDDATE(DATE('2020-08-26'), 1) \| fields newDate `  |  PPL 쿼리에서 날짜 및 타임스탬프 데이터를 처리하고 변환하기 위한 내장 함수입니다. 예: date\$1add, date\$1format, datediff, date-sub, timestampadd, timestampdiff, current\$1timezone, utc\$1timestamp, current\$1date  | 
|  조건 함수 |  `eval field2 = isnull(field1) \| fields field2, field1, field3`  |  특정 필드 조건을 확인하고 조건부로 표현식을 평가하는 내장 함수입니다. 예를 들어, field1이 null인 경우 field2를 반환합니다.  | 
|  수학 함수 |  `eval field2 = ACOS(field1) \| fields field1`  |  PPL 쿼리에서 수학 계산 및 변환을 수행하기 위한 내장 함수입니다. 예: abs(절대값), round(숫자 반올림), sqrt(제곱근), pow(검정력 계산), ceil(가장 가까운 정수로 반올림)  | 
|  CryptoGraphic 함수 |  `eval crypto = MD5(field)\| head 1000`  |  지정된 필드의 해시를 계산하려면  | 
|  JSON 함수 |  `eval valid_json = json('[1,2,3,{"f1":1,"f2":[5,6]},4]') \| fields valid_json`  |  배열, 추출 및 검증을 포함하여 JSON을 처리하기 위한 내장 함수입니다. 예: json\$1object, json\$1array, to\$1json\$1string, json\$1array\$1length, json\$1extract, json\$1keys 및 json\$1valid   | 

## 쿼리 범위
<a name="CWL_AnalyzeLogData_PPL-scope"></a>

쿼리에 SOURCE를 포함시키는 것은 AWS CLI 또는 API를 사용하여 쿼리를 생성할 때 쿼리에 포함할 로그 그룹을 지정하는 유용한 방법입니다. SOURCE 명령은 CloudWatch 콘솔이 아닌 AWS CLI 및 API에서만 지원됩니다. CloudWatch 콘솔을 사용하여 쿼리를 시작할 때 콘솔 인터페이스를 사용하여 로그 그룹과 데이터 소스 이름 및 유형을 지정합니다.

PPL의 소스 명령은 이제 여러 가지 방법으로 지정할 수 있습니다.

1. 로그 그룹:

1. 필드 인덱스 - 신규

1. 데이터 소스 및 유형 - 신규

### 로그 그룹
<a name="CWL_AnalyzeLogData_PPL-scope-loggroup"></a>

로그 그룹 소스 선택은 고객이 검색해야 하는 정확한 로그 그룹(들)을 알 때 사용할 수 있습니다.

```
source = [lg:`/aws/lambda/my-function`] | where status = 200 | head 10
```

### 필드 인덱스
<a name="CWL_AnalyzeLogData_PPL-scope-fieldindex"></a>

필드 인덱스 기반 소스 선택은 인덱싱된 필드를 필터링할 때 결과를 인덱싱된 데이터로만 제한하여 쿼리되는 데이터의 양을 줄입니다. `filterIndex` 명령에 지정된 필드를 기반으로 관련 로그 그룹이 자동으로 선택됩니다. 필드 인덱스 및 필드 인덱스 생성 방법에 대한 자세한 내용은 [필드 인덱스 생성을 참조하여 쿼리 성능을 개선하고 스캔 볼륨을 줄입니다](CloudWatchLogs-Field-Indexing.md).

`aws:fieldIndex`를 사용하여 쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 강제하여 인덱스된 데이터만 반환합니다. 해당 필드에 인덱싱된 이러한 로그 그룹의 경우, 인덱싱된 필드의 쿼리에 지정된 필드가 포함된 로그 이벤트가 없는 로그 그룹을 건너뛰어 쿼리를 추가로 최적화합니다. 또한 해당 필드 인덱스의 쿼리에 지정된 값과 일치하는 이러한 로그 그룹의 로그 이벤트만 스캔하려고 시도하여 스캔 볼륨을 줄입니다. 필드 인덱스 및 필드 인덱스 생성 방법에 대한 자세한 내용은 필드 인덱스 생성을 참조하여 쿼리 성능을 개선하고 스캔 볼륨을 줄입니다.

PPL에서 `aws:fieldIndex`는 인덱스로 처리해야 하는 키 값 페어를 지정하는 데 사용됩니다. 구문은 다음과 같습니다.

```
source = [`aws:fieldIndex`="region", `region` = "us-west-2"] | where status = 200 | head 10
```

여기서 각 항목은 다음과 같습니다.

1. ``aws:fieldIndex`="region"`는 리전을 필드 인덱스로 식별합니다.

   1. 참고: 대신 = 고객이 IN을 사용하여 여러 인덱스를 지정할 수 있음(아래 예)

1. ``region`="us-west-2"` 적용할 필터 조건을 식별합니다.

   1. 참고: 대신 = 고객이 IN을 사용하여 여러 값을 지정할 수 있음(아래 예)

고객은 다음과 같이 여러 fieldIndexes를 지정할 수 있습니다.

```
source = [`aws:fieldIndex` IN ("status", "region"), `status` = 200, `region` IN ("us-west-2", "us-east-1")] | head 10
```

### 데이터 소스 및 유형
<a name="CWL_AnalyzeLogData_PPL-scope-datasource"></a>

데이터 소스 및 유형 기반 소스 선택은 고객이 쿼리해야 하는 정확한 데이터 소스를 알 때 사용할 수 있습니다. 이 쿼리는 지정된 데이터 소스 및 유형이 포함된 하나 이상의 로그 그룹을 통해 실행됩니다.

```
source = [ds:`data_source.type`] | where status = 200 | head 10
```

#### 데이터 소스 쿼리에 지원되는 PPL
<a name="CWL_AnalyzeLogData_PPL-scope-datasource-supported"></a>

PPL에서 데이터 소스를 쿼리하는 사용 사례를 지원하기 위해 동적 소스 선택기 절을 사용할 수 있습니다. 이 구문을 사용하면 검색 명령에 지정하여 데이터 소스를 쿼리할 수 있습니다. 최대 10개의 데이터 소스를 지정할 수 있습니다.

**구문**

```
source=[ds:`DataSource1.Type1`, ds:`DataSource2.Type2`, ...ds:`DataSourcen.Typen`]
```

**쿼리 예**

```
search source=[ds:`DataSource1.Type1`, ds:`DataSource2.Type2`] | fields field1, field2
```

### 결합된 예제
<a name="CWL_AnalyzeLogData_PPL-scope-combined"></a>

고객은 어떤 순서로든 모든 소스 선택 연산자를 지정할 수 있으며, 결과는 적용된 모든 조건의 교차점입니다.

예를 들어 /aws/lambda/my-function-1에는 다양한 인덱스를 포함한 여러 데이터 소스 및 유형이 포함될 수 있습니다. 다음 쿼리가 실행되면 반환된 결과에는 소스 및 유형 DataSource1.Type1의 이벤트만 있으며 'status' = 200의 기준과 일치합니다.

```
search source=[
    ds:`DataSource1.Type1`, 
    lg:`/aws/lambda/my-function-1`, 
    `aws:fieldIndex` IN ("status"), `status` = 200 
]
```

## 제한 사항
<a name="CWL_AnalyzeLogData_PPL-restrictions"></a>

OpenSearch PPL을 사용하여 CloudWatch Logs Insights에서 쿼리할 때 다음 제한 사항이 적용됩니다.
+ 데이터 소스 쿼리에는 조인 또는 하위 쿼리 명령을 사용할 수 없습니다.

# OpenSearch Structured Query Language(SQL)
<a name="CWL_AnalyzeLogData_SQL"></a>

이 섹션에는 OpenSearch SQL을 사용한 CloudWatch Logs 쿼리에 대한 기본 소개가 포함되어 있습니다. 관계형 데이터베이스로 작업하는 데 익숙한 옵션을 제공합니다. OpenSearch SQL은 SQL 기능의 하위 집합을 제공하므로 임시 쿼리 및 데이터 분석 작업을 수행하는 데 적합합니다. OpenSearch SQL을 사용하면 SELECT, FROM, WHERE, GROUP BY, HAVING 및 기타 다양한 SQL 명령 및 함수와 같은 명령을 사용할 수 있습니다. 로그 그룹 간에 조인하고, 하위 쿼리를 사용하여 로그 그룹 간에 데이터를 상호 연관시키고, 풍부한 JSON, 수학, 문자열, 조건부 및 기타 SQL 함수 집합을 사용하여 로그 및 보안 데이터에 대한 강력한 분석을 수행할 수 있습니다.

`filterIndex`를 사용하여 쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 강제하여 인덱스된 데이터만 반환합니다. 쿼리에 지정된 필드가 포함된 로그 이벤트가 없는 로그 그룹을 건너뛰고이 필드 인덱스의 쿼리에 지정된 값과 일치하는 로그 그룹만 스캔하여 스캔 볼륨을 줄입니다. `filterIndex`를 사용하여 필드 이름을 지정하고 필드 이름 및 값을 지정하여 지정된 필드와 값이 포함된 인덱싱된 데이터만 쿼리합니다.

표준 로그 클래스의 로그 그룹 쿼리에 OpenSearch SQL을 사용할 수 있습니다. SQL은 데이터 소스 이름 및 데이터 소스 유형을 사용한 쿼리도 지원합니다.

**참고**  
다음 표에는 CloudWatch Logs에서 지원되는 SQL 명령 및 함수가 나열되어 있습니다. 구문을 포함한 모든 OpenSearch SQL 명령에 대한 자세한 내용은 OpenSearch Service 개발자 가이드의 [지원되는 SQL 명령](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/supported-directquery-sql.html)을 참조하세요.  
사용할 수 있는 다른 쿼리 언어에 대한 자세한 내용은[CloudWatch Logs Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html), [OpenSearch Service PPL](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_AnalyzeLogData_PPL.html) 및 [CloudWatch Metrics Insights](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/query_with_cloudwatch-metrics-insights.html)를 참조하세요.

## 지원되는 SQL 명령
<a name="CWL_AnalyzeLogData_SQL-table"></a>

**참고**  
예제 쿼리 열에서 쿼리하려는 데이터 소스에 따라 필요에 따라 `<logGroup>`을 바꿉니다.


| 명령 또는 함수 | 예제 쿼리 | 설명 | 
| --- | --- | --- | 
|  SELECT |  `SELECT `@message`, Operation FROM `LogGroupA``  |  프로젝션된 값을 표시합니다.  | 
|  FROM |  `SELECT `@message`, Operation FROM `LogGroupA``  |  다양한 유형의 조인 및 하위 쿼리를 지원하여 데이터를 검색할 소스 테이블 또는 보기를 지정하는 기본 제공 절입니다.  | 
|  WHERE |  `SELECT * FROM `LogGroupA` WHERE Operation = 'x'`  |  제공된 필드 기준에 따라 로그 이벤트를 필터링합니다.  | 
|  filterIndex |  `SELECT * FROM `filterIndex('region' = 'us-east-1')` WHERE status = 200 LIMIT 10;`  |  쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 쿼리를 강제하여 인덱싱된 데이터만 반환합니다.  | 
|  GROUP BY |  `SELECT `@logStream`, COUNT(*) as log_count FROM `LogGroupA` GROUP BY `@logStream``  | 카테고리를 기반으로 로그 이벤트를 그룹화하고 통계를 기반으로 평균을 찾습니다.  | 
|  HAVING |  `SELECT `@logStream`, COUNT(*) as log_count FROM `LogGroupA` GROUP BY `@logStream` HAVING log_count > 100`  |  그룹화 조건을 기준으로 결과를 필터링합니다.  | 
|  ORDER BY |  `SELECT * FROM `LogGroupA` ORDER BY `@timestamp` DESC`  |  ORDER BY 절의 필드를 기반으로 결과를 정렬합니다. 내림차순 또는 오름차순으로 정렬할 수 있습니다.  | 
|  JOIN |  `SELECT A.`@message`, B.`@timestamp`FROM `LogGroupA` as A INNER JOIN `LogGroupB` as B ON A.`requestId` = B.`requestId``  |  공통 필드를 기반으로 두 테이블의 결과를 조인합니다. 내부 조인 또는 왼쪽 외부 조인을 지정해야 합니다.  | 
|  LIMIT |  `Select * from `LogGroupA` limit 10`  |  표시된 쿼리 결과를 첫 번째 N개 행으로 제한합니다.  | 
|  문자열 함수 |  `SELECT upper(Operation) , lower(Operation), Operation FROM `LogGroupA``  |  SQL 쿼리 내에서 문자열 및 텍스트 데이터를 조작하고 변환할 수 있는 SQL의 내장 함수입니다. 예를 들어, 변환 사례, 문자열 결합, 부분 추출, 텍스트 정리 등이 있습니다.  | 
|  날짜 함수 |  `SELECT current_date() as today, date_add(current_date(), 30) as thirty_days_later, last_day(current_date()) as month_end FROM `LogGroupA``  |  SQL 쿼리에서 날짜 및 타임스탬프 데이터를 처리하고 변환하기 위한 내장 함수입니다. 예: date\$1add, date\$1format, datediff, current\$1date  | 
|  조건 함수 |  `SELECT Operation, IF(Error > 0, 'High', 'Low') as error_category FROM `LogGroupA`;`  |  지정된 조건을 기반으로 작업을 수행하거나 조건부로 표현식을 평가하는 내장 함수입니다. 예: CASE 및 IF  | 
|  집계 함수 |  `SELECT AVG(bytes) as bytesWritten FROM `LogGroupA``  |  여러 행에서 계산을 수행하여 단일 요약 값을 생성하는 내장 함수입니다. 예: SUM, COUNT, AVG, MAX 및 MIN  | 
|  JSON 함수 |  `SELECT get_json_object(json_column, '$.name') as name FROM `LogGroupA``  |  데이터세트에서 JSON 구조를 조작할 수 있도록 SQL 쿼리(예: from\$1json, to\$1json, get\$1json\$1object, json\$1tuple) 내에서 JSON 형식의 데이터를 구문 분석, 추출, 수정 및 쿼리하는 기본 제공 함수입니다.  | 
|  배열 함수 |  `SELECT scores, size(scores) as length, array_contains(scores, 90) as has_90 FROM `LogGroupA`;`  |  SQL 쿼리에서 배열 유형 열로 작업하기 위한 내장 함수를 사용하면 배열 데이터 액세스, 수정 및 분석과 같은 연산(예: size, explode, array\$1contains)을 수행할 수 있습니다.  | 
|  윈도우 함수 |  `SELECT field1, field2, RANK() OVER (ORDER BY field2 DESC) as field2Rank FROM `LogGroupA`;`  |  현재 행(윈도우)과 관련된 지정된 행 세트에서 계산을 수행하여 순위, 합계 실행 및 이동 평균과 같은 연산을 활성화하는 내장 함수입니다. 예: ROW\$1NUMBER, RANK, LAG 및 LEAD  | 
|  변환 함수 |  `SELECT CAST('123' AS INT) as converted_number, CAST(123 AS STRING) as converted_string FROM `LogGroupA``  |  SQL 쿼리 내에서 데이터를 한 유형에서 다른 유형으로 변환하여 데이터 유형 변환 및 형식 변환을 지원하는 내장 함수. 예: CAST, TO\$1DATE, TO\$1TIMESTAMP 및 BINARY  | 
|  조건자 함수 |  `SELECT scores, size(scores) as length, array_contains(scores, 90) as has_90 FROM `LogGroupA`;`  |  조건을 평가하고 지정된 기준 또는 패턴에 따라 부울 값(true/false)을 반환하는 내장 함수입니다. 예: IN, LIKE, BETWEEN, IS NULL 및 EXISTS  | 
|  여러 로그 그룹 선택 |  `SELECT lg1.field1, lg1.field2 from `logGroups( logGroupIdentifier: ['LogGroup1', 'LogGroup2'])` as lg1 where lg1.field3= "Success"`  |  SELECT 명령문에서 여러 로그 그룹 지정 가능  | 
|  여러 데이터 소스 선택 |  `SELECT ds1.field1, ds1.field2 from `dataSource(['DataSource1', 'DataSource2'])` as ds1 where ds1.field3= "Success"`  |  SELECT 문에서 여러 데이터 소스를 지정할 수 있습니다.  | 

## multi-log-group 쿼리에 지원되는 SQL
<a name="CWL_AnalyzeLogData_SQL-multi"></a>

SQL에서 여러 로그 그룹을 쿼리하는 사용 사례를 지원하려면 `logGroups` 명령을 사용할 수 있습니다. 이 구문을 사용하여 FROM 명령에 지정하여 여러 로그 그룹을 쿼리할 수 있습니다.

구문:

```
`logGroups(
    logGroupIdentifier: ['LogGroup1','LogGroup2', ...'LogGroupn']
)
```

이 구문에서는 `logGroupIdentifier` 파라미터에 최대 50개의 로그 그룹을 지정할 수 있습니다. 모니터링 계정의 로그 그룹을 참조하려면 `LogGroup` 이름 대신 ARN을 사용합니다.

예제 쿼리:

```
SELECT LG1.Column1, LG1.Column2 from `logGroups(
    logGroupIdentifier: ['LogGroup1', 'LogGroup2']
)` as LG1 WHERE LG1.Column1 = 'ABC'
```

CloudWatch Logs를 쿼리할 때 `FROM` 명령문 뒤에 여러 로그 그룹이 포함된 다음 구문은 지원되지 않습니다.

```
SELECT Column1, Column2 FROM 'LogGroup1', 'LogGroup2', ...'LogGroupn'
WHERE Column1 = 'ABC'
```

## 데이터 소스 쿼리에 지원되는 SQL
<a name="CWL_AnalyzeLogData_SQL-data-source"></a>

 SQL에서 데이터 소스를 쿼리하는 사용 사례를 지원하려면 dataSource 명령을 사용하면 됩니다. 이 구문을 사용하면 `FROM` 명령에서 데이터 소스를 지정하여 쿼리할 수 있습니다. 최대 10개의 데이터 소스를 지정할 수 있습니다.

**구문**

```
`dataSource(
    ['DataSource1', 'DataSource2', ...'DataSourcen']
)`
```

**쿼리 예제 **

```
SELECT DS1.Column1, DS1.Column2 from `dataSource(
    ['DataSource1', 'DataSource2']
)` as DS1 WHERE DS1.Column1 = 'ABC'
```

## 쿼리 범위
<a name="CWL_AnalyzeLogData_SQL-scope"></a>

 AWS CLI 및 API에서 로그 그룹, 데이터 소스 및 유형, 필드 인덱스를 사용하여 쿼리할 로그를 지정할 수 있습니다.

### 로그 그룹
<a name="CWL_AnalyzeLogData_SQL-scope-loggroup"></a>

로그 그룹 소스 선택은 고객이 검색해야 하는 정확한 로그 그룹(들)을 알 때 사용할 수 있습니다.

```
SELECT * FROM `logGroups(logGroupIdentifier: ['/aws/lambda/my-function'])`;
```

### 데이터 소스 및 유형
<a name="CWL_AnalyzeLogData_SQL-scope-datasource"></a>

고객은 데이터 소스 이름 및 데이터 소스 유형을 사용하여 로그를 쿼리할 수 있습니다.

데이터 소스 및 유형 기반 소스 선택은 고객이 쿼리해야 하는 정확한 데이터 소스를 알 때 사용할 수 있습니다. 이 쿼리는 지정된 데이터 소스 및 유형이 포함된 하나 이상의 로그 그룹을 통해 실행됩니다.

SQL에서 데이터 소스를 쿼리하는 사용 사례를 지원하려면 dataSource 명령을 사용하면 됩니다. 이 구문을 사용하면 FROM 명령에 지정하여 데이터 소스를 쿼리할 수 있습니다. 최대 10개의 데이터 소스를 지정할 수 있습니다.

구문:

```
`dataSource(
    ['DataSource1.Type1', 'DataSource2.Type2', ...'DataSourcen.Typen']
)`
```

예제 쿼리:

```
SELECT DS1.Column1, DS1.Column2 from `dataSource(
    ['DataSource1.Type1', 'DataSource2.Type2']
)` as DS1 WHERE DS1.Column1 = 'ABC'
```

데이터 소스별 쿼리에 대한 자세한 내용은 섹션을 참조하세요[패싯을 사용하여 로그 그룹화 및 탐색](CloudWatchLogs-Facets.md).

### 결합된 예제
<a name="CWL_AnalyzeLogData_SQL-scope-combined"></a>

고객은 백틱 내의 모든 소스 선택 연산자를 어떤 순서로든 지정할 수 있으며 결과는 적용된 모든 조건의 교차점을 기반으로 합니다.

예를 들어 /aws/lambda/my-function-1에는 다양한 인덱스를 포함한 여러 데이터 소스 및 유형이 포함될 수 있습니다. 다음 쿼리가 실행되면 반환된 결과에는 소스 및 유형 DataSource1.Type1의 이벤트만 있으며 'status' = 200의 기준과 일치합니다.

```
SELECT * FROM `
   logGroups(logGroupIdentifier: ['/aws/lambda/my-function'])
   filterIndex('status' = 200)
   dataSource(['DataSource1.Type1'])
`;
```

### 필드 인덱스
<a name="CWL_AnalyzeLogData_SQL-scope-fieldindex"></a>

필드 인덱스 기반 소스 선택은 필터가 인덱싱된 필드를 대상으로 할 때 관련 로그 그룹을 자동으로 식별하여 스캔 볼륨과 쿼리 런타임을 줄입니다.

`filterIndex`를 사용하여 쿼리에서 지정한 필드에 인덱싱된 로그 그룹만 검색하도록 강제하여 인덱스된 데이터만 반환합니다. 해당 필드에 인덱싱된 이러한 로그 그룹의 경우, 인덱싱된 필드의 쿼리에 지정된 필드가 포함된 로그 이벤트가 없는 로그 그룹을 건너뛰어 쿼리를 추가로 최적화합니다. 또한 해당 필드 인덱스의 쿼리에 지정된 값과 일치하는 이러한 로그 그룹의 로그 이벤트만 스캔하려고 시도하여 스캔 볼륨을 줄입니다. 필드 인덱스 및 필드 인덱스 생성 방법에 대한 자세한 내용은 [필드 인덱스 생성을 참조하여 쿼리 성능을 개선하고 스캔 볼륨을 줄입니다](CloudWatchLogs-Field-Indexing.md).

SQL에서 filterIndex는 인덱스로 처리해야 하는 키 값 페어를 지정하는 데 사용됩니다. 구문은 다음과 같습니다.

```
SELECT * FROM `filterIndex('region' = 'us-east-1')`;
```

여기서 각 항목은 다음과 같습니다.

1. filterIndex(...)는 그 안에 있는 키 값을 필드 인덱스로 취급하도록 지정합니다. 각 키 값 페어는 쉼표로 구분됩니다(아래 예).

1. 'region' = 'us-east-1'은 적용할 실제 조건을 지정합니다.

   1. 참고: 대신 = 고객이 IN을 사용하여 여러 값을 지정할 수 있음(아래 예)

여러 filterIndex를 사용하면 "AND"를 사용하여 조건을 결합합니다. 이 예에서는 로그 일치 상태=200이고 us-east-1 또는 us-west-2의 리전이 쿼리됩니다.

```
SELECT * FROM `filterIndex('status' = 200, 'region' IN ['us-east-1', 'us-west-2'])`;
```

## 제한 사항
<a name="CWL_AnalyzeLogData_SQL-restrictions"></a>

OpenSearch SQL을 사용하여 CloudWatch Logs Insights에서 쿼리할 때 다음 제한 사항이 적용됩니다.
+ SELECT 명령문에는 JOIN을 하나만 포함할 수 있습니다.
+ JOIN 또는 하위 쿼리는 데이터 소스 쿼리와 함께 사용할 수 없습니다.
+ 중첩 하위 쿼리는 한 수준만 지원됩니다.
+ 세미콜론(;)으로 구분된 여러 명령문 쿼리는 지원되지 않습니다.
+ 동일하지만 경우에 따라서만 다른 필드 이름을 포함하는 쿼리(예: field1 및 FIELD1)는 지원되지 않습니다.

  예를 들어, 다음 쿼리는 지원되지 않습니다.

  ```
  Select AWSAccountId, AwsAccountId from LogGroup
  ```

  그러나 필드 이름(`@logStream`)이 두 로그 그룹에서 동일하기 때문에 다음 쿼리가 지원됩니다.

  ```
  Select a.`@logStream`, b.`@logStream` from Table A INNER Join Table B on a.id = b.id
  ```
+ 함수와 표현식은 필드 이름에서 작동해야 하며 FROM 절에 지정된 로그 그룹이 있는 SELECT 명령문의 일부여야 합니다.

  예를 들어 다음 쿼리는 지원되지 않습니다.

  ```
  SELECT cos(10) FROM LogGroup
  ```

  이 쿼리는 다음과 같이 지원됩니다.

  ```
  SELECT cos(field1) FROM LogGroup
  ```
+ SQL 또는 PPL 명령을 사용하는 경우 특정 필드를 백틱에 묶어 성공적으로 쿼리합니다. 백틱은 특수 문자(비영문자 및 비숫자)가 있는 필드에 필요합니다. 예를 들어, 백틱에서 `@message`, `Operation.Export` 및 `Test::Field`을 묶습니다. 순전히 알파벳 이름의 필드를 백틱으로 묶을 필요는 없습니다.

  간단한 필드가 있는 예제 쿼리:

  ```
  SELECT SessionToken, Operation, StartTime  FROM `LogGroup-A`
  LIMIT 1000;
  ```

  백틱이 추가된 유사한 쿼리:

  ```
  SELECT `@SessionToken`, `@Operation`, `@StartTime`  FROM `LogGroup-A` LIMIT 1000;
  ```