logstash 写入elasticsearch 多索引设置

logstash的配置

  • 启动命令
 logstash.bat  -f  **.conf 
  • 配置文件

这里我们只输入 微服务之间调用的日志(基于sleuth) 服务内部内部运行产生的日志 我们则忽略 区别是否是 微服务之间调用也很简单 只要比较traceId 和spanId 的值就明白了 如果这俩个只存在 并相同 说明此处只是我服务的起点 或者是在内部调用 我们就忽略(其实准确的来说 我们应该排除 parentid 不存在的记录 不过和这个条件基本一致 不了解sleuth的这个头的值 可以去spring官网了解下)

这里 下面的配置文件 其实有个隐含的问题就是 我们会忽略掉 微服务最初发起者的 日志记录 因为这条记录和 起内部调用的产生的日志的sleuth的头的内容格式 是一致的都是 traceId 和spanId 的值一致 并且parentid 不存在 这是个隐患

数据输入
input{
     tcp{
      host  => "127.0.0.1"
      port  =>  9100
      codec => "json"
  }
}

数据过滤
filter{
   mutate{
         lowercase=>["springAppName"]    转为小写   索引不能有大写
    }
   if ![traceId]  or ![spanId] or [traceId]==[spanId]{
       mutate{
           add_field => {"info"=>"service inner call not sent to es"}
       }
   }
}

数据输出
output{
   if [info]  判断 info
{
     elasticsearch{
          action => "index"
          hosts  => "127.0.0.1:9200"
          index  => "%{springApName}"   动态索引
      }
    stdout{codec=>rubydebug}   控制台输出
}
 
}

说明

if ![traceId] or ![spanId] or [traceId]==[spanId]
- ![traceId] 表示 字段traceId 不存在
- or 表示条件 或
- ![spanId] 表示 字段 spanId 不存在
- [traceId]==[spanId] 表示字段traceId 和spanId 相等

  • mutate

mutate是 filter中的一个常用插件 配合if语句 可以对输入的文本内容进行处理 可选的操作 在官网有详细的说明

ps

  • 而是在指定 索引(index)的时候 索引名 要全是小写 不能有大写字母
  • %{springApName} 这个表示将springApName字段的值拿出来

logback的输入设置

  • maven的配置
        <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>5.2</version>
        </dependency>
  • logback.xml的配置
 <springProperty scope="context" name="springAppName" source="spring.application.name"/>

<!--日志写到logstash 在写到es中 -->
    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:9100</destination>
        <includeCallerData>true</includeCallerData>
        <encoder class="net.logstash.logback.encoder.LogstashEncoder">
            <includeCallerData>true</includeCallerData>
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "${springAppName:-}",
                        "trace": "%X{X-B3-TraceId:-}",
                        "span": "%X{X-B3-SpanId:-}",
                        "parent": "%X{X-B3-ParentSpanId:-}",
                        "exportable": "%X{X-Span-Export:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>-->

与springCloud的整合

  • maven依赖
      <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

加入maven依赖之后 在引入logback的配置 就可以将微服务的日志发送导es中 然后根据traceId 进行某个请求的链路追踪

ps

                 "service": "${springAppName:-}",   
  ------>>>>      lowercase=>["springAppName"]  
  ------>>>>      index  => "%{springApName}"  
  • 这个springAppName 的设置需要注意一下

参考文档

https://www.elastic.co/guide/en/logstash/6.0/plugins-filters-mutate.html

猜你喜欢

转载自blog.csdn.net/zhaoyu_nb/article/details/89218251