Docker安装ELK

本文介绍了如何在CentOS7.9上使用Docker安装ELK(Elasticsearch,Logstash,Kibana)7.17.7版本。详细步骤包括创建安装目录、配置Logstash、编写Docker-compose文件以及集成logback进行日志收集。此外,还提供了定时清理日志数据的shell脚本和crontab设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker安装ELK

1.环境介绍

OS: CentOS Linux release 7.9.2009 (Core)

机器:10.28.19.110

安装版本:7.17.7

Docker版本:1.13.1

IP10.28.19.110

2.部署ELK

2.1创建ELK安装目录

mkdir -p /opt/elk/{elasticsearch/{data,plugins},logstash/config}

最终目录结构如下:

/opt/elk
├── elasticsearch
│ ├── data
│ └── plugins
└── logstash
└── config

从5.0开始 elasticsearch 安全级别提高了,这里准备将es的插件安装目录,及数据存储目录从宿机挂载至容器里面。

/opt/elk/elasticsearch目录提前授权:

chmod -R 777 /opt/elk/elasticsearch/

2.2创建logstash配置文件

tee /opt/elk/logstash/config/logstash.conf << \EOF
input {
  tcp {
     mode => "server"
     host => "0.0.0.0"
     port => 5041
     type => "amaxlog"
     codec => json_lines
  }
}

filter {
  date {
    match => [ "timestamp", "yyyy-MM-dd HH:mm:ss.SSS" ]
    target => "@timestamp"
  }
}

output {
  elasticsearch {
   hosts => ["10.28.19.110:9200"]
   index => "amaxlog-%{+YYYY.MM.dd}"
   codec => json
   action => "index"
  }
}
EOF

上面hosts是配置的es节点地址,index是指定ES索引名称,索引名称这里按天创建,是为了将日志按天切割及清理。

2.3编写ELK部署文件

创建docker-compose编排文件:

tee /opt/elk/elk-docker-compose.yml << \EOF
version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.17.7  # 镜像
    container_name: elk_elasticsearch  # 定义容器名称
    restart: always  # 开机启动,失败也会一直重启
    environment:
      - "cluster.name=elasticsearch" # 设置集群名称为elasticsearch
      - "discovery.type=single-node" # 以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms512m -Xmx1024m" # 设置使用jvm内存大小
    volumes:
      - /opt/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins # 插件文件挂载
      - /opt/elk/elasticsearch/data:/usr/share/elasticsearch/data # 数据文件挂载
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.17.7
    container_name: elk_kibana
    restart: always
    depends_on:
      - elasticsearch # kibana在elasticsearch启动之后再启动
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 # 设置访问elasticsearch的地址
      - I18N_LOCALE=zh-CN # kibana中文界面显示
    ports:
      - 5601:5601
  logstash:
    image: logstash:7.17.7
    container_name: elk_logstash
    restart: always
    volumes:
      # 挂载logstash的配置文件
      - /opt/elk/logstash/config/logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch # kibana在elasticsearch启动之后再启动
    links:
      - elasticsearch:es # 可以用es这个域名访问elasticsearch服务
    ports:
      - 5041:5041
EOF

注意,这里logstash暴露的端口要与logstash配置文件中监听的端口一致,否则后续收集不到日志。

2.4部署ELK

启动部署:

docker-compose -f /opt/elk/elk-docker-compose.yml up -d

验证ES服务:

http://10.28.19.110:9200/

验证kibana:
http://10.28.19.110:5601/

如无意外,es与Kibana都能正常打开。

3.项目代码集成logstash

这里以logback为示例,集成logstash。

添加jar引用:

<!--(ELK)logstash-->
<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.3</version>
</dependency>

logback.xml完整示例:

<?xml version="1.0" encoding="UTF-8"?>
<!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 -->
<!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true -->
<!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 -->
    <property name="logStashIP" value="10.28.19.110"/>
    <property name="logStashPort" value="5041"/>
    <property name="appName" value="profile-dev}"/>
    <property name="pattern_script"
              value="${appName} %date{yyyy-MM-dd HH:mm:ss.SSS} [%thread] [%-5level] [%c{50}.%M\\(\\) : %line] - %msg%n"/>

    <!-- 控制台输出日志 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${pattern_script}</pattern>
            </layout>
            <charset class="java.nio.charset.Charset">UTF-8</charset>
        </encoder>
    </appender>

    <!--LOGSTASH-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>${logStashIP:- }:${logStashPort:- }</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <!--自定义字段,区分应用名称-->
            <customFields>{"appname":"${appName}"}</customFields>
        </encoder>
        <!-- 过滤掉 TRACE 和 DEBUG 级别的日志-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
    </appender>

    <logger name="com.centaline" level="DEBUG"/>

    <!-- 异步输出日志 -->
    <appender name="ASYNC_STDOUT" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="STDOUT"/>
        <!-- 设置队列入队时非阻塞,当队列满时会直接丢弃日志,但是对性能提升极大 -->
        <neverBlock>true</neverBlock>
        <!-- 新增这行为了打印栈堆信息 -->
        <includeCallerData>true</includeCallerData>
    </appender>
    <appender name="ASYNC_LOGSTASH" class="ch.qos.logback.classic.AsyncAppender">
        <appender-ref ref="LOGSTASH"/>
        <neverBlock>true</neverBlock>
        <includeCallerData>true</includeCallerData>
    </appender>

    <root level="INFO">
        <appender-ref ref="ASYNC_STDOUT"/>
        <appender-ref ref="ASYNC_LOGSTASH"/>
    </root>
</configuration>

4.定时清理日志数据

注意:日志索引一定要以日期后缀方式才能按时间去清理,示例格式:amaxlog-2023.07.07

编写清理日志索引shell脚本:

tee /opt/elk/clean_elk.sh << \EOF
#!/bin/bash
# @Author: 胡桃夹子
# @Date:   2023-07-10
 
# ELK日志数据保留近 N 天
KEEP_DAYS=30

# ES地址
ES_SERVER=10.28.19.110:9200

# 日志索引名称前缀,示例:amaxlog-2023.07.07
LOG_INDEX_PREFIX=amaxlog
 
# 删除前 N的所有天到 前N+10天==>每天执行
function get_to_days()
{
    # declare -A DAY_ARR
    # DAY_ARR=""
    for i in $(seq 1 10);
    do
        THIS_DAY=$(date -d "$(($KEEP_DAYS+$i)) day ago" +%Y.%m.%d)
        DAY_ARR=( "${DAY_ARR[@]}" $THIS_DAY)
    done

    echo ${DAY_ARR[*]}
 
}
 
# 返回数组的写法
TO_DELETE_DAYS=(`get_to_days`)
 
for DAY in "${TO_DELETE_DAYS[@]}"
do
    echo "${LOG_INDEX_PREFIX}-${DAY} index will be delete" 
    URL=http://${ES_SERVER}/${LOG_INDEX_PREFIX}-${DAY}
    # echo ${URL}
    curl -XDELETE ${URL}
done
EOF

上面shell中变量解释:

KEEP_DAYS代表日志保留天数;

ES_SERVER代表ES的服务地址;

LOG_INDEX_PREFIX日志索引名称前缀,示例:amaxlog-2023.07.07;

for i in $(seq 1 10) 数字10 代表 删除7天以前的10天,如果你之前还有1年的数据 可以改成365;

授权shell脚本可执行权限:

chmod +x /opt/elk/clean_elk.sh

配置定时任务:

编辑任务列表

crontab -e

添加定时任务,每天凌晨1点钟执行

0 1 * * * /opt/elk/clean_elk.sh >/dev/null 2>&1

至此,ELK已经完成安装、应用集成、定时清理。

5.引用Reference

CentOS8搭建nfs服务
Kubernetes 1.25.4版本安装
kubeasz安装kubernetes1.25.5
k8s一键安装redis单机版
k8s一键安装mysql8单机版
k8s部署springboot应用
Docker安装及学习
Docker制作springboot运行应用镜像
Docker制作Java8环境镜像
Docker安装Mysql5.7.31
Docker安装Mysql8.1.0
Elasticsearch单机版本安装
Elasticsearch集群安装
ELK安装
Docker安装ELK
zookeeper集群安装
Nginx日志切割
RabbitMQ集群安装
springboot集成prometheus+grafana
windows11安装android应用

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值