XML 데이터가 포함된 지속적으로 업데이트되는 로그를 구문 분석하는 방법은 무엇입니까?

XML 데이터가 포함된 지속적으로 업데이트되는 로그를 구문 분석하는 방법은 무엇입니까?

Pastebin에 동일한 질문을 추가했습니다.https://pastebin.com/QtZKcBic (붙여넣을 때 일부 xml 태그가 누락된 것을 발견했습니다)

매분 수천 명의 사람들이 액세스하므로 밀리초 단위로 새로 고쳐지는 지속적으로 실행되는 로그에서 데이터를 읽어야 합니다. 내 요구 사항은 다음과 같습니다

다음과 같은 xml 요청이 있다고 가정합니다.

<dataReq>
  <id>1</id>
  <name>test</name>
  <reqId>ddaabyy234</reqid>
   ....
   ...
   ....
</dataReq>

위 요청에 대한 응답은 다음과 같습니다.

<dataRes>
   <id>1</id>
   <dept>railway</dept>
   <reqId>ddaabyy234</reqid>
   .......
   .......
   <errcode>
       <errNum>404</errNum>
   </errcode>
 </dataRes>

그렇지 <errNum>않다면 200캡처해야 <dataReq>..</dataReq>하고<dataRes>..</dataRes>

여기서 문제는 <dataReq>...</dataReq>태그가 여러 개 있을 수 있다는 것입니다. 왜냐하면 많은 사용자가 webUI(또는) 모바일(또는) 애플리케이션에서 동일한 애플리케이션으로 요청을 보내는 동안 백엔드 시스템에서 응답을 생성하는 데 시간이 걸리기 때문입니다.

또한 5분마다 로그 파일의 크기가 커지기 때문에 로그는 5분마다 아카이브 파일로 아카이브됩니다.

답변1

이것TXR 언어라이브러리에는 "wake" 기능이 있습니다. 이는 tail -f유틸리티와 유사하게 동적 로그 파일을 따르는 스트림 개체입니다.

이 함수 호출은 (open-tail "/path/to/it")깨우기를 생성하고 반환합니다. 파일이 존재할 필요는 없습니다. 파일이 존재하는 경우 스트림은 파일을 끝까지 읽은 다음 파일이 커지거나 갑자기 줄어들거나 사라지거나 다시 나타나는지 모니터링하여 애플리케이션에 끝이 없는 데이터 스트림의 환상을 제공합니다. 물론 애플리케이션은 스트림에서 데이터를 충분히 빠르게 읽어야 하며 이는 파일 회전 빈도와 관련이 있습니다.

다음 프로그램에서는 각 트랜잭션(요청-응답 쌍)에 대한 정보를 추적하는 데이터 구조를 정의하고 wake를 사용하여 dataTXR 패턴 언어 호출을 사용하여 로그 파일을 스캔합니다.

요청이 일치하면 새 트랜잭션 객체를 생성하고 이를 ID로 키가 지정된 해시 테이블에 넣습니다.

실패한 응답(200 이외의 코드)이 표시되면 해당 ID에 대한 트랜잭션을 검색합니다. 존재하는 경우 응답 정보로 업데이트하고 인쇄합니다(객체의 사용자 정의 인쇄 기능을 사용하여 XML 요청-응답 쌍을 재생성함).

응답이 일치하면 성공이나 실패에 관계없이 해시 테이블에서 일치하는 트랜잭션을 제거합니다.

@(do                                                                        
   (defstruct xact nil
     id
     req-inner-xml
     res-inner-xml
     (:method print (me *stdout* pretty-p)
       (cond
         (pretty-p
           (put-line "<dataReq>")
           [mapdo put-line me.req-inner-xml]
           (put-line "</dataReq>")
           (put-line "<dataRes>")
           [mapdo put-line me.res-inner-xml]
           (put-line "</dataRes>"))
         (t :))))

   (defvarl xact (hash)))
@(next (open-tail "data"))
@(repeat)
@  (cases)
<dataReq>
@    (all)
  <id>@id</id>
@    (and)
@      (collect)
@lines
@      (until)
</dataReq>
@      (end)
@    (end)
@    (do (set [xact id] (new xact
                             id id
                             req-inner-xml lines)))
@  (or)
<dataRes>
@    (all)
   <id>@id</id>
@    (and)
@      (skip)
   <errcode>
       <errNum>@err</errNum>
   </errcode>
@    (and)
@      (collect)
@lines
@      (until)
</dataRes>
@      (end)
@    (end)
@    (do
       (whenlet ((x (del [xact id])))
         (when (nequal err "200")
           (set x.res-inner-xml lines)
           (pprint x))))
@  (end)
@(end)

관련 정보