출력
출력은 필터를 거쳐 가공된 데이터를 지정한 대상으로 내보내는 단계이다. 출력 역시 입력, 필터 플러그인 처럼 다양한 플러그인을 가지고 있다. 주로 사용되는 플러그인은 elasticsearch, file, kafka와 같은 출력 플러그인들이 있다.
엘라스틱 서치 플러그인을 사용해보자. 반드시 엘라스틱 서치를 먼저 실행시켜야한다.
먼저 logstash-test.conf 파일을 아래와 같이 수정한다.
input {
file {
path => "로그 파일 경로"
start_position => "beginning"
sincedb_path => "nul"
}
}
output {
file {
path => "로그스태시 경로/output.json"
}
elasticsearch {
index => "output"
}
}
output을 보면
먼저 file 플러그인을 사용해서 output.json에 로그를 저장한 뒤,
elasticsearch 플러그인을 사용하여 결과를 elasticsearch의 output 인덱스에 저장한다.
실행하고 나서 logstash 콘솔을 보면 성공적으로 elasticsearch와 output.json에 로그를 저장한 것을 볼 수 있다.
[2023-06-27T16:19:11,754][INFO ][logstash.outputs.elasticsearch][main] New Elasticsearch output {:class=>"LogStash::Outputs::ElasticSearch", :hosts=>["//127.0.0.1"]}
[2023-06-27T16:19:11,937][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch pool URLs updated {:changes=>{:removed=>[], :added=>[http://127.0.0.1:9200/]}}
[2023-06-27T16:19:12,206][WARN ][logstash.outputs.elasticsearch][main] Restored connection to ES instance {:url=>"http://127.0.0.1:9200/"}
[2023-06-27T16:19:12,214][INFO ][logstash.outputs.elasticsearch][main] Elasticsearch version determined (7.17.4) {:es_version=>7}
[2023-06-27T16:19:12,214][WARN ][logstash.outputs.elasticsearch][main] Detected a 6.x and above cluster: the `type` event field won't be used to determine the document _type {:es_version=>7}
[2023-06-27T16:19:12,450][INFO ][logstash.outputs.elasticsearch][main] Not eligible for data streams because config contains one or more settings that are not compatible with data streams: {"index"=>"output"}
[2023-06-27T16:19:12,451][INFO ][logstash.outputs.elasticsearch][main] Data streams auto configuration (`data_stream => auto` or unset) resolved to `false`
[2023-06-27T16:19:12,468][WARN ][logstash.outputs.elasticsearch][main] `template_api => auto` resolved to `legacy` since we are connected to Elasticsearch 7, but will resolve to `composable` the first time it connects to Elasticsearch 8+. We recommend either setting `template_api => legacy` to continue providing legacy-style templates, or migrating your template to the composable style and setting `template_api => composable`. The legacy template API is slated for removal in Elasticsearch 9.
[2023-06-27T16:19:12,469][INFO ][logstash.outputs.elasticsearch][main] Using a default mapping template {:es_version=>7, :ecs_compatibility=>:v8}
[2023-06-27T16:19:12,480][INFO ][logstash.javapipeline ][main] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>8, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>1000, "pipeline.sources"=>["/Users/leechanyoung/Downloads/logstash-8.8.1/config/logstash-test.conf"], :thread=>"#<Thread:0x6a3621c5@/Users/leechanyoung/Downloads/logstash-8.8.1/logstash-core/lib/logstash/java_pipeline.rb:134 run>"}
[2023-06-27T16:19:12,524][INFO ][logstash.outputs.elasticsearch][main] Installing Elasticsearch template {:name=>"ecs-logstash"}
[2023-06-27T16:19:13,429][INFO ][logstash.javapipeline ][main] Pipeline Java execution initialization time {"seconds"=>0.95}
[2023-06-27T16:19:13,450][INFO ][logstash.inputs.file ][main] No sincedb_path set, generating one based on the "path" setting {:sincedb_path=>"/Users/leechanyoung/Downloads/logstash-8.8.1/data/plugins/inputs/file/.sincedb_62eab3649cd504aee6c6af3ec6163ec6", :path=>["/Users/leechanyoung/elasticsearch-8.8.1/logs/elasticsearch.log"]}
[2023-06-27T16:19:13,454][INFO ][logstash.javapipeline ][main] Pipeline started {"pipeline.id"=>"main"}
[2023-06-27T16:19:13,457][INFO ][filewatch.observingtail ][main][bcdfa6589b0b14375c359a28ffb122e7e0f6b1c5d9b399e40a69aae00386643f] START, creating Discoverer, Watch with file and sincedb collections
[2023-06-27T16:19:13,474][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2023-06-27T16:19:13,685][INFO ][logstash.outputs.file ][main][4229f634a51a40a777d91238cfef3cad549f48adcf4553128702c1a7c4e63006] Opening file {:path=>"/Users/leechanyoung/Downloads/logstash-8.8.1/config/output.json"}
/Users/leechanyoung/Downloads/logstash-8.8.1/vendor/bundle/jruby/2.6.0/gems/manticore-0.9.1-java/lib/manticore/client.rb:284: warning: already initialized constant Manticore::Client::HttpPost
/Users/leechanyoung/Downloads/logstash-8.8.1/vendor/bundle/jruby/2.6.0/gems/manticore-0.9.1-java/lib/manticore/client.rb:284: warning: already initialized constant Manticore::Client::HttpPost
/Users/leechanyoung/Downloads/logstash-8.8.1/vendor/bundle/jruby/2.6.0/gems/manticore-0.9.1-java/lib/manticore/client.rb:284: warning: already initialized constant Manticore::Client::HttpPost
/Users/leechanyoung/Downloads/logstash-8.8.1/vendor/bundle/jruby/2.6.0/gems/manticore-0.9.1-java/lib/manticore/client.rb:284: warning: already initialized constant Manticore::Client::HttpPost
[2023-06-27T16:19:38,463][INFO ][logstash.outputs.file ][main][4229f634a51a40a777d91238cfef3cad549f48adcf4553128702c1a7c4e63006] Closing file /Users/leechanyoung/Downloads/logstash-8.8.1/config/output.json
코덱
코덱은 입력과 출력 과정에 사용되는 플러그인이다. 입력/출력 시에 메시지를 적절한 형태로 변환하는 스트림 필터이다.
코덱은 입력과 출력 단계에서 인코딩/디코딩을 담당한다.
코덱 플러그인
플러그인 | 설명 |
json | 입력시 json형태 메시지를 객체로 읽고, 출력 시 객체를 json 형태로 변환 |
plain | 메시지를 단순 문자열로 읽어들이고, 출력 시에는 원하는 포맷을 정할 수 있다. |
rubydebug | 로그스태시의 설정을 테스트하거나 예기치 못한 파이프라인 설정 오류를 디버깅하기 위한 목적으로 주로 사용. 출력 시 루비언어의 해시 형태로 이벤트를 기록한다. (입력시에는 사용 X) |
json codec을 사용해보자
input {
file {
path => "/Users/leechanyoung/elasticsearch-8.8.1/logs/elasticsearch.log"
start_position => "beginning"
sincedb_path => "nul"
codec => json
}
}
output {
stdout {}
}
하지만 위의 설정을 적용하여 실행하면 _jsonparsefailure 에러가 발생한다. 우리가 input으로 받는 로그는 일반적인 텍스트 형식인데, 이를 json으로 파싱하려해서 발생한 문제이다.
해서 codec 플러그인을 일반적인 텍스트를 받는 plain으로 바꿔보자.
input {
file {
path => "/Users/leechanyoung/elasticsearch-8.8.1/logs/elasticsearch.log"
start_position => "beginning"
sincedb_path => "nul"
codec => plain
}
}
output {
stdout {}
}
이렇게 하면 결과는 나오지만 사실 codec의 plain 플러그인은 기본으로 적용되기 때문에 의미는 없다.
이번에는 출력 codec을 적용하여 결과를 확인해보자.
input {
file {
path => "/Users/leechanyoung/elasticsearch-8.8.1/logs/elasticsearch.log"
start_position => "beginning"
sincedb_path => "nul"
}
}
output {
stdout {
#codec => "line"
#codec => "json"
#codec => "rubydebug"
}
}
참고:
엘라스틱 스택 개발부터 운영까지 - 김준영, 정상운 저
https://github.com/onlybooks/elasticstack
'ELK > logstash' 카테고리의 다른 글
모니터링 (0) | 2023.07.03 |
---|---|
ELK - Logstash 1 : 로그스태시 filter (0) | 2023.06.22 |
ELK - Logstash 1 : 로그스태시란 (0) | 2023.06.21 |