스택 추적을 Logstash에 기록하려고합니다.syslog를 통해 log4j2 스택 추적 보내기
로깅 스택은 ELK (ElasticSearch, Logstash, Kibana)입니다.
로그를 생성하는 응용 프로그램은 로깅 인터페이스로 slf4j
을 사용하고 로깅 구현으로는 log4j2
을 사용하는 Java 응용 프로그램입니다.
log4j2.xml
는 RFC5424
형식이 syslog
이 appender를 선언
<Appenders>
<Syslog name="RFC5424" format="RFC5424" host="localhost" port="8514"
protocol="TCP" appName="MyApp" includeMDC="true" mdcId="mdc"
facility="LOCAL0" enterpriseNumber="18060" newLine="true"
messageId="Audit" id="App">
<LoggerFields>
<KeyValuePair key="thread" value="%t"/>
<KeyValuePair key="priority" value="%p"/>
<KeyValuePair key="category" value="%c"/>
<KeyValuePair key="exception" value="%ex{full}"/>
</LoggerFields>
</Syslog>
</Appenders>
나는과 같이 자바 응용 프로그램에서의 Throwable 로그 :
예외가 기록됩니다
org.slf4j.LoggerFactory.getLogger("exception_test").error("Testing errors", new RuntimeException("Exception message"));
, Logstash는 다음과 같이 추적하여 지속되는 것을 보여줍니다.
{
"@timestamp":"2016-11-08T11:08:10.387Z",
"port":60397,
"@version":"1",
"host":"127.0.0.1",
"message":"<131>1 2016-11-08T11:08:10.386Z MyComputer.local MyApp - Audit [[email protected] category=\"exception_test\" exception=\"java.lang.RuntimeException: Exception message",
"type":"syslog",
"tags":[
"_grokparsefailure"
]
}
그리고 Kibana가 로그 항목 중 하나의 _source
필드 내에 정확하게 동일한 JSON을 표시하는지 확인합니다.
여기에 문제가 있습니다. 스택 추적이 저장되지 않습니다. 그리고 "오류 테스트 중"이라는 메시지가 사라집니다.
"tags":["_grokparsefailure"]
은 불행하지만 은이 질문과 관련이 없습니다..
<Syslog name="RFC5424" format="RFC5424" host="localhost" port="8514"
protocol="TCP" appName="MyApp" includeMDC="true" mdcId="mdc"
facility="LOCAL0" enterpriseNumber="18060" newLine="true"
messageId="Audit" id="App">
<LoggerFields>
<KeyValuePair key="thread" value="%t"/>
<KeyValuePair key="priority" value="%p"/>
<KeyValuePair key="category" value="%c"/>
<KeyValuePair key="exception" value="%ex{full}"/>
</LoggerFields>
<ExceptionPattern>%ex{full}</ExceptionPattern>
</Syslog>
<ExceptionPattern/>
로그 메시지를 대체하고, 도은 (슬프게도) 모든 loggerFields
를 생략 : 그것은 아무것도 변경한다면
내가 볼
<ExceptionPattern/>
를 추가했습니다. 하지만 클래스 이름과 줄 번호를 알려줍니다.
{
"@timestamp":"2016-11-08T11:54:03.835Z",
"port":60397,
"@version":"1",
"host":"127.0.0.1",
"message":"at com.stackoverflow.LogTest.throw(LogTest.java:149)",
"type":"syslog",
"tags":[
"_grokparsefailure"
]
}
다시 : 스택 추적이 없습니다. 그리고 다시 : "테스트 오류"라는 메시지가 사라집니다.
어떻게 log4j2
을 사용하여 스택 추적을 Logstash에 기록 할 수 있습니까? 필자는 반드시 첨부 파일 syslog
을 사용할 필요는 없습니다.
- 등록. "스택 추적의 각 줄"이 "별도의 로그 메시지"가되는 것은 바람직하지 않습니다.
- 스택 추적은 필터를 거쳐야합니다. 일반적인 예외는 페이지 길이의 스택 추적을 가질 수 있습니다. Spring과 같은 프레임을 걸러 내고 싶습니다.