ELK 日志搭建配置(docker方式)

演示目标图:
logstash-06.png

配置

elasticsearch

version: '3.8'

networks:
  common-network:
    external: true

services:
  elasticsearch:
    image: elasticsearch:7.12.1
    container_name: ${CONTAINER_NAME}
    deploy:
      resources:
        limits:
          cpus: ${CPUS:-1}
          memory: ${MEMORY_LIMIT:-512M}
    networks:
      - common-network
    ports:
      - "${PANEL_APP_PORT_HTTP}:9200"
    restart: always
    volumes:
      - ${DOCKER_VOLUMES_HOME}/${IMAGE_NAME}/${PANEL_APP_PORT_HTTP}/plugins:/usr/share/elasticsearch/plugins
      - ${DOCKER_VOLUMES_HOME}/${IMAGE_NAME}/${PANEL_APP_PORT_HTTP}/data:/usr/share/elasticsearch/data
      - ${DOCKER_VOLUMES_HOME}/${IMAGE_NAME}/${PANEL_APP_PORT_HTTP}/logs:/usr/share/elasticsearch/logs
      - ${DOCKER_VOLUMES_HOME}/${IMAGE_NAME}/${PANEL_APP_PORT_HTTP}/config:/usr/share/elasticsearch/config

      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro
    environment:
      - TZ=Asia/Shanghai
      - discovery.type=single-node 
      #- xpack.security.enabled=${XPACK_SECURITY_ENABLED}   # ✅ 开启安全认证
      #- ELASTIC_PASSWORD=${ELASTIC_PASSWORD}  # ✅ 设置 elastic 用户密码
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"

kibana

version: '3.8'

networks:
  common-network:
    external: true

services:
  kibana:
    image: kibana:7.12.1
    container_name: ${CONTAINER_NAME}
    deploy:
      resources:
        limits:
          cpus: ${CPUS:-1}
          memory: ${MEMORY_LIMIT:-512M}
    networks:
      - common-network

    environment:
      - ELASTICSEARCH_HOSTS=${ELASTICSEARCH_HOSTS}
      - ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME}
      - ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD}
    ports:
      - "${PANEL_APP_PORT_HTTP}:5601"

logstash

version: '3.8'

networks:
  common-network:
    external: true

services:
  logstash:
    image: logstash:7.12.1
    container_name: ${CONTAINER_NAME}
    deploy:
      resources:
        limits:
          cpus: ${CPUS:-1}
          memory: ${MEMORY_LIMIT:-512M}
    networks:
      - common-network

    volumes:
      - ${DOCKER_VOLUMES_HOME}/${IMAGE_NAME}/${PANEL_APP_PORT_HTTP}/config:/usr/share/logstash/config
      - ${DOCKER_VOLUMES_HOME}/${IMAGE_NAME}/${PANEL_APP_PORT_HTTP}/pipeline:/usr/share/logstash/pipeline
      
    environment:
      - "LS_JAVA_OPTS=${LS_JAVA_OPTS}"

    ports:
      - "${PANEL_APP_PORT_HTTP}:9600"
      - "${PANEL_APP_PORT_HTTP_BEATS}:5044"

logstash 配置
config文件夹下配置
logstash-sample.cofig

input {
  beats {
    port => 5044
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
    #user => "elastic"
    #password => "changeme"
  }
}

pipeline文件夹下配置
logstash.conf

#input {
#  beats {
#    port => 5044
#  }
#}

#output {
#  stdout {
#    codec => rubydebug
#  }
#}

# Sample Logstash configuration for creating a simple
# Beats -> Logstash -> Elasticsearch pipeline.

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 5044
    codec => json_lines
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    #index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
  index => "logstash"
    #user => "elastic"
    #password => "changeme"
  }
}

JAVA服务配置
yml 配置

logstash:
  addr: 127.0.0.1:5044
  file: var/log/${spring.application.name}/${spring.profiles.active}/${spring.application.name}.log
  fileNamePattern: var/log/${spring.application.name}/${spring.profiles.active}/${spring.application.name}-logstash.%d{yyyy-MM-dd}.log
  maxHistory: 30
  totalSizeCap: 10MB

logback-spring.xml 配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/base.xml"/>

    <springProperty scope="context" name="appName" source="spring.application.name"/>
    <springProperty scope="context" name="logPath" source="logging.file.name"/>
    <springProperty scope="context" name="dev" source="spring.profiles.active"/>
    <springProperty scope="context" name="logstashAddr" source="logstash.addr"/>
    <springProperty scope="context" name="logstashFile" source="logstash.file"/>
    <springProperty scope="context" name="logstashMaxHistory" source="logstash.maxHistory"/>
    <springProperty scope="context" name="logstashTotalSizeCap" source="logstash.totalSizeCap"/>


    <!-- 日志在工程中的输出位置 -->
    <property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${appName}"/>

    <!-- 控制台的日志输出样式 -->
    <property name="CONSOLE_LOG_PATTERN"
              value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>

    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <!-- 日志输出编码 -->
        <encoder>
            <!--输出格式化-->
            <pattern>[%X{TRACE_ID:-DEFAULT}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
            <charset>utf8</charset>
        </encoder>
    </appender>

    <!-- 根据日志文件地址是否为有效地址,决定是否启用 RollingFileAppender -->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${logstashFile:-/var/log/${appName}/${dev}/${appName}-logstash.log}</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 设置日志文件名 -->
            <fileNamePattern>${logstashFileNamePattern:-/var/log/${appName}/${dev}/${appName}-logstash.%d{yyyy-MM-dd}.log}</fileNamePattern>
            <!-- 最多保留 30 天的日志 -->
            <maxHistory>${logstashMaxHistory:-30}</maxHistory>
            <!--设置日志文件大小,超过就重新生成文件,默认10M-->
            <totalSizeCap>${logstashTotalSizeCap:-10MB}</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <pattern>[%X{TRACE_ID:-DEFAULT}]  %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>


    <!--logstash配置-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${logstashAddr:-127.0.0.1:4560}</destination>
        <!-- 日志输出编码 -->
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>Asia/Shanghai</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "dev": "${dev:-}",
                        "logLevel": "%level",
                        "serviceName": "${appName:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "rest": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
        <!--<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>-->
        <!--当有多个LogStash服务时,设置访问策略为轮询-->
        <connectionStrategy>
            <roundRobin>
                <connectionTTL>5 minutes</connectionTTL>
            </roundRobin>
        </connectionStrategy>
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH"/>
        <appender-ref ref="CONSOLE"/>
    </root>

    <!--禁掉一些包-->
    <logger name="com.alibaba.nacos" level="OFF"></logger>
    <springProfile name="test">
        <root level="INFO">
            <appender-ref ref="CONSOLE"/>
            <appender-ref ref="FILE"/>
        </root>
    </springProfile>

</configuration>

kibana 页面配置

目标:
logstash-06.png
1.创建索引
logstash-01.png
logstash-02.png

logstash-02.png
logstash-03.png
logstash-04.png
logstash-05.png
到这步就创建完成了 后续就是启动java服务测试 出现日志信息就是配置完成
logstash-06.png