springboot-接入skywalking和elk日志收集

2,203 阅读2分钟

放一下示例项目地址 gitee.com/yanghx-gite…

一、 安装docker, docker-compose

centos 7


#卸载旧版docker

yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine

#安装yum-utils软件包

yum install -y yum-utils 


# 设置repo源

yum-config-manager \
    --add-repo \
    http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
 
yum makecache fast


# 安装

yum install docker-ce docker-ce-cli docker-compose containerd.io -y

# 开机自弃
systemctl start docker
systemctl enable docker
 
docker --version


# 配置国内源
sudo mkdir -p /etc/docker
 
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://nv5ujva8.mirror.aliyuncs.com"]
}
EOF
 
sudo systemctl daemon-reload
sudo systemctl restart docker

或者这样安装docker-compose

curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose 
chmod +x /usr/local/bin/docker-compose
docker-compose --version

二、部署服务

需要部署 skywalking,logstash,elasticssearch

我把部署的docker-compose配置文件放到项目里了。

image.png

把 syd-docker-compose 传到服务器上。 进入这个目录

cd  syd-docker-compose

# 静默启动
docker-compose -f elk-docker-compose.yml up -d

docker-compose  -f skywalking-docker-compose.yml up -d

如果遇到启动失败, 然后进行容器中提示 Permission denied

那就执行这两个命令。(我shll学的不好,应该有更好的做法。这种就粗暴了很多),就是把文件夹授权

chmod 777 logstash/*
chmod 777 elasticsearch/*

运行效果

在部署skywalking 遇到一个问题,最后发现 skywalking的latest版本镜像不对。所以我给换成了8.9.1,才部署成功。具体原因我单独记录了一下。

es

image.png kibana

image.png

skywalking

image.png

三、 logstash配置

服务端

上面步骤已经把logstash启动了。然后配置文件在./logstash/config/small-tools:/usr/share/logstash/config/small-tools中。

image.png

在里面添加**.conf文件,接收数据,具体的配置信息就不详细说了。

springboot端

1. 添加依赖

image.png

skywalking和logstash的依赖。我用的gradle。你也可以用maven.

/*日志*/
implementation 'org.apache.skywalking:apm-toolkit-logback-1.x:8.5.0'
implementation 'org.apache.skywalking:apm-toolkit-trace:8.5.0'
/*日志*/
implementation 'net.logstash.logback:logstash-logback-encoder:6.1'
implementation 'ch.qos.logback:logback-parent:1.2.7'

2. 添加logback-spring.xml 文件

我将配置信息贴在这里,也可以去我代码中看。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <!--从配置文件读取配置路径,并且添加默认值-->

    <!--从SpringBoot配置文件读取项目名,环境,以及logstash地址-->
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <springProperty scope="context" name="springProfile" source="spring.profiles.active"/>
    <!--这个地址必须写在bootstrap.yml中。否则读取不到-->
    <springProperty scope="context" name="logstashAddress" source="logstash.address"/>

    <!--日志全局设置-->
    <springProperty scope="context" name="log.charset" source="log.charset" defaultValue="UTF-8"/>
    <springProperty scope="context" name="log.pattern" source="log.pattern"
                    defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%tid] [%thread] [%logger:%line]  %msg %n"/>

    <!--INFO日志设置-->
    <springProperty scope="context" name="info.path" source="log.info.path" defaultValue="syd-logs/"/>
    <springProperty scope="context" name="info.history" source="log.info.history" defaultValue="10"/>
    <springProperty scope="context" name="info.maxsize" source="log.info.maxsize" defaultValue="1GB"/>
    <springProperty scope="context" name="info.filesize" source="log.info.filesize" defaultValue="10MB"/>
    <springProperty scope="context" name="info.pattern" source="log.info.pattern"
                    defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%tid] [%thread] [%logger:%line]  %msg %n"/>

    <!--ERROR日志设置-->
    <springProperty scope="context" name="error.path" source="log.error.path" defaultValue="syd-logs/"/>
    <springProperty scope="context" name="error.history" source="log.error.history" defaultValue="10"/>
    <springProperty scope="context" name="error.maxsize" source="log.error.maxsize" defaultValue="1GB"/>
    <springProperty scope="context" name="error.filesize" source="log.error.filesize" defaultValue="10MB"/>
    <springProperty scope="context" name="error.pattern" source="log.error.pattern"
                    defaultValue="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%tid] [%thread] [%logger:%line]  %msg %n"/>

    <!--控制台日志打印格式-->
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
        </filter>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <!--加上skywalking的追踪id-->
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${log.pattern}</pattern>
            </layout>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>

    <!--INFO日志打印-->
    <appender name="FILE_INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Info 级别的日志,只是过滤 info 还是会输出 Error 日志,因为 Error 的级别高, 所以我们使用下面的策略,可以避免输出 Error 的日志-->
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>INFO</level>
<!--            &lt;!&ndash;过滤 Error&ndash;&gt;-->
<!--            <level>ERROR</level>-->
<!--            &lt;!&ndash;匹配到就禁止&ndash;&gt;-->
<!--            <onMatch>DENY</onMatch>-->
<!--            &lt;!&ndash;没有匹配到就允许&ndash;&gt;-->
<!--            <onMismatch>ACCEPT</onMismatch>-->
        </filter>
        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File> 的日志都是当天的。-->
        <!--<File>logs/info.spring-boot-demo-logback.log</File>-->
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${info.path}/${springAppName}-${springProfile}-info-%d{yyyy-MM-dd}.-%i.log
            </FileNamePattern>
            <!--只保留最近10天的日志-->
            <maxHistory>${info.history}</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>${info.maxsize}</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
                <maxFileSize>${info.filesize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <!--<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">-->
        <!--<maxFileSize>1KB</maxFileSize>-->
        <!--</triggeringPolicy>-->
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <!--加上skywalking的追踪id-->
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${log.pattern}</pattern>
            </layout>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>
    <!--ERROR日志打印-->
    <appender name="FILE_ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <!--如果只是想要 Error 级别的日志,那么需要过滤一下,默认是 info 级别的,ThresholdFilter-->
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>ERROR</level>
        </filter>
        <!--日志名称,如果没有File 属性,那么只会使用FileNamePattern的文件路径规则如果同时有<File>和<FileNamePattern>,那么当天日志是<File>,明天会自动把今天的日志改名为今天的日期。即,<File> 的日志都是当天的。-->
        <!--<File>logs/error.spring-boot-demo-logback.log</File>-->
        <!--滚动策略,按照时间滚动 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!--文件路径,定义了日志的切分方式——把每一天的日志归档到一个文件中,以防止日志填满整个磁盘空间-->
            <FileNamePattern>${error.path}/${springAppName}-${springProfile}-error-%d{yyyy-MM-dd}.-%i.log
            </FileNamePattern>
            <!--只保留最近90天的日志-->
            <maxHistory>${error.history}</maxHistory>
            <!--用来指定日志文件的上限大小,那么到了这个值,就会删除旧的日志-->
            <totalSizeCap>${error.maxsize}</totalSizeCap>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <!-- maxFileSize:这是活动文件的大小,默认值是10MB,本篇设置为1KB,只是为了演示 -->
                <maxFileSize>${error.filesize}</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <!--加上skywalking的追踪id-->
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <pattern>${log.pattern}</pattern>
            </layout>
            <charset>${log.charset}</charset>
        </encoder>
    </appender>


    <!-- 上报给logstash -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>${logstashAddress}</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
            <provider class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.logstash.TraceIdJsonProvider"/>
            <customFields>
                {
                <!--设置项目-->
                "app": "${springAppName:-}",
                <!--设置环境-->
                "profile": "${springProfile:-}"
                }
            </customFields>
        </encoder>
    </appender>

    <logger name="spring" level="DEBUG"/>
    <logger name="cn.yanghx" level="DEBUG"/>
    <logger name="root" level="INFO"/>
    <root level="info">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE_INFO"/>
        <appender-ref ref="FILE_ERROR"/>
        <appender-ref ref="logstash"/>
    </root>

</configuration>

3. 添加配置文件

application.yml



# 配置日志,并指定logstash地址。
logging:
  config: classpath:logback-spring.xml
logstash:
  address: "192.168.61.73:1218"

image.png

4. 查看效果

配置好后,启动项目,正常的话,你可以在es中看到多了一个索引。像这样,

image.png

然后你可以配置日志查看了。我就不列步骤了,给大家看个效果吧.

image.png

然后还可以按照自己需要调一下格式。

image.png

四、 skywalking配置

依赖上面已经列过了,这里给大家看一下agent的用法。agent我给放到data目录下了。

image.png

idea 启动

然后idea启动时要增加配置,

-javaagent:data/apache-skywalking-java-agent-8.9.0/skywalking-agent/skywalking-agent.jar
-Dskywalking.agent.service_name=syd-springboot-skywalking-es-log-service
-Dskywalking.agent.instance_name=syd-springboot-skywalking-es-log-instance
-Dskywalking.collector.backend_service=192.168.61.73:11800

image.png

image.png

image.png

命令启动

如果你是用java-jar的形式启动服务,这串配置要这样加。

nohup java -javaagent:data/apache-skywalking-java-agent-8.9.0/skywalking-agent/skywalking-agent.jar -Dskywalking.agent.service_name=syd-springboot-skywalking-es-log-service -Dskywalking.agent.instance_name=syd-springboot-skywalking-es-log-instance -Dskywalking.collector.backend_service=192.168.61.73:11800 -jar  xxxx.jar &

image.png

docker启动

我给放一个dockerfile吧。

# Version 0.1
# 基础镜像
FROM apache/skywalking-java-agent:8.8.0-java8
# 维护者信息
MAINTAINER yanghx

ENV LANG C.UTF-8
#设置alpine时区
ENV TIMEZONE Asia/Shanghai
#alpine自带的包含dl-cdn的域名非常慢,需要修改后才能下载数据。
#RUN apk add -U tzdata && ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo "${TIMEZONE}" > /etc/timezone
#RUN sed -i -e 's/dl-cdn/dl-4/g' /etc/apk/repositories && apk add -U tzdata && ln -snf /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && echo "${TIMEZONE}" > /etc/timezone


RUN echo -e http://mirrors.ustc.edu.cn/alpine/v3.7/main/ > /etc/apk/repositories


# jar包文件的名称
ENV NAME syd-springboot-skywalking-es-log

ENV JAR_NAME ${NAME}.jar
ENV LOG_DIR /ci-logs
# skywalking配置
ENV SKYWALKING_AGENT_SERVICE_NAME=""
ENV SKYWALKING_COLLECTOR_BACKEND_SERVICE=""
ENV SKYWALKING_GRPC_HOST=""
ENV SKYWALKING_GRPC_PORT=""
# spring 启动模式
ENV SPRING_ACTIVE_MODE=""


COPY xxxxx/syd-springboot-skywalking-es-log.jar ${JAR_NAME}
RUN mkdir ${LOG_DIR}

RUN  echo "#!/bin/sh" > docker-entrypoint.sh
RUN  echo  "nohup java  -javaagent:agent/skywalking-agent.jar=agent.service_name=${SKYWALKING_AGENT_SERVICE_NAME},collector.backend_service=${SKYWALKING_COLLECTOR_BACKEND_SERVICE},plugin.toolkit.log.grpc.reporter.server_host=${SKYWALKING_GRPC_HOST},plugin.toolkit.log.grpc.reporter.server_port=${SKYWALKING_GRPC_PORT} \
     -jar ${JAR_NAME}  --spring.profiles.active=${SPRING_ACTIVE_MODE:test} --server.port=80   >> ${LOG_DIR}/${NAME}-${SPRING_ACTIVE_MODE}-nohup.out 2>&1 & \
      tail -f ${LOG_DIR}/${NAME}-${SPRING_ACTIVE_MODE}-nohup.out "  >> docker-entrypoint.sh

ENTRYPOINT ["sh", "docker-entrypoint.sh"]

EXPOSE 80

这几项是skywalking的配置。可以用 -e 指定。也可以用docker-compose启动。我给放一个docker-compose的配置吧。

ENV SKYWALKING_AGENT_SERVICE_NAME=""
ENV SKYWALKING_COLLECTOR_BACKEND_SERVICE=""
ENV SKYWALKING_GRPC_HOST=""
ENV SKYWALKING_GRPC_PORT=""

xxxx-docker-compose.yaml

version: "3.3"
services:
  test: # 服务名称
    image: test:latest # 创建容器时所需的镜像
    container_name: test # 容器名称,默认为"工程名称_服务条目名称_序号"
    ports: # 宿主机与容器的端口映射关系
      - "xxx:80" # 左边宿主机端口:右边容器端口

    environment:
      - SPRING_ACTIVE_MODE=test
      - SKYWALKING_AGENT_SERVICE_NAME='test-test-test-test'
      - SKYWALKING_COLLECTOR_BACKEND_SERVICE='xxxx:11800'
      # 这里是日志上报的配置
      - SKYWALKING_GRPC_HOST='xxxx'
      - SKYWALKING_GRPC_PORT=11800

查看效果

image.png

然后traceId也出来了。

image.png

完结。