- 本次使用目的:通过Elastic Stack搭建出一个小型日志系统
从springboot开始输出日志到log,在maven中引入logback-ecs-encoder,来生成log.json,然后通过filebeat获取log.json,把内容存入elasticsearch之后,通过kibana来浏览数据。
ip地址 | 体验版:localhost方式体验交互 |
随意 | elasticsearch服务+kibana服务+filebeat服务 |
ip地址 | 开发版:体验搭建一个小型日志系统 |
192.168.33.131 | elasticsearch服务+kibana服务 |
192.168.33.132 | springboot服务+filebeat服务 |
- 官方地址getting started进行开始:
https://www.elastic.co/guide/en/elastic-stack-get-started/current/get-started-elastic-stack.html
开始根据官网的教程下边进行摘要总结:(本次调试系统为centos7桌面版至少4G内存,带桌面的linux发行版方便localhost浏览器调试,mac系统也体验过是ok的,不太建议windows调试)
下边先安装elasticsearch、kibana、Filebeat体验一下
- 安装启动elasticsearch:
curl -L -O https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.16.2-linux-x86_64.tar.gz
tar -xzvf elasticsearch-7.16.2-linux-x86_64.tar.gz
cd elasticsearch-7.16.2
./bin/elasticsearch
在centos中打开Firefox浏览器,输入网址访问:http://127.0.0.1:9200
- 安装启动kibana
curl -L -O https://artifacts.elastic.co/downloads/kibana/kibana-7.16.2-linux-x86_64.tar.gz
tar xzvf kibana-7.16.2-linux-x86_64.tar.gz
cd kibana-7.16.2-linux-x86_64/
./bin/kibana
在centos中打开Firefox浏览器,输入网址访问:http://127.0.0.1:5601
getting started中演示的是Metricbeat的例子,可自行测试,我们的目标是Filebeat,点击页面链接开始Filebeat
- 官方地址Filebeat:
https://www.elastic.co/guide/en/beats/filebeat/7.16/filebeat-installation-configuration.html
下载解压:
curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-7.16.2-linux-x86_64.tar.gz
tar xzvf filebeat-7.16.2-linux-x86_64.tar.gz
修改配置: 进入到filebeat目录中vim filebeat.yml
output.elasticsearch:
hosts: ["localhost:9200"]
设置assets:
./filebeat setup -e
启动:(虽然启动了但是没有采集任何数据)
sudo chown root filebeat.yml
sudo ./filebeat -e
- 官方日志教程:
https://www.elastic.co/guide/en/ecs-logging/java/current/setup.html
直接从step 3开始,打开vim filebeat.yml,step 1后边接入springboot应用的时候用到
filebeat.inputs:
- type: log
paths: /home/zph/data/logs/demo/*.json
json.keys_under_root: true
json.overwrite_keys: true
json.add_error_key: true
json.expand_keys: true
重启filebeat程序,往/home/zph/data/logs/中创建任意名字的.json文件写入几行数据即可。打开kibana进行查看:http://127.0.0.1:5601/app/discover
好了,就是这么简单已经体验过filebeat采集数据到文件,通过kibana来展示了。玩归玩闹归闹,现在还差的远,远程访问、安全配置如何设置,接着往下走。
分割线---------------------
- 开启elasticsearch外部访问(启动程序用到的端口9200,5601)
进入elasticsearch目录编辑配置文件:vim elasticsearch.yml
network.host: 0.0.0.0
重启可能报错,遇到了3个错误如下
第一个错:启动报错,修改配置:
vim /etc/security/limits.conf
zph soft nofile 65535
zph hard nofile 65537
重新登录zph用户查看修改效果:
ulimit -n
ulimit -H -n
第二个错:启动报错:
vim /etc/sysctl.conf
vm.max_map_count=262144
使配置生效:
/sbin/sysctl -p
第三个错:启动报错:
vim config/elasticsearch.yml
discovery.seed_hosts: ["127.0.0.1", "[::1]"]
启动成功
用IP访问下试试:http://192.168.33.131:9200/
对外访问kibana:修改配置文件vim config/kibana.yml
server.host: "192.168.33.131"
重新启动,用IP访问下试试http://192.168.33.131:5601/
- 开启安全配置:开发阶段先设置成minimal security
https://www.elastic.co/guide/en/elasticsearch/reference/7.16/configuring-stack-security.html
进入elasticsearch目录编辑配置文件:vim elasticsearch.yml
xpack.security.enabled: true
#单节点的时候
discovery.type: single-node
杀死elasticsearch 进程重启,这次采用后台进程启动:
nohup ./bin/elasticsearch >> logs/elasticsearch.log &
设置用户和密码:自动生成,生成的内容自行保存,十分重要
./bin/elasticsearch-setup-passwords auto
访问http://192.168.33.131:9200,此时需要登录账号密码了。
进入kibana目录编辑配置文件:vim kibana.yml
elasticsearch.username: "kibana_system"
创建keystore方式来添加密码:kibana_system用户和密码前边已经自行保存
./bin/kibana-keystore create
./bin/kibana-keystore add elasticsearch.password
杀死kibana进程重启,这次采用后台进程启动:
nohup ./bin/kibana >> kibana.log &
查看进程:
ps -ef|grep node (因为kibana是node写的,所以查看进程需要如此)
查看进程id : netstat -tunlp|grep 5601 kibana默认5601端口
访问http://192.168.33.131:5601/ ,此时需要登录账号密码了。
打开vim filebeat.yml,之前已经自行保存
output.elasticsearch:
hosts: ["myEShost:9200"]
username: "filebeat_internal"
password: "YOUR_PASSWORD"
setup.kibana:
host: "mykibanahost:5601"
username: "my_kibana_user"
password: "{pwd}"
如果使用keystore创建密码则参考:https://www.elastic.co/guide/en/beats/filebeat/7.16/keystore.html,否则明文写入密码
重启Filebeats,后台运行
nohup ./filebeat -e >> filebeat.log &
官网初始化下载springboot,带web功能
pom加载依赖一个日志转json,一个方便日志打印
<dependency>
<groupId>co.elastic.logging</groupId>
<artifactId>logback-ecs-encoder</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
配置application.properties
spring.profiles.active=dev
spring.application.name=my-application
下面配置logback-spring
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
<property name="LOG_HOME" value="logs/demo"/>
<property name="PROJECT_NAME" value="demo"/>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%file:%line) |%green(%logger)
|%cyan(%msg%n)
</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<springProperty name="SERVICE_NAME" source="spring.application.name"/>
<appender name="ECS_JSON_FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="co.elastic.logging.logback.EcsEncoder">
<serviceName>${SERVICE_NAME:-spring-boot-application}</serviceName>
</encoder>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<cleanHistoryOnStart>${LOG_FILE_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<fileNamePattern>${ROLLING_FILE_NAME_PATTERN:-${LOG_HOME}/${PROJECT_NAME}_info.%d{yyyy-MM-dd}.%i.log.json}</fileNamePattern>
<maxFileSize>${LOG_FILE_MAX_SIZE:-10MB}</maxFileSize>
<maxHistory>${LOG_FILE_MAX_HISTORY:-7}</maxHistory>
<totalSizeCap>${LOG_FILE_TOTAL_SIZE_CAP:-0}</totalSizeCap>
</rollingPolicy>
</appender>
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符 -->
<pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%thread] [%-5level] %logger{50} - %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!--日志文件输出的文件名 -->
<FileNamePattern>${LOG_HOME}/${PROJECT_NAME}_info.%d{yyyy-MM-dd}.%i.log</FileNamePattern>
<!--日志文件保留天数 -->
<MaxHistory>15</MaxHistory>
<!--日志文件最大的大小 -->
<MaxFileSize>10MB</MaxFileSize>
</rollingPolicy>
</appender>
<springProfile name="dev">
<root level="info">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="ECS_JSON_FILE_INFO"/>
<appender-ref ref="INFO"/>
</root>
</springProfile>
</configuration>
创建controller
package com.example.demo.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/test")
public void test(){
log.info("数据库信息");
}
}
打包好,放到192.168.33.132中的/home/zph/data/目录中
使用java -jar运行springboot程序
访问:http://192.168.33.132:8080/test/test
打开/home/zph/data/logs/demo目录可以看到输出的启动info信息和自己输出的info信息,
访问kibana:http://192.168.33.131:5601 数据内容会有延迟,过会就可以看到数据
后续:安全配置还有basic security + tls for rest