2017-10-17 25 views
0

며칠 동안 알아 내려고 노력하면서 누군가가이 질문을 도와 주길 바랍니다.로그 페이로드의 일부 키워드를 기반으로 Fluentd에서 로그 메시지의 심각도 (INFO, ERROR, WARNING 등)를 변경하는 방법은 무엇입니까?

GKE의 kubernetes에서 실행되는 컨테이너가 있습니다. 같은

{"log":"17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason\n","stream":"stdout","time":"2017-10-17T04:36:29.750702216Z"} 

이 로그는 스택 드라이버 (GKE에서 Fluentd에 출력)에 나타나는 정보 로그와 같은 : /var/log/containers/my_container.log, 나는 (다른 형식과 다른 로그들)이 같은 뭔가를 :

23:02:32.000 17-Oct-2017;04:36:29.744 : [main] [server:] [id:] [yt:] ERROR no.myproject.service.Server - call failed for some reason 

그래서

23:02:32.000 

은 (스택 드라이버의 정상적인 동작 인)이 추가됩니다. 이 형식을 형식 2로 참조하겠습니다.

실제로이 로그 메시지는 페이로드 내용을 기반으로하는 ERROR 로그 메시지이므로 Stackdriver (Fluentd)에 ERROR로 나타나기를 원합니다.

나는 노력하고 있어요 :

<filter reform.**> 
    type parser 
    format /^(?<time>\d{2} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w)\s+(?<log2222>.*)/ 
    reserve_data true 
    suppress_parse_error_log false 
    key_name log 
</filter> 

ERROR로 메시지 변화의 심각성을 얻을 수 있었으면하고이에 (몇 가지 새로운 키/값으로 로그에 [..] 필드의 내용을 점점 case2 : 메인 등).

하지만이 필터를 설정 파일에 추가 한 후에도 출력 로그는 이전과 같으며 변경 사항이 표시되지 않습니다.

무엇이 누락 되었습니까? Regex 패턴을 writting 할 때 kubernetes의 로그 파일이나 "format2"라고 불리는 로그 파일의 "log"필드를 실제로 고려해야하는지 잘 모르겠습니다 (Stackdriver에 추가 된 시간과 함께) .

정말 조언을 해주시면 감사하겠습니다. 도움이 될 것입니다.

답변

0

사용중인 도구를 모르지만 정규 표현식의 첫 번째 부분이 로그 문자열의 접두어가 붙은 정확한 형식과 일치하지 않는 것 같습니다.

사실 \d{2}은 2 자리 만 일치합니다.

전체 시간대 접두어와 일치 시키려면 대신 (?:\d{2}:){2}\d{2}\.\d{3}을 사용할 수 있습니다.

심각도와 관련하여 추가 포인트가 하나 있습니다. (?<severity>\w)은 한 단어 문자 만 캡처합니다. 여러 문자를 일치 시키려면 (?<severity>\w+)을 사용할 수 있습니다.

귀하의 정규식은 다음이 될 것입니다 :

^(?<time>(?:\d{2}:){2}\d{2}\.\d{3} [^\s]*) : (?<message2>[^ \]]*)\] (?<message3>[^ \]]*)\] (?<message4>[^ \]]*)\] (?<message5>[^ \]]*)\] (?<severity>\w+)\s+(?<log2222>.*) 

demo 그 신발 일치합니다.

+0

대단히 감사합니다. 이제 출력에서 ​​페이로드의 심각도를 캡처합니다. 나는 한 가지 더 질문이있다. 나는 또한 출력에서 ​​메시지 5와 log2222에 대한 message2의 새로운 필드가 추가 될 것이라고 기대했지만 새로운 필드는 추가되지 않았다. 로그 텍스트 - 페이로드에서 일부 데이터를 추출하여 출력에서 ​​새로운 추가 필드로 가져올 수 있습니까 (위의 예에서 "message2 : [main]"와 같은)? – samanta

+0

당신을 진심으로 환영합니다.나는 당신의 도구를 모른다. 그래서 도움이 될지 모르겠다. 그러나 대체 문자열을 지정할 수 있다면, 대체로 $ {severity} message2 : $ {message2}를 사용할 수있다. 그런 다음'ERROR message2 : [main'. 새 버전 [here] (https://regex101.com/r/o5lu2j/2)을 참조하십시오. – PJProudhon