ELK实现日志采集

本文使用Filebeat采集日志,将日志输出给Logstash并保存到Elasticsearch 中,通过Kibana可视化界面展示日志

收集docker日志方式 elk收集docker日志_docker

一、Elasticsearch和Kibaba安装

作者使用docker一键安装部署Elasticsearch集群和kibana
docker和docker-compose安装脚本:

程序中resources/docker/目录下也有

Elasticsearch和Kibana安装脚本:

创建docker-compose文件

vim docker-compose.yml
version: '2.2'
services:
  cerebro:
    image: lmenezes/cerebro:0.8.3
    container_name: cerebro
    ports:
      - "9000:9000"
    command:
      - -Dhosts.0.host=http://elasticsearch:9200
    networks:
      - es7net
  kibana:
    image: docker.elastic.co/kibana/kibana:7.4.2
    container_name: kibana7
    environment:
      - I18N_LOCALE=zh-CN
      - XPACK_GRAPH_ENABLED=true
      - TIMELION_ENABLED=true
      - XPACK_MONITORING_COLLECTION_ENABLED="true"
    ports:
      - "5601:5601"
    networks:
      - es7net
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
    container_name: es7_01
    environment:
      - cluster.name=eslearn
      - node.name=es7_01
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_01,es7_02
      - cluster.initial_master_nodes=es7_01,es7_02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es7data1:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - es7net
  elasticsearch2:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.4.2
    container_name: es7_02
    environment:
      - cluster.name=eslearn
      - node.name=es7_02
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - discovery.seed_hosts=es7_01,es7_02
      - cluster.initial_master_nodes=es7_01,es7_02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - es7data2:/usr/share/elasticsearch/data
    networks:
      - es7net
volumes:
  es7data1:
    driver: local
  es7data2:
    driver: local

networks:
  es7net:
    driver: bridge

启动和停止命令:

启动:
docker-compose up -d
停止:
docker-compose down

二、Logstash安装配置和启动

Logstash安装:

Logstash配置:
作者使用grok表达式来格式化程序 输出的日志。


cp logstash-sample.conf logstash.conf
vim logstash.conf
input {
    beats {
        port => "5044"  ##指定监听端口
    }
}
filter {
	## 这里使用grok表达式
    grok {
        patterns_dir => ["./patterns"] ## 引用自定义的表达式配置文件,内容详见下面
        match => { "message" => "%{DATE1:time1} %{LEVEL:level1} %{THREAD:thread1} %{JAVA_SOURCE:source1} - %{JAVALOGMESSAGE:doc}" }
    }
    ## 移除掉某些字段
    mutate{
        remove_field => ["ecs","host","agent","@timestamp","@version","input","tags"]
    }
}
output{
  elasticsearch {
    hosts =>  ['192.168.59.110:9200'] ##ES地址,集群使用逗号隔开
    index => "elk-log" ##ES索引名称
  }
}

文章中filter.grok 将grok表达式配置在外部,用文件保存,patterns内容:

DATE1    [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}
LEVEL   (INFO)|(DEBUG)|(ERROR)|(WARN)|(FATAL)
JAVA_SOURCE [a-zA-Z.<>():0-9]*
THREAD [\s\S]*

验证日志输出 是否匹配grok表达式

  1. 编写java程序,配置logback.xml日志输出格式
    注:如果不想用程序,可以使用echo XXX >> 日志.log,日志格式下一步有
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
	<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
	<pattern>%date %level [%thread] %logger{60} - %msg%n</pattern>
</encoder>
  1. 在Kibana开发工具中调试grok

日志样例输出格式:

2020-07-18 13:24:34,471 ERROR [http-nio-8080-exec-1] com.zhenglei.controller.TestControler - 55.3.244.1 GET /index.html 15824 9

Grok 模式:

%{DATE1:time1} %{LEVEL:level1} %{THREAD:thread1} %{JAVA_SOURCE:source1} - %{JAVALOGMESSAGE:doc}

自定义模式:

DATE1    [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}.[0-9]{3}
LEVEL   (INFO)|(DEBUG)|(ERROR)|(WARN)|(FATAL)
JAVA_SOURCE [a-zA-Z.<>():0-9]*
THREAD [\s\S]*

最后点击“模拟”,输出结构化数据 如下图:

收集docker日志方式 elk收集docker日志_es_02


Logstash启动:

在logstash根目录下执行

nohup /bin/logstash -f /config/logstash.yml &

三、Filebeat安装配置和启动

Filebeat安装:

Filebeat配置:
在filebeat根目录创建filebeat-demo.yml文件:

filebeat.inputs:
  - type: log
    paths:
    - /usr/local/elk/logs/*.log ##监听的日志目录
    multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2}' ##用于匹配多行的正则表达式
    multiline.negate: true ## 是否匹配pattern的行合并到上一行
    multiline.match: after ## 匹配pattern后,与前面(before)还是后面(after)的内容合并为一条日志

output.logstash:
    hosts: ["127.0.0.1:5044"] ##输出到logstash地址,端口号和logstash配置中保持一致

Filebeat启动:
在filebeat根目录下执行

nohup ./filebeat -e -c filebeat-demo.yml &

四、查看ES日志

  1. 启动Logstash
  2. 启动Filebeat
  3. 启动日志输出程序(文章最后会给程序地址)
  4. 查看Kibana中的日志,如下图: