max_map_count: 定义了一个进程能拥有的最多的内存区域,默认为 65536 内存异常处理
cat >> /etc/sysctl.conf <<-'EOF'
net.ipv4.ip_forward=1
vm.max_map_count=655360
EOF
sysctl -p
利用docker macvlan模式让每一个容器都拥有独立IP
docker network create -d macvlan \
--subnet=192.168.31.0/24 \
--ip-range=192.168.31.0/24 \
--gateway=192.168.31.1 \
-o parent=ens33 \
macvlan31
构建ElasticSearch7,用于存储日志数据
docker run --name elasticsearch \
--restart=always \
--network macvlan31 --ip=192.168.31.240 \
-e "discovery.type=single-node" -d \
elasticsearch:7.9.3
docker exec -it elasticsearch /bin/bash
tee >> /usr/share/elasticsearch/config/elasticsearch.yml <<-'EOF'
http.cors.enabled: true
http.cors.allow-origin: "*"
EOF
exit
docker restart elasticsearch
部署Kibana,用于数据交互与演示
docker run --name kibana \
--restart=always \
--network macvlan31 --ip=192.168.31.241 \
-e ELASTICSEARCH_URL=http://192.168.31.240:9200 \
-d kibana:7.9.3
部署Logstash,用于日志转换与过滤筛选
mkdir /home/elk
tee > /home/elk/logstash.conf <<-'EOF'
input {
tcp {
port => 5044
# 输入为json数据
codec => json_lines
}
}
filter {
ruby {
code => "event.set('timestamp', event.get('@timestamp').time.localtime + 8*60*60)"
}
ruby {
code => "event.set('@timestamp',event.get('timestamp'))"
}
mutate {
remove_field => ["timestamp"]
}
}
output {
# 这个是logstash的控制台打印(进行安装调试的时候开启,稍后成功后去掉这个配置即可)
stdout {
codec => rubydebug
}
# elasticsearch配置
elasticsearch {
hosts => ["192.168.31.240:9200"]
# 索引名称,没有会自动创建
index => "logstash-%{[server_name]}-%{+YYYY.MM.dd}"
}
}
EOF
docker run --network macvlan31 --ip=192.168.31.242 -v /home/elk/logstash.conf:/usr/share/logstash/pipeline/logstash.conf --name logstash -d logstash:7.17.5
客户端1:应用使用logstash-logback-encoder向Logstash推送日志数据
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<layout class="ch.qos.logback.classic.PatternLayout">
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %highlight(%-5level) %cyan(%logger{50}.%M.%L) - %highlight(%msg) %n</pattern>
</layout>
</appender>
<!--logback输出-->
<appender name="STASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.31.242:5044</destination>
<encoder class="net.logstash.logback.encoder.LogstashEncoder">
<!-- 打印行号、方法名,官方不建议在生产环境开启此配置,默认为false(关闭),具网友测试开启后的耗时是未开启的大约360倍的时间(业务量小的时候可以忽略) -->
<includeCallerData>true</includeCallerData>
<!-- 设置时区-->
<timeZone>UTC</timeZone>
<!-- 日期格式化-->
<!-- <timestampPattern>yyyy-MM-dd'T'HH:mm:ss.SSS</timestampPattern>-->
<!-- 添加自定义属性,这里的server_name是服务名-->
<customFields>{"server_name":"demo-server"}</customFields>
</encoder>
<!-- 设置超时时间, 默认没有,使用集群的时候可以加上-->
<!--<writeTimeout>30 seconds</writeTimeout>-->
</appender>
<root level="INFO">
<!--本地开发调试将控制台输出打开,同时将日志文件输出关闭,提高日志性能;线上部署请务必将控制台输出关闭-->
<appender-ref ref="STDOUT"/>
<appender-ref ref="STASH"/>
</root>
</configuration>
验证脚本
GET /logstash-demo-server-2022.08.18/_search
{
"sort": [
{
"@timestamp": {
"order": "desc"
}
}
],
"query": {
"match": {
"level":"INFO"
}
}
}