記一次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或端口可以輪詢負載各端口
以上就是這次問題的記錄,希望對有需要的有所幫助。
記一次logback傳輸日誌到logstash根據自定義設置動態創建ElasticSearch索引