Date processor
출처: 문서
본문
Date 프로세서
date 프로세서는 이벤트에 기본 타임스탬프를 추가하고, 타임스탬프 필드를 파싱하며, 타임스탬프 정보를 국제표준화기구(ISO) 8601 형식으로 변환해요. 이 타임스탬프 정보는 이벤트 타임스탬프로 사용할 수 있어요.
구성
다음 표는 date 프로세서를 구성할 때 사용할 수 있는 옵션을 설명해요.
| 옵션 | 필수 여부 | 타입 | 설명 |
|---|---|---|---|
match |
조건부 | Match | 날짜 매치 구성이에요. 이 옵션은 from_time_received와 동시에 정의할 수 없어요. 기본값이 없어요. |
from_time_received |
조건부 | Boolean | true이면, 소스가 이벤트를 수신한 시각을 뜻하는 이벤트 메타데이터의 타임스탬프가 이벤트 데이터에 추가돼요. 이 옵션은 match와 동시에 정의할 수 없어요. 기본값은 false예요. |
date_when |
아니요 | String | date 프로세서가 매칭을 수행할 조건을 지정해요. 기본값은 조건 없음이에요. |
to_origination_metadata |
아니요 | Boolean | true이면, 매치된 시각이 Instant 인스턴스로 이벤트의 메타데이터에도 추가돼요. 기본값은 false예요. |
destination |
아니요 | String | date 프로세서가 파싱한 타임스탬프를 저장하는 데 사용되는 필드예요. match 및 from_time_received와 함께 사용할 수 있어요. 기본값은 @timestamp예요. |
output_format |
아니요 | String | 이벤트에 추가되는 타임스탬프의 형식을 결정해요. 기본값은 yyyy-MM-dd'T'HH:mm:ss.SSSXXX예요. |
source_timezone |
아니요 | String | 날짜를 파싱할 때 사용하는 시간대예요. 값에서 시간대나 오프셋을 추출할 수 없는 경우에도 사용돼요. 값에 시간대나 오프셋이 포함되어 있다면 이 시간대는 무시돼요. 사용 가능한 모든 시간대 목록은 데이터베이스 시간대 목록의 TZ database name 열에 있어요. |
destination_timezone |
아니요 | String | destination 필드에 타임스탬프를 저장할 때 사용하는 시간대예요. 사용 가능한 모든 시간대 목록은 데이터베이스 시간대 목록의 TZ database name 열에 있어요. |
locale |
아니요 | String | 날짜를 파싱할 때 사용하는 로캘이에요. 주로 월 이름(MMM)을 파싱할 때 사용돼요. 값은 en-US처럼 IETF BCP 47 형식의 언어, 국가, 변형(variant) 필드를 포함할 수 있고, en_US처럼 locale 객체의 문자열 표현일 수도 있어요. 언어, 국가, 변형을 포함한 로캘 필드의 전체 목록은 언어 서브태그 레지스트리에서 확인할 수 있어요. 기본값은 Locale.ROOT예요. |
Match
| 옵션 | 필수 여부 | 타입 | 설명 |
|---|---|---|---|
key |
예 | String | 패턴을 매치할 대상이 되는 이벤트 키를 나타내요. match가 구성되어 있으면 필수예요. |
patterns |
예 | List | 키의 타임스탬프 값이 가질 수 있는 패턴 목록이에요. 패턴은 문자와 기호의 나열을 기반으로 해요. patterns는 Java DatetimeFormatter 참조 문서에 나열된 모든 패턴을 지원해요. 타임스탬프 값은 타임스탬프를 에포크 이후 경과한 초, 밀리초, 나노초 수로 나타내는 epoch_second, epoch_milli, epoch_nano 값도 지원해요. 에포크 값은 항상 UTC 시간대를 사용해요. |
메트릭
다음 표는 공통 Abstract processor 메트릭을 설명해요.
| 메트릭 이름 | 타입 | 설명 |
|---|---|---|
recordsIn |
Counter | 파이프라인 컴포넌트로 레코드가 유입되는 것을 나타내는 메트릭이에요. |
recordsOut |
Counter | 파이프라인 컴포넌트에서 레코드가 나가는 것을 나타내는 메트릭이에요. |
timeElapsed |
Timer | 파이프라인 컴포넌트 실행 중 경과한 시간을 나타내는 메트릭이에요. |
date 프로세서에는 다음과 같은 커스텀 메트릭이 포함되어 있어요.
dateProcessingMatchSuccessCounter:match configuration옵션에서 지정한 패턴 중 최소 하나라도 매치된 레코드 수를 반환해요.dateProcessingMatchFailureCounter:patterns match구성 옵션에서 지정한 패턴 중 어느 것에도 매치되지 않은 레코드 수를 반환해요.
패턴 참조
다음 표는 자주 사용되는 DateTime 패턴을 보여줘요.
| Pattern | Example | Description |
|---|---|---|
yyyy-MM-dd'T'HH:mm:ss.SSSXXX |
2023-03-15T14:30:45.123-05:00 |
시간대가 포함된 ISO 8601 형식 |
dd/MMM/yyyy:HH:mm:ss Z |
15/Mar/2023:14:30:45 -0500 |
Apache Common Log Format |
MMM dd HH:mm:ss |
Mar 15 14:30:45 |
Syslog 형식 |
yyyy-MM-dd HH:mm:ss |
2023-03-15 14:30:45 |
표준 SQL 형식 |
MM/dd/yyyy HH:mm:ss |
03/15/2023 14:30:45 |
미국 형식 |
에포크 패턴
다음 표는 지원되는 에포크 패턴을 보여줘요.
| Pattern | Description | Example value |
|---|---|---|
epoch_second |
Unix 에포크(1970-01-01 00:00:00 UTC) 이후 경과한 초 |
1678902000 |
epoch_milli |
Unix 에포크 이후 경과한 밀리초 | 1678902000123 |
epoch_micro |
Unix 에포크 이후 경과한 마이크로초 | 1678902000123456 |
epoch_nano |
Unix 에포크 이후 경과한 나노초 | 1678902000123456789 |
패턴 목록 하나당 에포크 패턴은 하나만 허용돼요. 여러 에포크 형식을 지원하려면 별도의 date 프로세서를 사용하세요. {: .note}
예제
다음은 다양한 구성의 예제예요.
이 예제는 보안을 사용하지 않으며 데모 목적으로만 제공돼요. 프로덕션에서 이 예제를 사용하기 전에 SSL을 구성하는 것을 강력히 권장해요. {: .warning}
수집 시간을 사용해 이벤트에 기본 타임스탬프 추가하기
다음 date 프로세서 구성은 모든 이벤트에 적용되는 @timestamp 필드에 기본 타임스탬프를 추가하는 데 사용할 수 있어요:
date-ingestion-pipeline:
source:
http:
path: /events
ssl: false
processor:
- date:
from_time_received: true
destination: "@timestamp"
sink:
- opensearch:
hosts: ["https://opensearch:9200"]
insecure: true
username: admin
password: admin_pass
index_type: custom
index: date-ingestion-%{yyyy.MM.dd}
{% include copy.html %}
다음 명령어로 이 파이프라인을 테스트할 수 있어요:
curl -sS -X POST "http://localhost:2021/events" \
-H "Content-Type: application/json" \
-d '[
{"app":"web-server","env":"prod","message":"User login successful","level":"info","user_id":"12345"},
{"app":"database","env":"stage","message":"Connection timeout","level":"error","retry_count":3},
{"app":"api-gateway","env":"dev","message":"Request processed","level":"debug","response_time_ms":145}
]'
{% include copy.html %}
OpenSearch에 저장된 문서에는 다음 정보가 포함되어 있어요:
{
...
"hits": {
"total": {
"value": 3,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "date-ingestion-2025.10.13",
"_id": "984A3ZkBoQvfnsgqa4od",
"_score": 1,
"_source": {
"app": "web-server",
"env": "prod",
"message": "User login successful",
"level": "info",
"user_id": "12345",
"@timestamp": "2025-10-13T09:56:23.090Z"
}
},
{
"_index": "date-ingestion-2025.10.13",
"_id": "-M4A3ZkBoQvfnsgqa4od",
"_score": 1,
"_source": {
"app": "database",
"env": "stage",
"message": "Connection timeout",
"level": "error",
"retry_count": 3,
"@timestamp": "2025-10-13T09:56:23.095Z"
}
},
{
"_index": "date-ingestion-2025.10.13",
"_id": "-c4A3ZkBoQvfnsgqa4od",
"_score": 1,
"_source": {
"app": "api-gateway",
"env": "dev",
"message": "Request processed",
"level": "debug",
"response_time_ms": 145,
"@timestamp": "2025-10-13T09:56:23.096Z"
}
}
]
}
}
타임스탬프를 파싱해 형식과 시간대 변환하기
다음 예제는 여러 프로세서를 사용해 date 프로세서가 에포크 밀리초, 에포크 초, ISO 8601, Apache Common Log Format 같은 서로 다른 타임스탬프 형식을 순차적으로 파싱하는 방법을 보여줘요. 각 프로세서는 하나의 특정 형식을 처리해요:
date-multi-format-pipeline:
source:
http:
path: /events
ssl: false
processor:
# Handle epoch formats (separate processors for different epoch types)
- date:
match:
- key: event_time
patterns: ["epoch_milli"]
destination: "@timestamp"
output_format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX
source_timezone: UTC
destination_timezone: America/New_York
locale: en_US
date_when: "/event_time != null"
- date:
match:
- key: event_time
patterns: ["epoch_second"]
destination: "@timestamp"
output_format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX
source_timezone: UTC
destination_timezone: America/New_York
locale: en_US
date_when: "/event_time != null and /@timestamp == null"
# Handle ISO format variations in a single processor
- date:
match:
- key: event_time
patterns: ["yyyy-MM-dd'T'HH:mm:ss.SSSXXX"]
destination: "@timestamp"
output_format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX
source_timezone: UTC
destination_timezone: America/New_York
locale: en_US
date_when: "/event_time != null and /@timestamp == null"
# Handle Apache format variations in a single processor
- date:
match:
- key: event_time
patterns: ["dd/MMM/yyyy:HH:mm:ss Z"]
destination: "@timestamp"
output_format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX
source_timezone: UTC
destination_timezone: America/New_York
locale: en_US
date_when: "/event_time != null and /@timestamp == null"
sink:
- opensearch:
hosts: ["https://opensearch:9200"]
insecure: true
username: admin
password: admin_pass
index_type: custom
index: date-multi-format-%{yyyy.MM.dd}
{% include copy.html %}
다음 명령어로 이 파이프라인을 테스트할 수 있어요:
curl -sS -X POST "http://localhost:2021/events" \
-H "Content-Type: application/json" \
-d '[
{"app":"payment-service","event_time":"1678902000123","transaction_id":"txn_001","amount":99.99,"currency":"USD"},
{"app":"user-service","event_time":"1678902000","user_id":"user_123","action":"login","ip":"192.168.1.100"},
{"app":"analytics","event_time":"2023-03-15T14:30:45.123-05:00","event_type":"page_view","page":"/home","session_id":"sess_456"},
{"app":"web-server","event_time":"15/Mar/2023:14:30:45 -0500","client_ip":"10.0.0.1","method":"GET","url":"/api/users","status":200}
]'
{% include copy.html %}
OpenSearch에 저장된 문서에는 다음 정보가 포함되어 있어요:
{
...
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "date-multi-format-2025.10.13",
"_id": "8M4A3ZkBoQvfnsgqaorB",
"_score": 1,
"_source": {
"app": "payment-service",
"event_time": "1678902000123",
"transaction_id": "txn_001",
"amount": 99.99,
"currency": "USD",
"@timestamp": "2023-03-15T13:40:00.123-04:00"
}
},
{
"_index": "date-multi-format-2025.10.13",
"_id": "8c4A3ZkBoQvfnsgqaorB",
"_score": 1,
"_source": {
"app": "user-service",
"event_time": "1678902000",
"user_id": "user_123",
"action": "login",
"ip": "192.168.1.100",
"@timestamp": "2023-03-15T13:40:00.000-04:00"
}
},
{
"_index": "date-multi-format-2025.10.13",
"_id": "8s4A3ZkBoQvfnsgqaorB",
"_score": 1,
"_source": {
"app": "analytics",
"event_time": "2023-03-15T14:30:45.123-05:00",
"event_type": "page_view",
"page": "/home",
"session_id": "sess_456",
"@timestamp": "2023-03-15T15:30:45.123-04:00"
}
},
{
"_index": "date-multi-format-2025.10.13",
"_id": "884A3ZkBoQvfnsgqaorB",
"_score": 1,
"_source": {
"app": "web-server",
"event_time": "15/Mar/2023:14:30:45 -0500",
"client_ip": "10.0.0.1",
"method": "GET",
"url": "/api/users",
"status": 200,
"@timestamp": "2023-03-15T15:30:45.000-04:00"
}
}
]
}
}
일 간격이 다른 타임스탬프 형식
다음 예제는 date 프로세서가 패턴 변형을 사용해 일 간격이 서로 다른 가변적인 syslog 타임스탬프 형식을 처리하는 방법을 보여줘요:
date-syslog-pipeline:
source:
http:
path: /events
ssl: false
processor:
- date:
match:
- key: syslog_timestamp
patterns: ["MMM d HH:mm:ss", "MMM d HH:mm:ss", "MMM dd HH:mm:ss"]
destination: "@timestamp"
output_format: yyyy-MM-dd'T'HH:mm:ss.SSSXXX
source_timezone: America/Los_Angeles
destination_timezone: UTC
locale: en_US
date_when: /syslog_timestamp != null
origination_timestamp_to_metadata: true
sink:
- opensearch:
hosts: ["https://opensearch:9200"]
insecure: true
username: admin
password: admin_password
index_type: custom
index: date-syslog-%{yyyy.MM.dd}
{% include copy.html %}
다음 명령어로 파이프라인을 테스트할 수 있어요:
curl -sS -X POST "http://localhost:2021/events" \
-H "Content-Type: application/json" \
-d '[
{"host":"web-server-01","syslog_timestamp":"Mar 15 14:30:45","facility":"daemon","severity":"info","message":"sshd[1234]: Accepted publickey for user1"},
{"host":"database-02","syslog_timestamp":"Mar 5 09:15:30","facility":"auth","severity":"warning","message":"mysql[5678]: Access denied for user '\''root'\''@'\''localhost'\''"},
{"host":"app-server-03","syslog_timestamp":"Mar 25 23:45:12","facility":"local0","severity":"error","message":"nginx[9012]: upstream timed out (110: Connection timed out)"},
{"host":"cache-server-04","message":"redis[3456]: Background saving terminated with success"}
]'
{% include copy.html %}
OpenSearch에 저장된 문서에는 다음 정보가 포함되어 있어요:
{
...
"hits": {
"total": {
"value": 4,
"relation": "eq"
},
"max_score": 1,
"hits": [
{
"_index": "date-syslog-2025.10.13",
"_id": "5s4A3ZkBoQvfnsgqZIrV",
"_score": 1,
"_source": {
"host": "web-server-01",
"syslog_timestamp": "Mar 15 14:30:45",
"facility": "daemon",
"severity": "info",
"message": "sshd[1234]: Accepted publickey for user1",
"@timestamp": "2025-03-15T21:30:45.000Z"
}
},
{
"_index": "date-syslog-2025.10.13",
"_id": "584A3ZkBoQvfnsgqZIrV",
"_score": 1,
"_source": {
"host": "database-02",
"syslog_timestamp": "Mar 5 09:15:30",
"facility": "auth",
"severity": "warning",
"message": "mysql[5678]: Access denied for user 'root'@'localhost'",
"@timestamp": "2025-03-05T17:15:30.000Z"
}
},
{
"_index": "date-syslog-2025.10.13",
"_id": "6M4A3ZkBoQvfnsgqZIrV",
"_score": 1,
"_source": {
"host": "app-server-03",
"syslog_timestamp": "Mar 25 23:45:12",
"facility": "local0",
"severity": "error",
"message": "nginx[9012]: upstream timed out (110: Connection timed out)",
"@timestamp": "2025-03-26T06:45:12.000Z"
}
},
{
"_index": "date-syslog-2025.10.13",
"_id": "6c4A3ZkBoQvfnsgqZIrV",
"_score": 1,
"_source": {
"host": "cache-server-04",
"message": "redis[3456]: Background saving terminated with success"
}
}
]
}
}