放一下示例项目地址 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配置文件放到项目里了。
把 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
kibana
skywalking
三、 logstash配置
服务端
上面步骤已经把logstash启动了。然后配置文件在./logstash/config/small-tools:/usr/share/logstash/config/small-tools中。
在里面添加**.conf文件,接收数据,具体的配置信息就不详细说了。
springboot端
1. 添加依赖
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>
<!-- <!–过滤 Error–>-->
<!-- <level>ERROR</level>-->
<!-- <!–匹配到就禁止–>-->
<!-- <onMatch>DENY</onMatch>-->
<!-- <!–没有匹配到就允许–>-->
<!-- <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"
4. 查看效果
配置好后,启动项目,正常的话,你可以在es中看到多了一个索引。像这样,
然后你可以配置日志查看了。我就不列步骤了,给大家看个效果吧.
然后还可以按照自己需要调一下格式。
四、 skywalking配置
依赖上面已经列过了,这里给大家看一下agent的用法。agent我给放到data目录下了。
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
命令启动
如果你是用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 &
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
查看效果
然后traceId也出来了。
完结。