先說背景,由于本人工作需要建立很多小應用程式,而且在微服務的大環境下,服務越來越多,然後就導緻日志四分五裂,到處都有,然後就有的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或端口可以輪詢負載各端口
以上就是這次問題的記錄,希望對有需要的有所幫助。