Logstash-logback事件特定的自定义字段(使用StructuredArguments)未添加到JSON

时间:2018-09-20 13:20:17

标签: java logstash logback

我正在尝试使用logstash documentation将特定于事件的字段添加到一个记录器语句中。我的记录器语句如下:

LOGGER.info("Executed REST request time={}ms", StructuredArguments.value("request_time_ms", elapsedTimeMs));

根据文档:

  如果使用LogstashEncoder / Layout或将复合编码器/布局与参数provider一起使用,则

StructuredArguments将包含在JSON输出中

这意味着只要我使用StructuredArgumentsLogstashEncoder就可以正常工作:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
    </encoder>
</appender>

但是在输出JSON中仍然缺少request_time_ms

{
    "@timestamp": "2018-09-20T14:00:43.560+03:00",
    "@version": 1,
    "appname": "my_app",
    "level": "INFO",
    "level_value": 20000,
    "logger_name": "com.example.MetricsAspect",
    "message": "Executed REST request time=258ms",
    "thread_name": "main"
}

1 个答案:

答案 0 :(得分:2)

在您显式添加StructuredArguments之前,即使您使用LogstashEncoder,似乎ArgumentsJsonProvider也不会包含在JSON中:

<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
    <encoder class="net.logstash.logback.encoder.LogstashEncoder">
        <provider class="net.logstash.logback.composite.loggingevent.ArgumentsJsonProvider"/>
    </encoder>
</appender>

现在它可以正常工作了:

{
    "@timestamp": "2018-09-20T15:43:11.019+03:00",
    "@version": 1,
    "appname": "my_app",
    "level": "INFO",
    "level_value": 20000,
    "logger_name": "com.example.MetricsAspect",
    "message": "Executed REST request time=337ms",
    "request_time_ms": 337,
    "thread_name": "main"
}