1.安装elk
1.1:获取最新的镜像:
docker pull sebp/elk

electron docker部署 docker elk_spring

1.2:启动镜像
docker run -d -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -p 5601:5601 -p 5044:5044 -p 9200:9200 -p 9300:9300 -it --restart=always --name elk c21727ae794b

启动后等会可以通过浏览器访问ip:5601及ip:9200查看是否已启动。–restart=always表示自启动
如出现以下错误:

max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]

解决:

## 执行
sysctl -w vm.max_map_count=262144

编辑/etc/sysctl.conf,在里面加入:vm.max_map_count=262144

1.3:修改配置
## 进入容器
docker exec -it elk /bin/bash
## 编辑配置文件
vim /etc/logstash/conf.d/02-beats-input.conf

编辑的内容如下:

input {
    tcp {
        port => 5044
        codec => json_lines
    }
}
output{
    elasticsearch {
    hosts => ["localhost:9200"]
    index => "ruizhi-log-%{+YYYY.MM.dd}"
    }
}

退出后,重启elkdocker restart elk,访问9200和5601可以看见如下界面:

electron docker部署 docker elk_分页_02


如果希望将页面设置为中文,则在docker中设置kibana.yml中的语言即可。

## 进入elk
docker exec -it elk /bin/bash
## 找到kibana.yml(可以用whereis kibana.yml查询)
cd /opt/kibana/config
在yml中加上以下配置:
i18n.locale: "zh-CN"
重启即可。

electron docker部署 docker elk_java_03


如果进入后,都能正常访问说明正常,此时进入kiban中的manage,创建索引。输入ruizhi-log-*去匹配,然后点击下一步,选择@timestamp。

electron docker部署 docker elk_spring_04


如果出现You'll need to index some data into Elasticsearch before you can create an index pattern或者输入后下一步为灰,这是因为里面没有数据导致的,在命令行输入一个假的数据即可。

curl -H "Content-Type: application/json" -XPOST 'http://192.168.80.129:9200/ruizhi-log-2020-04-25/test-log' -d '{"code":200,"message":"测试"}'

electron docker部署 docker elk_分页_05

2.springcloud中配置
2.1 jar包配置
<dependency>
    <groupId>net.logstash.logback</groupId>
     <artifactId>logstash-logback-encoder</artifactId>
     <version>6.1</version>
 </dependency>
2.2 logback.xml配置
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <contextName>ProviderLog</contextName>
    <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
    <!--本工程中没使用文件输出日志,只用了console和logstash,此处配置无用-->
    <property name="LOG_HOME" value="D:/" />
    <!--可以手动指定log名字-->
    <property name="appName" value="wdnmdService" />
    <!--也可以使用工程的名字-->
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <springProperty scope="context" name="serverPort" source="server.port"/>
    <!-- logstash远程日志配置-->
    <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>192.168.80.129:5044</destination>
        <!--        默认是JSON格式,所以logstash中应该配置codec为json_lines-->
        <!--        LoggingEventCompositeJsonEncoder是LogstashEncoder的父类,可以使用pattern自定义json的关键字
        -->
        <encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder" >
            <!--        <encoder class="net.logstash.logback.encoder.LogstashEncoder" >-->
            <providers>
                <!--可以配合LogstashEncoder使用-->
                <!--                <timestamp/>-->
                <!--                <version/>-->
                <!--                <message/>-->
                <!--                <loggerName/>-->
                <!--                <threadName/>-->
                <!--                <logLevel/>-->
                <!--                <callerData/>-->
                <timestamp>
                    <timeZone>UTC</timeZone>
                </timestamp>
                <pattern>
                    <pattern>
                        <!--或者使用"app": "${appName}",-->
                        <!--                        都是sleuth的,本处没用到-->
                        <!--                        "trace": "%X{X-B3-TraceId:-}",-->
                        <!--                        "span": "%X{X-B3-SpanId:-}",-->
                        <!--                        "parent": "%X{X-B3-ParentSpanId:-}",-->
                        <!--                        "stack_trace": "%exception{10},"-->
                        {
                        "app": "${springAppName}_${serverPort}",
                        "level": "%level",
                        "thread": "%thread",
                        "class": "%logger{40}",
                        "message": "%message"
                        }
                    </pattern>
                </pattern>

            </providers>
        </encoder>
    </appender>
    <!-- 控制台输出 -->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
    </appender>
    <!-- 按照每天生成日志文件 -->
    <appender name="FILE"  class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--日志文件输出的文件名-->
            <FileNamePattern>${LOG_HOME}/system.log.%d{yyyy-MM-dd}.log</FileNamePattern>
            <!--日志文件保留天数-->
            <MaxHistory>30</MaxHistory>
        </rollingPolicy>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
        </encoder>
        <!--日志文件最大的大小-->
        <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
            <MaxFileSize>10MB</MaxFileSize>
        </triggeringPolicy>
    </appender>

    <!-- 日志输出级别 -->
    <root level="INFO">
        <appender-ref ref="stash" />
        <appender-ref ref="STDOUT" />
        <!--        <appender-ref ref="FILE" />-->
    </root>
</configuration>
2.3 输出日志
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author: 
 * @Date: 2020-03-18 15:05
 * @Description:
 */
@RestController
@RequestMapping("/contractInfo")
@Api(tags = "客户端合同信息-用户信息api")
public class ContractInfoController {

    Logger logger = LoggerFactory.getLogger("ContractInfoController");

    /**
     * 合同信息-分页
     *
     * @param dto 分页需要的参数
     * @return
     */
    @ApiOperation(value = "合同信息分页", httpMethod = "POST")
    @RequestMapping(value = "/pageContractInfo", method = RequestMethod.POST)
    public void pageContractInfo(@RequestBody ContractInfoPageDto dto) {
        logger.info("分页合同数据");
        logger.info("分页合同请求,数据:" + dto);
    }
}

配置好启动后就可以http://192.168.80.129:5601/中看见相关日志。(第一次时,需要在Management中的Kibana下的Index patterns添加配置。Index pattern为*,方式选@timestamp)

electron docker部署 docker elk_spring_06