Xml 소스 파싱에 관한 문제

안녕하세요. XML 파싱하는 주제에 관해 몇 가지 자문을 구하고자 질문을 올립니다.
현재 테스트는 Postman으로 XML 소스를 로그스태쉬로 보내고, 로그스태쉬에서 http로 받습니다.
여러 filter들을 통하여 파싱을 하고 output으로 Elasticsearch에 저장하고 또한 콘솔로 찍어서 테스트를 진행하고 있습니다.

질문을 드리고자 하는 부분은

  1. XML 소스 구조가 이상할 경우, 예를들면 극단적으로, 정상적인 코드 안에 <?xml> 태그에 이상한 문자 'asdfasdfadsf' 이런식으로 들어갈 경우 로그스태쉬 연결이 끊기는 현상이 발생합니다. 이럴 경우, xml 소스가 올바르지 않을 시, xml 소스를 걸러내며 filter, output으로 넘어가지 않게 하고 로그스태쉬 연결을 유지하고 싶습니다.

  2. XML 소스 안에 <con> , <sr> 태그가 없을 시 Elasticsearch에 저장이 되지 않게합니다.

저의 Logstash config 파일은 이렇게 되있습니다.

input {
	http{
		
	}
}

filter {

	xml{
		source => "message"
        store_xml => true
       	target => "parsedData"     
       	xpath => ["/m2m:cin/sr", "parsedSr"]
       	xpath => ["/m2m:cin/con", "parsedCon"]
	}

    mutate{
		gsub => ["parsedCon", "<[^<]*>", ""]
		gsub => ["parsedSr", "<[^<]*>", ""]		
		remove_field => "message"
		remove_field => "headers" 
		remove_field => "@timestamp" 
		remove_field => "@version" 
	}

	ruby{
    	path => "C:\workspace_server/parser.rb"
	}

	mutate {
		remove_field => "parsedSr"
		remove_field => "parsedCon"
	}

}

output {
	if([parsedData][con] and [parsedData][sr]){
		elasticsearch {
			index => "parse"
			hosts => "localhost:9200"
		}
	}

	stdout {
		codec => rubydebug
	}
}

XML 소스는 이렇습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<m2m:cin xmlns:m2m="http://www.onem2m.org/xml/protocols" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<ty>4</ty>
<ri>CI00000000001244656716</ri>
<rn>CI00000000001244656716</rn>
<pi>CT00000000000000046769</pi>
<ct>2018-02-05T15:06:30+09:00</ct>
<lt>2018-02-05T15:06:30+09:00</lt>
<ppt>
<gwl>36.83115, 127.11185, 76</gwl>
<geui>0017b2fffe0ad93e</geui>
</ppt>
<sr>/0240771000000168/v1_0/remoteCSE-00000168000c05c016104807/container-LoRa//subscription-SS00000000000000261472</sr>
<et>2018-02-06T15:06:30+09:00</et>
<st>11785</st>
<cr>RC00000000000000050648</cr>
<cnf>LoRa/Sensor</cnf>
<cs>76</cs>
<con>010400003039499602d2499602d203e703e70000000003e703e70000000000000000fff51234</con>
</m2m:cin>

Logstash config 파일을 보시면 2번에 해당하는 부분은 해결하였습니다. target을 주어 (이름은 parsedData)
타겟안에 , 태그가 있을 경우에만 output에서 Elasticsearch로 보내게 하였으며 테스트를 통해 정상작동 되는것을 알았습니다.
하지만 1번에 대한 부분이 아직 미해결 상태입니다. 혹시 xml 구조가 이상할 경우 거를수 있는 방법과 Logstash 연결이 끊기는 에러를 해결할 수 있을만한 방법이 있다면 조언좀 부탁드립니다. 감사합니다!

Dead Letter Queue 를 써서 한번 오류난 데이터는 따로 모아 처리하는 방법은 어떨까요?

https://www.elastic.co/guide/en/logstash/6.2/dead-letter-queues.html

@kimjmin 좋은 정보 감사합니다! Dead Letter Queue에 대해 한번 알아봐야겠네요~

Dead Letter Queue를 사용하여 오류의 원인이 되는 데이터들을 따로 관리하는 것이 나중에 필요할 수 있겠습니다만.. 현재 근본적인 문제가 다시 한번 언급하자면,

Postman으로 xml 소스를 로그스태쉬로 보내고 로그스태쉬 input에서 http로 받습니다. 이 때 xml 형식에 문제가 있을 경우 가령,<xml> 태그안에 잘못된 문자가 끼어서 보내지는 경우, Logstash의 연결이 끊겨버리는 현상이 일어납니다. 따라서 먼저 이 문제를 해결해야하는데.. 혹시 input 부분에서 들어오는 소스가 xml 소스가 아닐 경우, Logstash의 연결을 유지하는 방법이 있을까요?

filter 안의 xml에서 remove_namespaces => true 옵션을 주어서 해결했습니다!
Dead Letter Queue를 이용해서 또 좋은 기능을 추가할 수 있을 것 같네요. 감사합니다 ^^

This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.