1. 程式人生 > >記一次logback傳輸日誌到logstash根據自定義設定動態建立ElasticSearch索引

記一次logback傳輸日誌到logstash根據自定義設定動態建立ElasticSearch索引

轉:https://www.cnblogs.com/zhyg/p/6994314.html

先說背景,由於本人工作需要建立很多小應用程式,而且在微服務的大環境下,服務越來越多,然後就導致日誌四分五裂,到處都有,然後就有的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或埠可以輪詢負載各埠

以上就是這次問題的記錄,希望對有需要的有所幫助。