zoukankan      html  css  js  c++  java
  • 记一次logback传输日志到logstash根据自定义设置动态创建ElasticSearch索引

    先说背景,由于本人工作需要创建很多小应用程序,而且在微服务的大环境下,服务越来越多,然后就导致日志四分五裂,到处都有,然后就有的elk,那么问题来了 不能每个小应用都配置一个 logstash 服务来传输日志吧,把所有的日志都 输送到一个logstash里面  然后logstash会都输送到一个索引下(之前不知道怎么配),输送到同一个所以下 那么问题又来了,首先每个小服务程序日志量不大希望持续监控,也不需要用时间来分割(因为日志量不大),又希望查询方便(不要告诉我查询的时候多一个筛选条件就可以了,俺就是不想那样嫌乱不好找)。所有有了下面的解决方案

    首先本人用的日志框架是logback,使用

         <dependency>
                <groupId>net.logstash.logback</groupId>
                <artifactId>logstash-logback-encoder</artifactId>
                <version>4.11</version>
            </dependency>

    这个包进行 socket向lostash进行日志输送

    以下为重点

    首先通读上面pom文件依赖的开源包文档net.logstash.logback,连接地址为:https://github.com/logstash/logstash-logback-encoder

    看完之后马上回来,就会明白我下面说的

    首先配置logback.xml日志

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="false" scan="true" scanPeriod="1 seconds">
        <include resource="org/springframework/boot/logging/logback/base.xml" />
        <!-- <jmxConfigurator/> -->
        <contextName>logback</contextName>
    
        <property name="log.path" value="E:\123456\logback.log" />
    
        <property name="log.pattern"
            value="%d{yyyy-MM-dd HH:mm:ss.SSS} -%5p ${PID} --- [%15.15t] %-40.40logger{39} : %m%n" />
    
        
        <appender name="file"
            class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.path}</file>
    
            <encoder>
                <pattern>${log.pattern}</pattern>
            </encoder>
    
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
    
                <fileNamePattern>info-%d{yyyy-MM-dd}-%i.log
                </fileNamePattern>
    
                <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
    
                    <maxFileSize>10MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <maxHistory>10</maxHistory>
            </rollingPolicy>
    
        </appender>
    
        <appender name="socket"
            class="net.logstash.logback.appender.LogstashSocketAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>INFO</level>
            </filter>
            <host>10.10.129.35</host>
            <port>4569</port>
            <customFields>{"appname":"myapp"}</customFields>
        </appender>
        <appender name="LOGSTASH"
            class="net.logstash.logback.appender.LogstashTcpSocketAppender">
            <destination>IP:PORT</destination>
            <!-- encoder必须配置,有多种可选 -->
            <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
                 <customFields>{"appname":"myapp"}</customFields>
            </encoder>
        <!-- <destination>destination1.domain.com:4560</destination> 
            <destination>destination2.domain.com:4560</destination> 
            <destination>destination3.domain.com:4560</destination> -->
          <connectionStrategy>
              <roundRobin>
                  <connectionTTL>5 minutes</connectionTTL>
              </roundRobin>
          </connectionStrategy>
        </appender>
    
    
        <root level="info">
            <!-- <appender-ref ref="file" /> -->
            <appender-ref ref="socket" />
            <!-- <appender-ref ref="LOGSTASH" /> -->
        </root>
    
    </configuration>

    上面的配置文件主要有以下几点不同
    首先我们采用了tcp的方式将日志发送给ElasticSearch搜索引擎
    然后多了一个这个

    <customFields>{"appname":"myapp"}</customFields>
    这个配置是我自定义的看了 跳转的文档之后就会明白 这个是扩展字段,每条日志信息都会带有这个信息
    如下:

    从而我们就可以区分每条日志
    接下来我们看 logstash配置文件应如何配置
    input {
        tcp {
            port => 4569
            codec => "json"
        }
    }
    
    output {
    
         elasticsearch {
            action => "index"
            hosts => ["IP:prot"]
            index => "%{[appname]}"
            }
    
    
    }

    上面就是我们的配置 是不是很简单,简单解释一下 

    net.logstash.logback 这个框架默认输出日志是json 所以一定要有codec => "json" 这个配置

    index => "%{[appname]}" 这个配置就是获取日志中的 appname字段的值做为索引的名称

    哦忘了解释一下

    <connectionStrategy>
      <roundRobin>
        <connectionTTL>5 minutes</connectionTTL>
      </roundRobin>
    </connectionStrategy>

    这个配置是 向logstash输出日志如果有多个logstash IP或端口可以轮询负载各端口

    以上就是这次问题的记录,希望对有需要的有所帮助。

     

  • 相关阅读:
    python+requests——定制请求头——cookie
    python+requests——高级用法——上传文件
    彻底搞定C指针例题
    static_cast, dynamic_cast, reinterpret_cast, const_cast区别比较
    单链表的基本操作
    new int[10]()
    用人单位给计算机系学生的一封信(超长评论版)
    指向二维数组的指针
    《windows程序设计》第一章学习心得
    VS2010编译Lua程序
  • 原文地址:https://www.cnblogs.com/zhyg/p/6994314.html
Copyright © 2011-2022 走看看