Spring boot LogBack-LogStash-在LogBack中添加属性并将它们发送到LogStash

Spring boot LogBack-LogStash-在LogBack中添加属性并将它们发送到LogStash,spring-boot,logstash,logback,logstash-grok,logstash-logback-encoder,Spring Boot,Logstash,Logback,Logstash Grok,Logstash Logback Encoder,我正在SpringBoot应用程序中使用Logback和Logstash 在logback.xml中,我有一个带有服务名称的属性,如下所示: <configuration> <include resource="org/springframework/boot/logging/logback/defaults.xml" /> <include resource="org/springframework/boot/logging/logback/console-a

我正在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>

本地主机:9600
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{}
 } 
input{tcp{
端口=>9600
主机=>logstash
}
}
滤器{
格罗克{
匹配=>{
“消息”=>
“^%{TIMESTAMP\u ISO8601:TIMESTAMP}\s+%{LOGLEVEL:level}\s+%{NUMBER:pid}\s+--\s+\[\s*%{USERNAME:thread}\s*\]\s+%{JAVAFILE:class}\s*:\s*{DATA:themessage}(?:\n+((?:.\r\124; n)++)+)$”
}
}
日期{
匹配=>[“时间戳”,“yyyy-MM-dd HH:MM:ss.SSS”]
}
变异{
删除_字段=>[“@version”]
添加字段=>{
“appid”=>“%{[path]}”
}
添加字段=>{
“级别”=>“级别”
}
添加字段=>{
“尺寸”=>“信息”
}
}
}
输出{
弹性搜索{
主机=>[“elasticsearch”]
索引=>“索引”
}
stdout{}
} 

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

来自logstash logback编码器文档:

默认情况下,Logback的上下文(ch.qos.Logback.core.Context)的每个属性(如主机名)都将在LoggingEvent中显示为字段。这可以通过在编码器/布局/追加器配置中指定false来禁用

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


您可以按如下方式配置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>

192.168.99.100:4560
{“appname”:“${appname}”
例如,对于spring引导应用程序,您可以使用以下方法获取spring作用域属性

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

或者从.properties文件导入属性

<property  resource="application.properties" />


谢谢@roby!该属性显示在日志中,但不在“消息”字段中。我想要属性为字段,用Kibana过滤日志。你知道怎么做吗?我试图将其放在logastash conf文件中,但没有成功:
add_field=>{“service”=>[“@spring.application.name”]}
application.yml文件是否可以使用此配置?我正在尝试
,但它不起作用。@nikhil kakade要使用YAML配置:
,请查看:
<property  resource="application.properties" />