docker 构建elk

1. 拉取elk

docker pull sebp/elk:740

2. 以window平台为例,在磁盘上新建ELK文件夹,然后在该目录下依次新建以下目录,其中elasticsearch 文件下还有data文件夹,如图:

3.  编写docker-compose.yml

version: '2'
services:
  elasticsearch:
    image: elasticsearch
    environment:
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - ./elasticsearch/data:/usr/share/elasticsearch/data
    hostname: elasticsearch
    restart: always
    ports:
      - "9200:9200"
      - "9300:9300"
  kibana:
    image: kibana
    environment:
      - ELASTICSEARCH_URL=http://elasticsearch:9200 #elasticsearch查询接口地址
    hostname: kibana
    depends_on:
      - elasticsearch  #后于elasticsearch启动
    restart: always
    ports:
      - "5601:5601"
  logstash:
    image: logstash
    command: logstash -f /etc/logstash/conf.d/logstash.conf  #logstash 启动时使用的配置文件
    volumes:
      - ./logstash/conf.d:/etc/logstash/conf.d  #logstash 配文件位置
      - ./logst:/tmp
    hostname: logstash
    restart: always
    depends_on:
      - elasticsearch  #后于elasticsearch启动
    ports:
      - "7001-7005:7001-7005"
      - "4560:4560"
      - "9600:9600"

编写 logstash.conf 文件:

input {
    tcp {
        mode => "server"
        host => "0.0.0.0"
        port => 4560
        codec => json_lines
    }
}
output{
  elasticsearch {
    hosts => ["elasticsearch:9200"]    
    manage_template=>false
  }
  stdout {
    codec => rubydebug
  }
}

4. 运行,进入ELK目录下

docker-compose up -d

5. 浏览器输入:http://126.0.0.1:5601/

6. springboot 引入 logstash

    <dependency>
            <groupId>net.logstash.logback</groupId>
            <artifactId>logstash-logback-encoder</artifactId>
            <version>RELEASE</version>
        </dependency>

7.logback.xml 文件配置 logstash

<!-- 为logstash输出的JSON格式的Appender -->
    <appender name="logstash"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:4560</destination>
        <!-- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />-->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "autho-api",
                        "trace": "%X{X-B3-TraceId:-}",
                        "span": "%X{X-B3-SpanId:-}",
                        "exportable": "%X{X-Span-Export:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
 <root level="error">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="FILE-ERROR"/>
        <appender-ref ref="FILE-INFO"/>
        <appender-ref ref="logstash"/>
    </root>

 logback.xml文件的完整配置:

<configuration>
    <property resource="logback.properties"/>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <!--<property name="LOG_HOME" value="/home" />-->
    <!-- 控制台输出 -->
    <!-- 彩色日志 -->
    <!-- 彩色日志依赖的渲染类 -->
    <conversionRule conversionWord="clr"
                    converterClass="org.springframework.boot.logging.logback.ColorConverter"/>
    <conversionRule conversionWord="wex"
                    converterClass="org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverter"/>
    <conversionRule conversionWord="wEx"
                    converterClass="org.springframework.boot.logging.logback.ExtendedWhitespaceThrowableProxyConverter"/>
    <!-- 彩色日志格式 -->
    <property name="SPRING_CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="SPRING_FILE_LOG_PATTERN"
              value="${FILE_LOG_PATTERN:-%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } --- [%25.25t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="CONSOLE_LOG_PATTERN"
              value="${CONSOLE_LOG_PATTERN:-%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(--){faint} %clr([%15.50t]){faint} %clr([%X{OperateId}]){blue} %clr(%-40.200logger{200}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
    <property name="CUSTOM_CONSOLE_LOG_PATTERN"
              value="${CUSTOM_CONSOLE_LOG_PATTERN:-%clr(%d{${CUSTOM_CONSOLE_LOG_PATTERN:-HH:mm:ss.SSS}}){faint} %clr(${CUSTOM_CONSOLE_LOG_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${CUSTOM_CONSOLE_LOG_PATTERN:-%wEx}}"/>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${CUSTOM_CONSOLE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="FILE"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${file.path}/${file.name}.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
            <fileNamePattern>${file.path}/${file.name}.log%i.zip</fileNamePattern>
            <minIndex>1</minIndex>
            <maxIndex>3</maxIndex>
        </rollingPolicy>
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <maxFileSize>10MB</maxFileSize>
        </triggeringPolicy>
        <encoder>
            <!--<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>-->
            <pattern>${SPRING_FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <appender name="FILE-ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${file.path}/${file.name}-error.log</file>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>ERROR</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${file.path}/${file.name}-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${file.expires}</maxHistory>
            <maxFileSize>${file.maxSize}</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <!--<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>-->
            <pattern>${SPRING_FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <appender name="FILE-INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${file.path}/${file.name}-info.log</file>
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <fileNamePattern>${file.path}/${file.name}-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <maxHistory>${file.expires}</maxHistory>
            <maxFileSize>${file.maxSize}</maxFileSize>
            <totalSizeCap>20GB</totalSizeCap>
        </rollingPolicy>
        <encoder>
            <!--<pattern>%-4relative [%thread] %-5level %logger{35} -%msg%n</pattern>-->
            <pattern>${SPRING_FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>

    <!-- 为logstash输出的JSON格式的Appender -->
    <appender name="logstash"
              class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:4560</destination>
        <!-- <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />-->
        <encoder charset="UTF-8"
                 class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        {
                        "severity": "%level",
                        "service": "autho-api",
                        "trace": "%X{X-B3-TraceId:-}",
                        "span": "%X{X-B3-SpanId:-}",
                        "exportable": "%X{X-Span-Export:-}",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>

    <!-- <appender name="SOCKET" class="com.xgs.socket.XgsSocketAppender">
        <formatter class="com.xgs.socket.formatter.JsonFormatter">
            <expectJson>false</expectJson>
        </formatter>
        <RemoteHost>${socket.host}</RemoteHost>
        <Port>${socket.port}</Port>
        <ReconnectionDelay>${socket.delay}</ReconnectionDelay>
        <IncludeCallerData>${socket.caller}</IncludeCallerData>
        <queueSize>${socket.queue}</queueSize>
    </appender>

    <appender name="DB" class="ch.qos.logback.classic.db.DBAppender">
        <connectionSource class="ch.qos.logback.core.db.DataSourceConnectionSource">
            <dataSource class="${jdbc.dataSource}">
                <driverClass>${jdbc.clazz}</driverClass>
                <jdbcUrl>${jdbc.url}</jdbcUrl>
                <user>${jdbc.user}</user>
                <password>${jdbc.password}</password>
            </dataSource>
        </connectionSource>
    </appender> -->

    <root level="error">
        <appender-ref ref="STDOUT"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="FILE-ERROR"/>
        <appender-ref ref="FILE-INFO"/>
        <appender-ref ref="logstash"/>
    </root>
    <logger name="ch.qos.logback.core.rolling" level="ERROR"/>
    <logger name="ch.qos.logback.core.joran" level="ERROR"/>
    <logger name="ch.qos.logback.classic.joran.action" level="ERROR"/>
    <logger name="io.netty.util" level="ERROR"/>
    <logger name="io.netty.buffer" level="ERROR"/>
    <logger name="org.apache.commons.beanutils.converters" level="ERROR"/>
    <logger name="org.springframework" level="info"/>
    <logger name="org.apache.camel" level="INFO"/>
    <logger name="io.lettuce" level="ERROR"/>

</configuration>

8. 打印日志:

  @ApiOperation(value = "测试")
    @GetMapping(value = "/findUser")
    public ResultMsg findUserInfo() {
        log.error("hi,cn_yaojin.");
        return new ResultMsg();
    }

9.查看结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值