logback 集成 logstash
相關(guān)環(huán)境參考: Java 輸出 JSON 日志
1. 添加依賴
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
2. 修改logback.xml配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!-- scan=true 支持動(dòng)態(tài)更新配置文件,默認(rèn)1分鐘刷新一次,可以通過(guò) scanPeriod="30 seconds" 指定刷新周期 -->
<configuration scan="true">
<!-- in the absence of the class attribute, assume ch.qos.logback.core.hook.ShutdownHook -->
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
<delay>5 seconds</delay>
</shutdownHook>
<!-- 控制臺(tái)輸出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] - %-5level %logger:%L - %msg%n</pattern>
</encoder>
</appender>
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- logstash tcp 服務(wù)器地址,可以配置多個(gè)地址 -->
<destination>172.30.225.232:5000</destination>
<!-- 保持連接 -->
<keepAliveDuration>5 minutes</keepAliveDuration>
<!-- 連接超時(shí)等待時(shí)間 -->
<connectionTimeout>5 seconds</connectionTimeout>
<!-- 重連延遲,默認(rèn) 30s -->
<reconnectionDelay>30 second</reconnectionDelay>
<!-- 等待策略,需要測(cè)試和監(jiān)控CPU找到最佳配置 -->
<!-- 文檔: https://github.com/logfellow/logstash-logback-encoder#wait-strategy -->
<waitStrategyType>sleeping</waitStrategyType>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"host":"${HOSTNAME}", "appname":"cloud-user"}</customFields>
</encoder>
</appender>
<root level="INFO">
<appender-ref ref="logstash"/>
<appender-ref ref="STDOUT"/>
</root>
</configuration>
3. 配置說(shuō)明
如果原有配置文件中需要保留一些特殊配置時(shí),需要理解這里的配置才能將配置應(yīng)用到已有的配置中。
3.1 動(dòng)態(tài)刷新
想要在應(yīng)用運(yùn)行時(shí)看到修改配置文件后的效果,可以在原有配置添加:
<!-- scan=true 支持動(dòng)態(tài)更新配置文件,默認(rèn)1分鐘刷新一次,可以通過(guò) scanPeriod="30 seconds" 指定刷新周期 -->
<configuration scan="true">
3.2 優(yōu)雅關(guān)機(jī)
增加logstash配置后,為了讓程序在關(guān)閉時(shí)能正確關(guān)閉相關(guān)的資源,建議配置:
<shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook">
<delay>5 seconds</delay>
</shutdownHook>
服務(wù)會(huì)等待5秒后執(zhí)行釋放資源的相關(guān)操作。
3.3 logstash appender
添加下面的配置,各部分說(shuō)明看下面注釋:
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- logstash tcp 服務(wù)器地址,可以配置多個(gè)地址 -->
<destination>IP:5000</destination>
<!-- 保持連接 -->
<keepAliveDuration>5 minutes</keepAliveDuration>
<!-- 連接超時(shí)等待時(shí)間 -->
<connectionTimeout>5 seconds</connectionTimeout>
<!-- 重連延遲,默認(rèn) 30s -->
<reconnectionDelay>30 second</reconnectionDelay>
<!-- 等待策略,需要測(cè)試和監(jiān)控CPU找到最佳配置 -->
<!-- 文檔: https://github.com/logfellow/logstash-logback-encoder#wait-strategy -->
<waitStrategyType>sleeping</waitStrategyType>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<customFields>{"host":"${HOSTNAME}", "appname":"cloud-user"}</customFields>
</encoder>
</appender>
這里特別說(shuō)明 <customFields>{"host":"${HOSTNAME}", "appname":"cloud-user"}</customFields>
:
-
host
會(huì)在 json 中添加主機(jī)信息,以后有類似 POD 相關(guān)信息時(shí),可以參考這里使用環(huán)境變量。 -
appname
定義當(dāng)前的應(yīng)用名,這里配置死的,后續(xù)使用容器或者POD時(shí),也可以通過(guò)環(huán)境變量進(jìn)行設(shè)置。
除此之外,還可以添加額外的自定義字段。
3.4 應(yīng)用 appender
將 logstash appender 添加到某個(gè) logger 下面,例如全局的:
<root level="INFO">
<appender-ref ref="logstash"/>
<!-- 其他 appender -->
</root>
3.5 總結(jié)
到這里可以看到,上面提供的完整配置中,沒(méi)有介紹常見(jiàn)的 控制臺(tái)輸出,其他都是必要的配置。
配置正常后,就可以將日志以 JSON 形式輸出到 logstash 中了,logstash 可以參考下面的配置,提供 tcp 端口的服務(wù):
input {
tcp {
port => 5000
codec => json_lines
}
}
output {
elasticsearch {
hosts => ["elasticsearch:9200"]
index => "app-%{[appname]}-%{+YYYY.MM.dd}"
}
stdout {
}
}
elasticsearch 插件文檔:https://www.elastic.co/guide/en/logstash/8.5/plugins-outputs-elasticsearch.html
上面的配置會(huì)為每個(gè) appname
創(chuàng)建對(duì)應(yīng)的索引,在 Kibana 中的 DavaView 可以配置 app*
索引來(lái)查看所有應(yīng)用的日志。
4. 代碼中使用
默認(rèn)情況下,代碼中仍然通過(guò) logger.info(...)
方式輸出日志即可,日志的內(nèi)容會(huì)作為 message
字段存儲(chǔ)。
如果想要額外記錄其他信息,全局的信息可以通過(guò) slf4j
的 MDC 機(jī)制記錄,如下:
//記住用slf4j,不要依賴具體的實(shí)現(xiàn)
//import org.slf4j.MDC;
MDC.put("xxx", "xxx");
logger.info(....);
MDC.remove("XXX");
MDC信息和線程綁定,處理不好可能會(huì)亂,logstash-logback-encoder 提供了 StructuredArguments
,參考文檔:
https://github.com/logfellow/logstash-logback-encoder#event-specific-custom-fields
由于這種方式依賴了具體的日志實(shí)現(xiàn),需要做一層封裝才適合使用。
5. Kibana 效果
5.1 索引
5.2 Data Views
5.3 Discover
文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-791320.html
對(duì)應(yīng)的 JSON:文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-791320.html
{
"_index": "app-cloud-user-2022.11.26",
"_id": "qbYdsoQBuYtdaHhXAY0t",
"_version": 1,
"_score": 0,
"_source": {
"message": "hello indexStr=201, 2022-11-26T04:05:55.852Z",
"@version": "1",
"appname": "cloud-user",
"host": "liuzh-pc",
"level_value": 20000,
"config": {
"date": "2022-11-26 12:05:55",
"uuid": "dd0cedcc-82e4-4783-8bcc-09c32b2fd051"
},
"thread_name": "Thread-9",
"level": "INFO",
"dateStr": "2022-11-26T04:05:55.852Z",
"logger_name": "com.example.springbootjsonlog.SpringBootJsonLogApplication",
"@timestamp": "2022-11-26T04:05:55.852Z",
"HOSTNAME": "liuzh-pc",
"indexStr": "201"
},
"fields": {
"config.date": [
"2022-11-26 12:05:55"
],
"indexStr": [
"201"
],
"appname.keyword": [
"cloud-user"
],
"config.date.keyword": [
"2022-11-26 12:05:55"
],
"appname": [
"cloud-user"
],
"host": [
"liuzh-pc"
],
"@version": [
"1"
],
"logger_name": [
"com.example.springbootjsonlog.SpringBootJsonLogApplication"
],
"host.keyword": [
"liuzh-pc"
],
"logger_name.keyword": [
"com.example.springbootjsonlog.SpringBootJsonLogApplication"
],
"config.uuid.keyword": [
"dd0cedcc-82e4-4783-8bcc-09c32b2fd051"
],
"thread_name.keyword": [
"Thread-9"
],
"dateStr": [
"2022-11-26T04:05:55.852Z"
],
"level": [
"INFO"
],
"HOSTNAME.keyword": [
"liuzh-pc"
],
"@version.keyword": [
"1"
],
"message": [
"hello indexStr=201, 2022-11-26T04:05:55.852Z"
],
"@timestamp": [
"2022-11-26T04:05:55.852Z"
],
"HOSTNAME": [
"liuzh-pc"
],
"level.keyword": [
"INFO"
],
"level_value": [
20000
],
"thread_name": [
"Thread-9"
],
"message.keyword": [
"hello indexStr=201, 2022-11-26T04:05:55.852Z"
],
"indexStr.keyword": [
"201"
],
"config.uuid": [
"dd0cedcc-82e4-4783-8bcc-09c32b2fd051"
]
}
}
到了這里,關(guān)于logback 集成 logstash的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!