我正在尝试将堆栈跟踪记录到 Logstash 中。
日志堆栈是ELK(ElasticSearch、Logstash、Kibana)。
生成日志的应用程序是一个Java的应用程序,使用slf4j
作为日志接口,使用log4j2
作为日志实现。
log4j2. xml
声明了这个syslog
Appender,格式为RFC5424
:
<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>
我从Java应用程序中记录了一个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 [mdc@18060 category=\"exception_test\" exception=\"java.lang.RuntimeException: Exception message",
"type":"syslog",
"tags":[
"_grokparsefailure"
]
}
我确认Kibana在其日志条目的_source
字段中显示完全相同的JSON。
这里有一个问题:没有保存堆栈跟踪。并且消息“测试错误”丢失了。
"tags":["_grokparsefailure"]
很不幸,但与此问题无关。
我尝试添加<code>
<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>
<代码>
{
"@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
appender。
基本上,这些限制是: