[ django部署ELK ]


目录:

ELK日志部署

一.第一种[单机部署]:elastic + kibana + logstash

1.docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.13.4
    container_name: es
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms256m -Xmx1024m" #设置使用jvm内存大小
      - "ELASTIC_PASSWORD=chenhaifeng"    #密码
      - "xpack.security.enabled=true"
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.13.4
    container_name: kibana
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
      - "ELASTICSEARCH_USERNAME=elastic"    
      - "ELASTICSEARCH_PASSWORD=chenhaifeng"    #elastic密码
      - "I18N_LOCALE=zh-CN"                 #中文
    ports:    
      - 5601:5601
  logstash:
    image: logstash:7.13.4
    container_name: logstash
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./logstash.yml:/usr/share/logstash/config/logstash.yml
    depends_on:
      - elasticsearch #logstash在elasticsearch启动之后再启动
    ports:
      - 4560:4560 # 这里是使用到通过请求来推送日志才开放的端口, 当只使用日志文件来获取数据就可以不用开启

2.logstash.conf通过django发起请求到input获取日志

input {
  # tcp请求输入日志
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
    codec => json_lines
  }
  # 文件输入日志
  file {
    path => "/path/to/your/logs/*.log"  # 这里指定你的日志文件路径,可以是通配符
    start_position => "beginning"  # 如果需要从文件的开始读取
    sincedb_path => "/dev/null"  # 防止 Logstash 记录处理进度(适用于开发环境)
  }
}

output {
  elasticsearch {
    hosts => ["es:9200"]
    user => "elastic"
    password => "chenhaifeng"
    index => "django-%{+YYYY.MM.dd}"
  }
}

3.logstash.yml

xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: chenhaifeng
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://es:9200" ]

Django案例代码推送日志请求tcp到logstash

二.第二种: elastic+logstash+kibana+kafka+filebeat

1.docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.13.4
    container_name: es
    environment:
      - "cluster.name=elasticsearch" #设置集群名称为elasticsearch
      - "discovery.type=single-node" #以单一节点模式启动
      - "ES_JAVA_OPTS=-Xms1g -Xmx2g" #设置使用jvm内存大小
      - "ELASTIC_PASSWORD=chenhaifeng"    #密码
      - "xpack.security.enabled=true"
    depends_on:
      - kafka #kibana在elasticsearch启动之后再启动
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.13.4
    container_name: kibana
    depends_on:
      - elasticsearch #kibana在elasticsearch启动之后再启动
    environment:
      - "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
      - "ELASTICSEARCH_USERNAME=elastic"    
      - "ELASTICSEARCH_PASSWORD=chenhaifeng"    #elastic密码
      - "I18N_LOCALE=zh-CN"                 #中文
    ports:    
      - 5601:5601
  logstash:
    image: logstash:7.13.4
    container_name: logstash
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./logstash.yml:/usr/share/logstash/config/logstash.yml
      #- ./logs:/logs
    depends_on:
      - elasticsearch #logstash在elasticsearch启动之后再启动
    ports:
      - 4560:4560
  filebeat:
    image: elastic/filebeat:7.13.4
    container_name: filebeat
    environment:
      # 时区上海 - Time zone Shanghai (Change if needed)
      TZ: Asia/Shanghai
    user: root
    restart: always
    entrypoint: "filebeat -e -strict.perms=false"  #解决配置文件权限问题 - Solving the configuration file permissions
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      # 此处需指定docker的containers目录,取决于你docker的配置 - The containers directory of docker needs to be specified here, depending on your docker configuration
      # 如snap安装的docker,则为/var/snap/docker/common/var-lib-docker/containers - Example if docker is installed by Snap /var/snap/docker/common/var-lib-docker/containers
      # - /var/snap/docker/common/var-lib-docker/containers:/var/lib/docker/containers
      - ./logs:/logs
    depends_on:
      - kafka
  kafka:
    image: apache/kafka:latest
    container_name: kafka
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_NUM_PARTITIONS: 3
    ports:
      - 9092:9092

2.filebeat.yml

filebeat.inputs:
  - type: log
    enabled: true
    paths:
      - /logs/*.log

filebeat.config:
  modules:
    path: ${path.config}/modules.d/*.yml
    reload.enabled: false

processors:
  - add_cloud_metadata: ~
  - add_docker_metadata: ~

output.kafka:
  enabled: true
  hosts: ["kafka:9092"]
  #要提前创建topic
  topic: "log_topic"
  partition.hash:
    reachable_only: true
  compression: gzip
  max_message_bytes: 1000000
  required_acks: 1

3.logstash.conf

input {
  kafka {
    bootstrap_servers => "kafka:9092"
    topics => ["log_topic"]
  }
}

output {
  elasticsearch {
    hosts => ["es:9200"]
    user => "elastic"
    password => "chenhaifeng"
    index => "django-%{+YYYY.MM.dd}"
  }
}

4.logstash.yml

xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: chenhaifeng
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://es:9200" ]

三.主服务器部署[kibana,logstash,es, kafka]

主服务器收集日志部署: - kibana:7.13.4 - logstash:7.13.4 - elasticsearch:7.13.4 - apache/kafka:latest

1.docker-compose.yml

version: '3'
services:
  elasticsearch:
    image: elasticsearch:7.13.4
    container_name: es
    environment:
      - "cluster.name=elasticsearch" 
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms1g -Xmx2g"
      - "ELASTIC_PASSWORD=chenhaifeng"
      - "xpack.security.enabled=true"
    depends_on:
      - kafka 
    ports:
      - 9200:9200
  kibana:
    image: kibana:7.13.4
    container_name: kibana
    depends_on:
      - elasticsearch 
    environment:
      - "elasticsearch.hosts=http://192.168.1.2:9200"
      - "ELASTICSEARCH_USERNAME=elastic"    
      - "ELASTICSEARCH_PASSWORD=chenhaifeng"
      - "I18N_LOCALE=zh-CN"                
    ports:    
      - 5601:5601
  logstash:
    image: logstash:7.13.4
    container_name: logstash
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
      - ./logstash.yml:/usr/share/logstash/config/logstash.yml
    depends_on:
      - elasticsearch 
    ports:    
      - 5044:5044
  kafka:
    image: apache/kafka:latest
    container_name: kafka
    environment:
      KAFKA_NODE_ID: 1
      KAFKA_PROCESS_ROLES: broker,controller
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.1.2:9092
      KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT
      KAFKA_CONTROLLER_QUORUM_VOTERS: 1@localhost:9093
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
      KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
      KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
      KAFKA_NUM_PARTITIONS: 3
    ports:
      - 9092:9092

2.logstash.conf

input {
  kafka {
    bootstrap_servers => "kafka:9092"
    topics => ["chf_cews_topic", "test"]
    decorate_events => true
    type => "chf_cews"
  }
}

filter {
  json {
    source => "message"
    target => "parsed_message"  
    remove_field => ["message"]
  }
}

output {

  if[type] == "chf_cews" {
    elasticsearch {
      hosts => ["192.168.1.2:9200"]
      user => "elastic"
      password => "chenhaifeng"
      index => "chf-cews-%{+YYYY.MM.dd}"
    }
  } else {
    elasticsearch {
      hosts => ["192.168.1.2:9200"]
      user => "elastic"
      password => "chenhaifeng"
      index => "default-%{+YYYY.MM.dd}"
    }
  }
}

3.logstash.yml

xpack.monitoring.enabled: true
xpack.monitoring.elasticsearch.username: elastic
xpack.monitoring.elasticsearch.password: chenhaifeng
http.host: "0.0.0.0"
xpack.monitoring.elasticsearch.hosts: [ "http://192.168.1.2:9200" ]

4.其他服务器需要收集日志的服务器部署[filebeat]

5.docker-compose.yml

version: '3'
services:
  filebeat:
    image: elastic/filebeat:7.13.4
    container_name: filebeat
    environment:
      TZ: Asia/Shanghai
    user: root
    entrypoint: "filebeat -e -strict.perms=false"  
    volumes:
      - ./filebeat.yml:/usr/share/filebeat/filebeat.yml
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/containers:/var/lib/docker/containers:ro

6.filebeat.yml

filebeat.inputs:
  - type: docker
    containers.ids: '*'
    paths:
      - /var/lib/docker/containers/*/*.log

processors:
  - add_docker_metadata: ~

output.kafka:
  enabled: true
  hosts: ["192.168.1.2:9092"]
  topic: "chf_cews_topic"
  partition.hash:
    reachable_only: true
  compression: gzip
  max_message_bytes: 1000000
  required_acks: 1

输入ip:5601登录查看