

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

# 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
```