【问题标题】:LogBack - LogStash - Add properties in the logback and send them to LogstashLogBack - LogStash - 在 logback 中添加属性并将它们发送到 Logstash
【发布时间】:2017-05-08 01:30:14
【问题描述】:

我在 SpringBoot 应用程序中使用 Logback 和 Logstash。

在 logback.xml 我有一个带有服务名称的属性,就像:

<configuration>

<include resource="org/springframework/boot/logging/logback/defaults.xml" />

<include resource="org/springframework/boot/logging/logback/console-appender.xml" />

<property name="spring.application.name" calue="service"/>

<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <destination>localhost:9600</destination>
    <encoder class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>

<root level="INFO">
    <appender-ref ref="CONSOLE" />
    <appender-ref ref="stash" />
</root>

</configuration>

Logstash conf 文件如下:

input{ tcp{
        port=> 9600
        host=>logstash
    }
}

filter {
grok {
match => {
  "message" =>
  "^%{TIMESTAMP_ISO8601:timestamp}\s+%{LOGLEVEL:level}\s+%{NUMBER:pid}\s+---\s+\[\s*%{USERNAME:thread}\s*\]\s+%{JAVAFILE:class}\s*:\s*%{DATA:themessage}(?:\n+(?<stacktrace>(?:.|\r|\n)+))?$"
}
}
date {
match => [ "timestamp" , "yyyy-MM-dd HH:mm:ss.SSS" ]
}
 mutate {
remove_field => ["@version"]
add_field => {
  "appid" => "%{[path]}"
}
add_field => {
  "levell" => "level"
}
add_field => {
  "mensage" => "message"
}
 }
   }
output{

 elasticsearch {
hosts => ["elasticsearch"]
index => "indice"
 }
   stdout{}
 } 

如何将 logback 文件中的应用程序名称属性添加为字段?

【问题讨论】:

    标签: spring-boot logstash logback logstash-grok logstash-logback-encoder


    【解决方案1】:

    您可以为 LogstashEncoder 配置自定义字段,如下所示

    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.99.100:4560</destination>
    
        <!-- encoder is required -->
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
          <customFields>{"appname":"${appName}"}</customFields>
        </encoder>
    </appender>
    

    例如,对于 spring boot 应用程序,您可以使用如下方式获取 spring 范围属性

    <springProperty name="appName" source="spring.application.name"/>
    

    或者从 .properties 文件中导入属性

    <property  resource="application.properties" />
    

    【讨论】:

    • application.yml 文件是否适用于此配置?我正在尝试&lt;property resource="application.yml" /&gt;,但它不起作用。
    • @nikhil-kakade 要使用 YAML 配置:&lt;property resource="application.yml" /&gt;,请查看:response of @granadacoder
    【解决方案2】:

    来自 logstash-logback-encoder 文档:

    默认情况下,Logback 的 Context (ch.qos.logback.core.Context) 的每个属性,例如 HOSTNAME,都会在 LoggingEvent 中作为一个字段出现。这可以通过在编码器/布局/附加器配置中指定 false 来禁用。

    默认情况下,您的 logback 属性是本地范围的,不包括在内。尝试将它们设置为scope="context"

    <property name="spring.application.name" value="service" scope="context"/>
    

    【讨论】:

    • 谢谢@roby!该属性出现在日志中,但在“消息”字段中。我想将该属性作为字段,以使用 Kibana 过滤日志。你知道怎么做吗?我试图把它放在 logastash conf 文件中,但没有用:add_field =&gt; { "service" =&gt; ["@spring.application.name"] }
    猜你喜欢
    • 1970-01-01
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多