1+ input {
2+ beats {
3+ port => 5044
4+ }
5+ }
6+
7+ filter {
8+ # FileBeat에서 오는 메타데이터 처리
9+ if [agent][type] == "filebeat" {
10+ mutate {
11+ add_field => { "log_source" => "filebeat" }
12+ }
13+ }
14+
15+ # JSON 로그 파싱
16+ if [message] =~ /^\{.*\}$/ {
17+ json {
18+ source => "message"
19+ target => "parsed_json"
20+ }
21+
22+ # 파싱된 JSON 데이터를 최상위로 이동
23+ if [parsed_json] {
24+ ruby {
25+ code => "
26+ parsed = event.get('parsed_json')
27+ if parsed.is_a?(Hash)
28+ parsed.each { |k, v| event.set(k, v) }
29+ event.remove('parsed_json')
30+ end
31+ "
32+ }
33+ }
34+ }
35+
36+ # API 로그 특별 처리
37+ if [type] == "API_REQUEST" or [type] == "API_RESPONSE" {
38+ mutate {
39+ add_field => { "log_category" => "api_access" }
40+ }
41+
42+ # 응답 시간 기반 성능 태그
43+ if [processingTime] {
44+ if [processingTime] > 5000 {
45+ mutate { add_tag => ["slow_api"] }
46+ } else if [processingTime] > 1000 {
47+ mutate { add_tag => ["medium_api"] }
48+ } else {
49+ mutate { add_tag => ["fast_api"] }
50+ }
51+ }
52+
53+ # HTTP 상태 코드 기반 태그
54+ if [statusCode] {
55+ if [statusCode] >= 500 {
56+ mutate { add_tag => ["server_error"] }
57+ } else if [statusCode] >= 400 {
58+ mutate { add_tag => ["client_error"] }
59+ } else if [statusCode] >= 200 {
60+ mutate { add_tag => ["success"] }
61+ }
62+ }
63+ }
64+
65+ # 에러 로그 특별 처리
66+ if [level] == "ERROR" {
67+ mutate {
68+ add_field => { "log_category" => "error" }
69+ add_tag => ["error"]
70+ }
71+ }
72+
73+ # 타임스탬프 처리
74+ if [timestamp] {
75+ date {
76+ match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS", "ISO8601" ]
77+ target => "@timestamp"
78+ }
79+ }
80+
81+ # 불필요한 필드 제거
82+ mutate {
83+ remove_field => [ "ecs", "host", "agent", "input", "log" ]
84+ }
85+ }
86+
87+ output {
88+ # 로그 타입별로 다른 인덱스에 저장 (dev 환경 prefix)
89+ if [log_type] == "api" {
90+ elasticsearch {
91+ hosts => ["elasticsearch:9200"]
92+ user => "elastic"
93+ password => "${ELASTICSEARCH_PASSWORD}"
94+ index => "memory-dev-api-logs-%{+YYYY.MM.dd}"
95+ }
96+ } else if [log_type] == "error" {
97+ elasticsearch {
98+ hosts => ["elasticsearch:9200"]
99+ user => "elastic"
100+ password => "${ELASTICSEARCH_PASSWORD}"
101+ index => "memory-dev-error-logs-%{+YYYY.MM.dd}"
102+ }
103+ } else if [log_type] == "business" {
104+ elasticsearch {
105+ hosts => ["elasticsearch:9200"]
106+ user => "elastic"
107+ password => "${ELASTICSEARCH_PASSWORD}"
108+ index => "memory-dev-business-logs-%{+YYYY.MM.dd}"
109+ }
110+ } else if [log_type] == "container" {
111+ elasticsearch {
112+ hosts => ["elasticsearch:9200"]
113+ user => "elastic"
114+ password => "${ELASTICSEARCH_PASSWORD}"
115+ index => "memory-dev-container-logs-%{+YYYY.MM.dd}"
116+ }
117+ } else {
118+ elasticsearch {
119+ hosts => ["elasticsearch:9200"]
120+ user => "elastic"
121+ password => "${ELASTICSEARCH_PASSWORD}"
122+ index => "memory-dev-application-logs-%{+YYYY.MM.dd}"
123+ }
124+ }
125+
126+ # 개발환경에서는 콘솔 출력도 활성화
127+ stdout { codec => rubydebug }
128+ }
0 commit comments