提问者:小点点

通过系统日志发送log4j2堆栈跟踪


我正在尝试将堆栈跟踪记录到 Logstash 中。

日志堆栈是ELK(ElasticSearch、Logstash、Kibana)。

生成日志的应用程序是一个Java的应用程序,使用slf4j作为日志接口,使用log4j2作为日志实现。

log4j2. xml声明了这个syslogAppender,格式为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中?我不一定要使用syslogappender。

基本上,这些限制是:

    < li >不要局限于任何特定的日志记录基础架构(这就是我使用syslog的原因) < li >多行堆栈跟踪需要理解为单个日志条目。不希望“堆栈跟踪的每一行”成为“单独的日志消息” < li >堆栈跟踪必须能够经过过滤。我的一个典型异常可以有一页长的堆栈跟踪。我要像Spring一样过滤掉框架。

共0个答案