使用版本:
elasticsearch 7.8.1
kibana 7.8.1
logstash 7.8.1
一、部署ES
1、创建一个es的专属目录,这里我安装在opt目录下
mkdir /opt/es
2、在目录下生成并编辑docker-compose.yml文件
cd /opt/es
vim docker-compose.yml
3、docker-compose.yml文件内容如下
version: "3.3"
services:
elasticsearch:
image: elasticsearch:7.8.1 # es镜像
container_name: elastic #生成的容器名称
environment:
- discovery.type=single-node #部署es为单节点模式
- ES_JAVA_OPTS=-Xms2g -Xmx2g #es运行时的最大内存和最小内存
- xpack.security.enabled=true #设置es的安全性,设置账号密码必需
- ELASTIC_PASSWORD=elastic123456 #设置elastic用户的密码
ports:
- "9222:9200" #这里是将容器的9200端口映射到宿主机的9222
- "9333:9300"
security_opt:
- seccomp=unconfined #解除docker容器的生成线程数限制,否则报错
restart: unless-stopped
4、运行docker-compose.yml文件
docker-compose up -d
-d为后台运行
5、访问9222端口
如果出现以下弹框说明启动成功

二、部署Kibana
1、创建一个kibana的专属目录,这里我安装在opt目录下
mkdir /opt/kibana
2、在目录下生成并编辑docker-compose.yml文件
cd /opt/kibana
vim docker-compose.yml
3、docker-compose.yml文件内容如下
version: "3.3"
services:
kibana:
image: kibana:7.8.1 #kibana镜像
container_name: kibana #生成容器名称
environment:
- ELASTICSEARCH_HOSTS=http://***:9222 #elasticsearch访问地址
- ELASTICSEARCH_USERNAME=elastic #登录用户
- ELASTICSEARCH_PASSWORD=elastic123456 #elastic用户密码
- I18N_LOCALE=zh-CN #设置kibana页面为中文
ports:
- "5600:5601" #这里是将容器的5601端口映射到宿主机的5600
security_opt:
- seccomp=unconfined #解除docker容器的生成线程数限制,否则报错
restart: unless-stopped
4、运行docker-compose.yml文件
docker-compose up -d
5、访问5600端口
如果出现以下页面则说明启动成功

三、部署Logstash
1、创建一个logstash的专属目录,这里我安装在opt目录下
mkdir /opt/logstash
2、进入logstash目录,创建logstash.yml配置文件
cd /opt/logstash
cat > logstash.yml << EOF
xpack.monitoring.enabled: false #关闭监控
EOF
3、创建sincedb目录,用于保存拉取坐标,防止重启后重复拉取
mkdir sincedb
4、在目录下生成并编辑docker-compose.yml文件
vim docker-compose.yml
docker-compose.yml文件内容如下,注意:我这里想读取我本机/opt/app/logs目录中的所有log日志,所以使用映射/opt/app/logs:/logs
version: "3.3"
services:
logstash:
image: logstash:7.8.1 #logstash镜像
container_name: logstash #生成容器名称
volumes:
- /opt/logstash/sincedb:/usr/share/logstash/sincedb # 映射坐标目录
- /opt/app/logs:/logs #映射logs文件夹,根据实际情况替换映射地址
- /opt/logstash/pipeline:/usr/share/logstash/pipeline #映射pipeline目录
- /opt/logstash/logstash.yml:/usr/share/logstash/config/logstash.yml #映射配置文件
security_opt:
- seccomp=unconfined #解除docker容器的生成线程数限制,否则报错
restart: unless-stopped
5、创建pipeline文件夹,添加logstash.conf拉取配置文件
mkdir pipeline
cd pipeline
vim logstash.conf
注意:
es和logstash默认使用UTC时区,而我们使用的时间肯定是亚洲上海时,就会导致logstash获取出来的时间会被logstash转成UTC时间,就会相差8小时(例日志时间09:12,获取出来的时间会是01:12)。所以要使用timezone => “Asia/Shanghai”来指定时区,另外logstash的date转换只支持到毫秒。如果需要更精细的时间则需要使用ruby来截取微秒部分来进行拼接。
logstash.conf文件内容如下:
input {
file {
path => "/logs/*/*.log" #这是读取容器中的/logs目录下所有log文件
start_position => "beginning"
sincedb_path => "/usr/share/logstash/sincedb/access.sincedb" #配置读取坐标,防止重新读取
#配置多行读取,以防将异常打印日志忽略
codec => multiline {
pattern => "^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}\.\d{3}" # 匹配时间戳开头,例2026-01-07 12:12:00.066267
negate => true
what => "previous"
}
}
}
filter {
ruby {
code => "event.set('index_date',event.get('@timestamp').time.localtime('+08:00').strftime('%Y%m%d'))" #配置生成索引时区为中国时间
}
grok {
match => { "message" => "%{TIMESTAMP_ISO8601:logtime} \[%{DATA:thread}\] %{LOGLEVEL:level} %{GREEDYDATA:class} - %{GREEDYDATA:msg}"} #配置切割规则
}
ruby {
code => "
event.set('realtime',event.get('logtime'))
"
}
date {
match => ["logtime", "yyyy-MM-dd HH:mm:ss.SSSSSS", "yyyy-MM-dd HH:mm:ss.SSS"]
target => "@timestamp"
timezone => "Asia/Shanghai"
}
ruby {
code => "
raw_str = event.get('logtime')
m = raw_str.match(/\.(\d+)/)
usec = m ? m[1] : '000'
utc_base = event.get('@timestamp').time.strftime('%Y-%m-%dT%H:%M:%S')
event.set('logtime', utc_base+'.'+usec+'000Z')
"
}
mutate {
remove_field => ["timestamp"]
}
}
output {
elasticsearch {
hosts => ["http://***:9222"] #es地址
user => "elastic"
password => "elastic123456"
index => "logs-%{index_date}" #生成索引名称
ssl => false
}
stdout { codec => rubydebug } # 可选:调试输出
}
6、运行docker-compose.yml文件
docker-compose up -d
7、使用docker-compose logs -f查看打印日志,如果有成功读取则完成
四、相关配置
一、es,kibana,logstash默认都是使用UTC时区,如果发现日志实际时间和kibana显示时间相差有区别则需要修改时差
1、打开Stack Management

2、找到Advanced Settings

3、搜索Timezone for date formatting并选择Asia/Shanghai上海时区

4、修改完成后,右下角会有保存设置,保存即可

发表回复