alibaba微服务篇之日志框架skywalking

 原创   
营养快线送你 2024-06-29 后端结构
0 0 0 192

问题:

微服务,一个请求会经过多个服务,每个服务都会输出各自的日志,那么这个请求的日志就被分成了多段。如果一个请求发生了错误,那么怎么得到一个完整的日志,进行日志分析。吃点苦,每个服务去找也是可以的。

解决方案:

分布式日志在框架还算是个大问题,日志处理的好,会给系统的排查工作带来很大的遍历。网上有几个分布式日志框架,我选择了skywalking,反正选用的人多的,社区活跃的就没大问题。坑让人家帮你踩好。

skywalking的工作原理:

如果没有框架,其实手撸一个框架也是没啥大问题的,只不过这个日志框架只能搭配在我的微服务架构上,或者按照我的思路进行代码日志埋点。分布式日志嘛,首先各个微服务还是各自打印自己的日志,但是对于同一个请求要用一个唯一链路ID贯穿整个日志系统。然后把各个微服务的日志推送式或者被拉取式放到一个统一的服务里,然后进行数据整理分析存储,最后页面显示出来。

其实skywalking也是一样的思路,只不过人家实现的方式高级,没有代码侵入,而且支持多种语言。skywalking官网:https://skywalking.apache.org/downloads/

skywalking分成两部分组成,一个skywalking-agent:安装到你的各个微服务里面,进行日志采集,内置rpc将采集的日志发生到一个统一的服务里面去。

一个skywalking-APM:将收集到的日志进行整理分析处理,然后显示到页面。

skywalking+log4j2集成到alibabacloud

首先部署skywalking-APM,去官网下载APM,我的JDK是8,所以下载的是8.5.0的版本,高版本要JDK高,然后解压,会有config配置目录,这里面更改application.yml文件,storage:selector: ${SW_STORAGE:mysql}更改为mysql存储(你也可以用其他方式存储),收集的日志你得找个地方存起来啊。然后修改mysql:properties:为你的数据库连接信息。然后APM默认是不支持mysql的,所以你得自己放个mysql连接jar包(mysql-connector-j-8.0.31.jar)到oap-libs目录下。默认启动端口是8080,需要修改的话自行百度,然后去bin目录下启动,我的是linux,直接./startup.sh就行了,启动成功他会提示success信息,启动失败可以去logs目录下查看日志(哪个日志文件自己一个个点吧)。

启动成功即可访问8080端口看是否网站页面出来了,这个时候当然是没有日志的了,因为还没有采集,接下来就是部署skywalking-agent了,进行日志采集。

首先了使用如下的maven替换掉默认的logging日志框架,改用log4j2。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <!-- 去掉springboot默认配置 -->
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
 <!-- 引入log4j2依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-strter-log4j2</artifactId>
        </dependency>

然后用如下的maven标记产生的log4j2日志会被skywalking收集

<!-- skywalking收集log4j2日志 -->
        <dependency>
            <groupId>org.apache.skywalking</groupId>
            <artifactId>apm-toolkit-log4j-2.x</artifactId>
            <version>8.5.0</version>
        </dependency>

然后log4j2-spring.xml日志输出格式文件放到resource目录下

<?xml version="1.0" encoding="UTF-8"?>
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!-- Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,
     你会看到log4j2内部各种详细输出。可以设置成OFF(关闭) 或 Error(只输出错误信息)。
-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration status="WARN" monitorInterval="30">
    <Properties>
        <Property name="logging.lemes.pattern">
            %d{yyyy-MM-dd HH:mm:ss.SSS} [%-5level] [%traceId] [%logger{50}.%M:%L] - %msg%n
        </Property>
    </Properties>

    <Appenders>
        <!-- 输出控制台日志的配置 -->
        <Console name="Console" target="SYSTEM_OUT">
            <!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
            <ThresholdFilter level="debug" onMatch="ACCEPT" onMismatch="DENY"/>
            <!-- 输出日志的格式 -->
            <PatternLayout pattern="${logging.lemes.pattern}"/>
        </Console>

        <RollingRandomAccessFile name="debugRollingFile" fileName="${sys:user.home}/logs/userService.log"
                                 filePattern="${sys:user.home}/logs/userService-%d{yyyy-MM-dd}.log">
            <ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
            <PatternLayout charset="UTF-8" pattern="${logging.lemes.pattern}"/>
            <Policies>
                <TimeBasedTriggeringPolicy interval="1"  modulate="true"/>
            </Policies>
            <DefaultRolloverStrategy max="30"/>
        </RollingRandomAccessFile>

        <GRPCLogClientAppender name="grpc-log">
            <PatternLayout pattern="${logging.lemes.pattern}"/>
        </GRPCLogClientAppender>
    </Appenders>
    <Loggers>
        <!-- ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF -->
        <Logger name="com.tczscloud.user" level="DEBUG" additivity="false">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="debugRollingFile"/>
            <AppenderRef ref="grpc-log"/>
        </Logger>
        <Root level="info">
            <AppenderRef ref="Console"/>
            <AppenderRef ref="debugRollingFile"/>
            <AppenderRef ref="grpc-log"/>
        </Root>
    </Loggers>
</configuration>

准备工作做好了,接下来就是下载skywalking-agent了(可以查看版本对应的jdk版本,我用的是9.2.0),然后解压。

然后就是让微服务集成skywalking了,添加微服务的启动参数

-javaagent:D:\aaa\skywalking-agent-9.2\skywalking-agent.jar  //解压的agent目录下的skywalking-agent.jar
-Dskywalking.agent.service_name=user-service  //微服务名称
-Dskywalking.collector.backend_service=192.168.5.13:11800  //将收集的日志发到skywalking-APM服务

启动微服务就行了,访问接口产生日志看看skywalking页面是否能查到日志了。(多访问接口或多刷新skywalking页面),还是没有数据可以去APM服务查看logs日志,是否有报错。

这个普通微服务,如果是网关会有问题,可以查看我的下一篇文章http://blog.tczs93.com/vb667f7beb65f6335a16535a0e