1.添加依賴
在Maven項目中添加如下依賴:
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>4.8</version>
<scope>runtime</scope>
</dependency>
2.配置Logback+Logstash
- 如果Logback形式爲logback.xml,則引入如下appender:
<configuration>
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>10.8.120.37:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashSocketAppender"/>
</appender>
<root level="INFO">
<appender-ref ref="stash" />
</root>
</configuration>
- 如果Logback形式爲logback-access.xml,則引入如下appender:
<configuration>
<appender name="stash" class="net.logstash.logback.appender.LogstashAccessTcpSocketAppender">
<destination>10.8.120.37:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashAccessEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="stash" />
</root>
</configuration>
- 在Logstash中添加如下配置文件:
input {
tcp {
port => 4560
codec => json_lines
mode => "server"
}
}
output {
stdout {
codec => rubydebug
}
elasticsearch {
hosts => "10.8.120.37:9200"
index => "logbt-%{+YYYY.MM.dd}"
}
}
此時,通過log.info()、log.error()等方式打印的日誌,將會通過TCP方式發送到10.8.120.37的4560端口,然後由logstash接收到,如下所示: 如果logstash無法接收到,可將上述Logback配置中logback.xml和logback-access.xml對調配置(有時候logback配置抽風,不按GitHub上說得來)。
目前爲止,簡單的Logback聯動ELK已經實現了。
3.Logback自定義設置
筆者用的appender是LogstashTcpSocketAppender,但有時LogstashTcpSocketAppender默認的配置信息不能滿足我們的訴求,比如上述圖片沒有行號信息。這時候就需要自己設置需要的字段來讓appender提供(前提是appender支持)。
3.1自定義appender提供字段
這裏不涉及開發,我們只需更改appender的格式即可,筆者的具體格式如下:
<appender name="stash"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>10.8.120.37:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp/>
<version/>
<message/>
<loggerName/>
<threadName/>
<logLevel/>
<callerData/>
</providers>
</encoder>
</appender>
在logstash中具體效果如下:3.2自定義patterns
自定義appender patterns格式如下:
<appender name="stash1" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>10.8.120.37:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}", //時間戳格式
"thread": "%thread", //進程名
"level": "%level", //日誌等級
"logger_name": "%logger", //日誌記錄器名
"class_name": "%class", //類名
"method_name": "%method", //方法名
"line_number": "%line", //行號
"message": "%message" //日誌主題信息
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
<appender name="stashPrd"
class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>10.8.120.37:4560</destination>
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<pattern>
<pattern>
{
"timestamp": "%d{yyyy-MM-dd HH:mm:ss.SSS}",
"thread": "%thread",
"level": "%level",
"position": "%class.%method Line:%-3L",
"log": "%message",
"type": "api-prd"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
logstash中得到日誌消息如下: