SpringBoot使用自带logback日志框架,整合LogstashTcpSocketAppender组件,把日志传输到 logstash,再由logstash对日志进行过滤采集到elasticsearch,最后通过kibana展示和查询日志数据。
产品 | 版本 | 备注 |
---|---|---|
logstash | 7.17.2 | 无 |
elasticsearch | 7.17.2 | 无 |
kibana | 7.17.2 | 从7.9开始,界面发生了很大的变化 |
docker | 20.10.6 | 版本不强制,但是不要太低 |
docker-compose | 1.19.0 | 版本不强制,但是不要太低 |
# 创建 elasticsearch 相关文件夹,赋予权限
mkdir -p /root/elk/elasticsearch/{plugins,data,logs}
chmod -R 775 /root/elk/elasticsearch/
# 创建 kibana 文件夹,并创建 kibana.yml 文件
mkdir -p /root/elk/kibana/config
touch /root/elk/kibana/config/kibana.yml
# 创建 logstatsh 相关文件夹,并创建 logstash.yml 文件 和 logstash.conf 文件
mkdir -p /root/elk/logstash/{config,pipeline}
touch /root/elk/logstash/config/logstash.yml
touch /root/elk/logstash/pipeline/logstash.conf
# 创建docker-compose.yml文件
touch /root/elk/docker-compose.yml
kibana.yml
server.host: "0.0.0.0"
server.shutdownTimeout: "5s"
elasticsearch.hosts: [ "http://127.0.0.1:9200" ]
logstash.yml
xpack.monitoring.elasticsearch.hosts: [ "http://127.0.0.1:9200" ]
logstash.conf
input {
tcp {
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
# 这里的 spring.application.name 来自springboot中logback配置的数据
index => "%{[spring.application.name]}-%{+YYYY.MM.dd}"
}
}
docker-compose.yml
version: '3'
services:
elasticsearch:
image: elasticsearch:7.17.2
container_name: elasticsearch
ports:
- "9200:9200"
- "9300:9300"
environment:
# 设置集群名称
- cluster.name=elasticsearch
# 以单一节点模式启动
- discovery.type=single-node
volumes:
- /root/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins
- /root/elk/elasticsearch/data:/usr/share/elasticsearch/data
- /root/elk/elasticsearch/logs:/usr/share/elasticsearch/logs
kibana:
image: kibana:7.17.2
container_name: kibana
ports:
- "5601:5601"
depends_on:
# kibana在elasticsearch启动之后再启动
- elasticsearch
environment:
#设置系统语言文中文
I18N_LOCALE: zh-CN
# 访问域名
# SERVER_PUBLICBASEURL: https://kibana.cloud.com
volumes:
- /root/elk/kibana/config/kibana.yml:/usr/share/kibana/config/kibana.yml
logstash:
image: logstash:7.17.2
container_name: logstash
ports:
- "4560:4560"
volumes:
- /root/elk/logstash/pipeline/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
- /root/elk/logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml
depends_on:
- elasticsearch
在elk目录下执行 **docker-compose up -d ** 启动ELK,在浏览器访问 kibana端口号(5601)
① 在 pom.xml 当中添加 logstash-logback-encoder 依赖
<!-- logstash -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.1.1</version>
</dependency>
② 在原本的 logback-spring.xml 文件里添加如下 LogstashTcpSocketAppender
<springProperty scope="context" name="appName" source="spring.application.name"/>
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>127.0.0.1:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>Asia/Shanghai</timeZone>
</timestamp>
<pattern>
<pattern>
{
"spring.application.name":"${appName}",
"traceid":"%X{traceid}",
"level": "%level",
"thread": "%thread",
"class": "%logger{40}",
"message": "%message\n%exception"
}
</pattern>
</pattern>
</providers>
</encoder>
</appender>
注意还需要指定开启新配置的组件
<root level="debug">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<!-- 指定传输logstash -->
<appender-ref ref="LOGSTASH"/>
</root>
③ 编写Java Test测试类
@SpringBootTest
@RunWith(SpringRunner.class)
class FileApplicationTests {
Logger log = LoggerFactory.getLogger(FileApplicationTests.class);
@Test
void testLogStash() {
log.debug("这是debug日志");
log.warn("这个是warn日志");
log.info("这个是info日志");
log.error("这个是error日志");
}
}
启动运行这个测试类之后,前往Kibana控制台。
④ 打开Kibana,左侧菜单栏最下面的 Management 中的 Stack Management ,再找到索引模式,点击创建索引
⑤ 去左侧菜单栏 Analytics 下的 Discover 页面查看日志。
日志中蓝色背景的标签是可以筛选查看的,点击左侧,只查看level和message,使得日志更直观
⑥ 修改@timestamp时间格式,默认的时间格式和日志的格式不一样,这个是可以配置的。
⑦ 补充一个实时日志传输的功能配置
点击左侧菜单 Observatbility 下面的日志,然后点击右上角设置,选择Kibana索引模式
选择之前配置的索引模式进行保存,然后返回左侧 Stream 界面,发现左侧就有实时流式传输按钮
我发现这个功能会比面那个会好一点,不过不能太依赖实时传输,一定记得看日志时间对不对。
这个只是初版,最低的安全配置都没有开,有很多配置都未完善,还需继续努力钻研,欢迎评论留言进行交流讨论,有要参考的同学,切记要记得改 IP。