Docker部署ELK日志系统

使用版本:

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、修改完成后,右下角会有保存设置,保存即可


已发布

分类

, ,

来自

标签:

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注