项目集成SkyWalking,基于k8s搭建

一、搭建SkyWalking

官方文档(英文):skywalking/docs at master · apache/skywalking 

中文可以使用:GitHub - SkyAPM/document-cn-translation-of-skywalking: [已过期,请使用官网AI文档] The CN translation version of Apache SkyWalking document

需要搭建服务:SkyWalkingOAP,SkyWalkingUi, Elastisearch

1.先搭建SkyWalkingOAP服务.

SkyWalkingOAP 负责数据的收集、分析和存储。通过部署oap来启动SkyWalking的基础服务。

1.1首先搭建工作负载:

kind: Deployment
apiVersion: apps/v1
metadata:
  name: skywalk-970-oap
  namespace: common
  labels:
    app: skywalk-970-oap
  annotations:
    deployment.kubernetes.io/revision: '4'
    kubesphere.io/creator: fly
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalk-970-oap
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: skywalk-970-oap
        release: skywalking
      annotations:
        kubesphere.io/creator: fly
        kubesphere.io/restartedAt: '2024-05-22T03:21:09.886Z'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
      containers:
        - name: oap
          image: '159.75.136.188:40080/szqc2023002/skywalking-oap-server:9.7.0'
          ports:
            - name: grpc
              containerPort: 11800
              protocol: TCP
            - name: rest
              containerPort: 12800
              protocol: TCP
          env:
            - name: JAVA_OPTS
              value: '-Xmx1g -Xms1g'
            - name: SW_CORE_RECORD_DATA_TTL
              value: '2'
            - name: SW_CORE_METRICS_DATA_TTL
              value: '2'
            - name: SW_STORAGE
              value: elasticsearch
            - name: SW_STORAGE_ES_CLUSTER_NODES
              value: 'elasticsearch762.common:9200'
          resources:
            limits:
              memory: 2Gi
            requests:
              memory: 1Gi
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
我们存储日志的方式是使用es.

1.2然后搭建SkyWalking服务

kind: Service
apiVersion: v1
metadata:
  name: skywalk-970-oap
  namespace: common
  labels:
    app: skywalk-970-oap
  annotations:
    kubesphere.io/creator: fly
spec:
  ports:
    - name: tcp-11800
      protocol: TCP
      port: 11800
      targetPort: 11800
      nodePort: 30876
    - name: tcp-12800
      protocol: TCP
      port: 12800
      targetPort: 12800
      nodePort: 31012
  selector:
    app: skywalk-970-oap
    release: skywalking
  clusterIP: 10.233.43.222
  clusterIPs:
    - 10.233.43.222
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster
至此,SkyWalkingOAP服务完成。

2.搭建SkyWalkingUi服务

SkyWalkibgUi是SkyWalking的可视化界面服务。用于展示分布式系统的监控数据。我们可以通过WebUi来访问和使用SkyWalking。

2.1首先搭建SkyWalkingUi的工作负载

kind: Deployment
apiVersion: apps/v1
metadata:
  name: skywalk-970-ui
  namespace: common
  labels:
    app: skywalk-970-ui
  annotations:
    deployment.kubernetes.io/revision: '4'
    kubesphere.io/creator: fly
spec:
  replicas: 1
  selector:
    matchLabels:
      app: skywalk-970-ui
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: skywalk-970-ui
        release: skywalking
      annotations:
        kubesphere.io/creator: fly
        kubesphere.io/restartedAt: '2024-05-22T03:10:50.693Z'
    spec:
      containers:
        - name: sk-ui
          image: 'apache/skywalking-ui:9.7.0'
          ports:
            - containerPort: 8080
              protocol: TCP
          env:
            - name: SW_OAP_ADDRESS
              value: 'http://skywalk-970-oap.common:12800'
          resources: {}
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
2.2搭建SkyWalkingUi服务

kind: Service
apiVersion: v1
metadata:
  name: skywalk-970-ui
  namespace: common
  labels:
    app: skywalk-970-ui
  annotations:
    kubesphere.io/creator: fly
spec:
  ports:
    - name: http-8080
      protocol: TCP
      port: 8080
      targetPort: 8080
      nodePort: 31195
  selector:
    app: skywalk-970-ui
    release: skywalking
  clusterIP: 10.233.2.227
  clusterIPs:
    - 10.233.2.227
  type: NodePort
  sessionAffinity: None
  externalTrafficPolicy: Cluster
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster
至此SkyWalkingUi服务搭建完成。

3.搭建Es服务,用于存储SkyWalking日志。

3.1搭建Es服务的工作负载

kind: Deployment
apiVersion: apps/v1
metadata:
  name: elasticsearch762
  namespace: common
  labels:
    app: elasticsearch762
  annotations:
    deployment.kubernetes.io/revision: '4'
    kubesphere.io/creator: fly
    kubesphere.io/description: 未提供nodeport服务,供Skywalking做数据源
spec:
  replicas: 1
  selector:
    matchLabels:
      app: elasticsearch762
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: elasticsearch762
      annotations:
        kubesphere.io/creator: fly
        kubesphere.io/restartedAt: '2024-05-22T03:41:36.061Z'
        logging.kubesphere.io/logsidecar-config: '{}'
    spec:
      volumes:
        - name: host-time
          hostPath:
            path: /etc/localtime
            type: ''
        - name: volume-m5uec2
          configMap:
            name: elasticsearch760
            items:
              - key: elasticsearch.yml
                path: elasticsearch.yml
            defaultMode: 420
        - name: volume-vcbpgy
          configMap:
            name: elasticsearch760
            items:
              - key: jvm.options
                path: jvm.options
            defaultMode: 420
      containers:
        - name: container-3sukk2
          image: 'elasticsearch:7.6.2'
          ports:
            - name: tcp-9200
              containerPort: 9200
              protocol: TCP
            - name: tcp-9300
              containerPort: 9300
              protocol: TCP
          env:
            - name: discovery.type
              value: single-node
            - name: ES_JAVA_OPTS
              value: '-Xms1024m -Xmx1024m'
          resources: {}
          volumeMounts:
            - name: host-time
              readOnly: true
              mountPath: /etc/localtime
            - name: volume-m5uec2
              readOnly: true
              mountPath: /usr/share/elasticsearch/config/elasticsearch.yml
              subPath: elasticsearch.yml
            - name: volume-vcbpgy
              readOnly: true
              mountPath: /usr/share/elasticsearch/config/jvm.options
              subPath: jvm.options
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      nodeSelector:
        kubernetes.io/hostname: worker1
      serviceAccountName: default
      serviceAccount: default
      securityContext: {}
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 25%
      maxSurge: 25%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
3.2搭建Es的服务

kind: Service
apiVersion: v1
metadata:
  name: elasticsearch762
  namespace: common
  labels:
    app: elasticsearch762
  annotations:
    kubesphere.io/creator: fly
spec:
  ports:
    - name: tcp-9200
      protocol: TCP
      port: 9200
      targetPort: 9200
    - name: tcp-9300
      protocol: TCP
      port: 9300
      targetPort: 9300
  selector:
    app: elasticsearch762
  clusterIP: 10.233.7.71
  clusterIPs:
    - 10.233.7.71
  type: ClusterIP
  sessionAffinity: None
  ipFamilies:
    - IPv4
  ipFamilyPolicy: SingleStack
  internalTrafficPolicy: Cluster
至此Es搭建服务完成。需要注意的点是:SkyWalkingAOP配置的Es的变量值,要对应Es的Dns服务名称。           

- name: SW_STORAGE_ES_CLUSTER_NODES
value: 'elasticsearch762.common:9200'

二、项目集成Skywalking

在需要集成SkyWalking服务的deploy.yml添加initContainer,达到无侵入方式集成。

kind: Deployment
apiVersion: apps/v1
metadata:
  name: zhqc-frame-gateway
  namespace: szqc2023002-dev
  labels:
    app: zhqc-frame-gateway
  annotations:
    deployment.kubernetes.io/revision: '86'
    kubectl.kubernetes.io/last-applied-configuration: >
      {"apiVersion":"apps/v1","kind":"Deployment","metadata":{"annotations":{},"labels":{"app":"zhqc-frame-gateway"},"name":"zhqc-frame-gateway","namespace":"szqc2023002-dev"},"spec":{"progressDeadlineSeconds":600,"replicas":1,"selector":{"matchLabels":{"app":"zhqc-frame-gateway"}},"strategy":{"rollingUpdate":{"maxSurge":"50%","maxUnavailable":"50%"},"type":"RollingUpdate"},"template":{"metadata":{"labels":{"app":"zhqc-frame-gateway"}},"spec":{"containers":[{"env":[{"name":"JAVA_TOOL_OPTIONS","value":"-javaagent:/skywalking/agent/skywalking-agent.jar"},{"name":"SW_AGENT_NAME","value":"zhqc-frame-gateway"},{"name":"SW_AGENT_COLLECTOR_BACKEND_SERVICES","value":"192.168.10.222:30876"},{"name":"SW_AGENT_TRACE_IGNORE_PATH","value":"GET:/actuator/**,Lettuce/**"},{"name":"SPRING_PROFILES_ACTIVE","value":"dev_k8s"},{"name":"NACOS_ENABLED","value":"true"},{"name":"NACOS_SERVER_ADDR","value":"192.168.10.222"},{"name":"NACOS_SERVER_PORT","value":"32064"},{"name":"NACOS_SERVER_USERNAME","value":"nacos"},{"name":"NACOS_SERVER_PASSWORD","value":"nacos"},{"name":"NACOS_DISCOVERY_NAMESPACE","value":"ff54f1f9-5b3f-432e-addc-0b006b2646c7"},{"name":"NACOS_CONFIG_NAMESPACE","value":"016dcce2-92c4-4ae4-b2e3-3375d790c43a"}],"image":"159.75.136.188:40080/szqc2023002/zhqc-frame-gateway:SNAPSHOT-87","imagePullPolicy":"Always","name":"app","ports":[{"containerPort":8080,"protocol":"TCP"}],"resources":{"limits":{"memory":"1000Mi"},"requests":{"cpu":"100m","memory":"200Mi"}},"terminationMessagePath":"/dev/termination-log","terminationMessagePolicy":"File","volumeMounts":[{"mountPath":"/skywalking","name":"skywalking-agent"}]}],"dnsPolicy":"ClusterFirst","imagePullSecrets":[{"name":"zhqc-dockerhub"}],"initContainers":[{"args":["-c","cp
      -R /skywalking/agent /agent/;cp
      /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-9.0.0.jar
      /agent/agent/plugins/apm-trace-ignore-plugin-9.0.0.jar;rm
      /agent/agent/plugins/apm-redisson-3.x-plugin-9.0.0.jar;echo
      trace.ignore_path=\\${SW_AGENT_TRACE_IGNORE_PATH:Lettuce/**} \u003e
      /agent/agent/config/apm-trace-ignore-plugin.config; cp
      /skywalking/agent/optional-plugins/apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar
      /agent/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar; cp
      /skywalking/agent/optional-plugins/apm-spring-webflux-5.x-plugin-9.0.0.jar
      /agent/agent/plugins/apm-spring-webflux-5.x-plugin-9.0.0.jar;"],"command":["/bin/sh"],"image":"apache/skywalking-java-agent:9.0.0-alpine","name":"agent-container","volumeMounts":[{"mountPath":"/agent","name":"skywalking-agent"}]}],"restartPolicy":"Always","terminationGracePeriodSeconds":30,"volumes":[{"emptyDir":{},"name":"skywalking-agent"}]}}}}
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zhqc-frame-gateway
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: zhqc-frame-gateway
        pod-template-hash: 788dd5dc8b
      annotations:
        kubesphere.io/restartedAt: '2024-05-20T05:52:23.124Z'
    spec:
      volumes:
        - name: skywalking-agent
          emptyDir: {}
      initContainers:
        - name: agent-container
          image: 'apache/skywalking-java-agent:9.0.0-alpine'
          command:
            - /bin/sh
          args:
            - '-c'
            - >-
              cp -R /skywalking/agent /agent/;cp
              /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-9.0.0.jar
              /agent/agent/plugins/apm-trace-ignore-plugin-9.0.0.jar;rm
              /agent/agent/plugins/apm-redisson-3.x-plugin-9.0.0.jar;echo
              trace.ignore_path=\${SW_AGENT_TRACE_IGNORE_PATH:Lettuce/**} >
              /agent/agent/config/apm-trace-ignore-plugin.config; cp
              /skywalking/agent/optional-plugins/apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar
              /agent/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar;
              cp
              /skywalking/agent/optional-plugins/apm-spring-webflux-5.x-plugin-9.0.0.jar
              /agent/agent/plugins/apm-spring-webflux-5.x-plugin-9.0.0.jar;
          resources: {}
          volumeMounts:
            - name: skywalking-agent
              mountPath: /agent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent
      containers:
        - name: app
          image: '159.75.136.188:40080/szqc2023002/zhqc-frame-gateway:SNAPSHOT-2'
          ports:
            - containerPort: 8080
              protocol: TCP
          env:
            - name: JAVA_TOOL_OPTIONS
              value: '-javaagent:/skywalking/agent/skywalking-agent.jar'
            - name: SW_AGENT_NAME
              value: zhqc-frame-gateway
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: '192.168.10.222:30876'
            - name: SW_AGENT_TRACE_IGNORE_PATH
              value: 'GET:/actuator/**,Lettuce/**'
            - name: SPRING_PROFILES_ACTIVE
              value: dev_k8s
            - name: NACOS_ENABLED
              value: 'true'
            - name: NACOS_SERVER_ADDR
              value: nacos223.szqc2023002-dev
            - name: NACOS_SERVER_PORT
              value: '8848'
            - name: NACOS_SERVER_USERNAME
              value: nacos4app
            - name: NACOS_SERVER_PASSWORD
              value: nacos@2024
            - name: NACOS_DISCOVERY_NAMESPACE
              value: ff54f1f9-5b3f-432e-addc-0b006b2646c7
            - name: NACOS_CONFIG_NAMESPACE
              value: 016dcce2-92c4-4ae4-b2e3-3375d790c43a
          resources:
            limits:
              memory: 1000Mi
            requests:
              cpu: 100m
              memory: 200Mi
          volumeMounts:
            - name: skywalking-agent
              mountPath: /skywalking
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: Always
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
      dnsPolicy: ClusterFirst
      securityContext: {}
      imagePullSecrets:
        - name: zhqc-dockerhub
      schedulerName: default-scheduler
  strategy:
    type: RollingUpdate
    rollingUpdate:
      maxUnavailable: 50%
      maxSurge: 50%
  revisionHistoryLimit: 10
  progressDeadlineSeconds: 600
 

添加了挂载点:

    spec:
      volumes:
        - name: skywalking-agent
          emptyDir: {}

添加了initContainer

  initContainers:
        - name: agent-container
          image: 'apache/skywalking-java-agent:9.0.0-alpine'
          command:
            - /bin/sh
          args:
            - '-c'
            - >-
              cp -R /skywalking/agent /agent/;cp
              /skywalking/agent/optional-plugins/apm-trace-ignore-plugin-9.0.0.jar
              /agent/agent/plugins/apm-trace-ignore-plugin-9.0.0.jar;rm
              /agent/agent/plugins/apm-redisson-3.x-plugin-9.0.0.jar;echo
              trace.ignore_path=\${SW_AGENT_TRACE_IGNORE_PATH:Lettuce/**} >
              /agent/agent/config/apm-trace-ignore-plugin.config; cp
              /skywalking/agent/optional-plugins/apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar
              /agent/agent/plugins/apm-spring-cloud-gateway-3.x-plugin-9.0.0.jar;
              cp
              /skywalking/agent/optional-plugins/apm-spring-webflux-5.x-plugin-9.0.0.jar
              /agent/agent/plugins/apm-spring-webflux-5.x-plugin-9.0.0.jar;
          resources: {}
          volumeMounts:
            - name: skywalking-agent
              mountPath: /agent
          terminationMessagePath: /dev/termination-log
          terminationMessagePolicy: File
          imagePullPolicy: IfNotPresent

增加了SkyWalking的相关配置:

          env:
            - name: JAVA_TOOL_OPTIONS
              value: '-javaagent:/skywalking/agent/skywalking-agent.jar'
            - name: SW_AGENT_NAME
              value: zhqc-frame-gateway
            - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
              value: '192.168.10.222:30876'
            - name: SW_AGENT_TRACE_IGNORE_PATH
              value: 'GET:/actuator/**,Lettuce/**'

SkyWalking忽略的接口

  - name: SW_AGENT_TRACE_IGNORE_PATH
 value: 'GET:/actuator/**,Lettuce/**'

SkyWalking的收集服务,即SkyWalkingAOP暴漏的服务

   - name: SW_AGENT_COLLECTOR_BACKEND_SERVICES
   value: '192.168.10.222:30876'

部署服务之后,就可以在SKyWalking看到该服务。

三、项目将日志集成到SkyWalking中。

1.引入pom包

<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-trace -->
<dependency>
   <groupId>org.apache.skywalking</groupId>
   <artifactId>apm-toolkit-trace</artifactId>
   <version>9.0.0</version>
</dependency>

<!-- https://mvnrepository.com/artifact/org.apache.skywalking/apm-toolkit-logback-1.x -->
<dependency>
   <groupId>org.apache.skywalking</groupId>
   <artifactId>apm-toolkit-logback-1.x</artifactId>
   <version>9.0.0</version>
</dependency>
  </dependencies>

2.修改logback-spring.xml的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 级别从高到低 OFF 、 FATAL 、 ERROR 、 WARN 、 INFO 、 DEBUG 、 TRACE 、 ALL -->
<!-- 日志输出规则 根据当前ROOT 级别,日志输出时,级别高于root默认的级别时 会输出 -->
<!-- 以下 每个配置的 filter 是过滤掉输出文件里面,会出现高级别文件,依然出现低级别的日志信息,通过filter 过滤只记录本级别的日志 -->
<!-- scan 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。 -->
<!-- scanPeriod 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 -->
<!-- debug 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 -->

<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <contextName>springboot-security</contextName>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <springProperty scope="context" name="APP_PORT" source="server.port"/>
    <springProperty scope="context" name="springAppName" source="spring.application.name"/>
    <springProperty scope="context" name="log.home_dir" source="logging.path"/>
    <!-- 日志输出格式 -->
    <property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS}[${springAppName}-${APP_PORT}][%clr(${PID:-}) %X{X-B3-TraceId:-},%X{X-B3-SpanId:-}] [%thread] %-5level %logger{50} - %msg%n"/>
    <!-- 定义日志文件 输出位置 -->
    <!--<springProfile name="dev">-->
        <!--<property name="log.home_dir" value="${logging.path}"/>-->
    <!--</springProfile>-->
    <!--<springProfile name="test">-->
        <!--<property name="log.home_dir" value="${logging.path}"/>-->
    <!--</springProfile>-->
    <!--<springProfile name="prod">-->
        <!--<property name="log.home_dir" value="${logging.path}"/>-->
    <!--</springProfile>-->
    <!-- 日志最大的历史 30天 -->
    <property name="log.maxHistory" value="30"/>
    <!-- 打印debug级别日志及以上级别日志 -->
    <property name="log.level" value="info"/>

    <!-- ConsoleAppender 控制台输出日志 start -->
<!--    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">-->
<!--        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">-->
<!--            <level>INFO</level>-->
<!--        </filter>-->
<!--        <encoder>-->
<!--            <pattern>-->
<!--                <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
<!--                &lt;!&ndash;<charset>utf8</charset>&ndash;&gt;-->
<!--            </pattern>-->
<!--        </encoder>-->
<!--    </appender>-->
    <!-- ConsoleAppender 控制台输出日志 end -->

    <!-- errorAppender 控制台输出日志 start -->
<!--    <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        &lt;!&ndash; 过滤器,只记录WARN级别的日志 &ndash;&gt;-->
<!--        &lt;!&ndash; 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 &ndash;&gt;-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--            &lt;!&ndash; 设置过滤级别 &ndash;&gt;-->
<!--            <level>ERROR</level>-->
<!--            &lt;!&ndash; 用于配置符合过滤条件的操作 &ndash;&gt;-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            &lt;!&ndash; 用于配置不符合过滤条件的操作 &ndash;&gt;-->
<!--            <onMismatch>DENY</onMismatch>-->
<!--        </filter>-->
<!--        &lt;!&ndash; 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动 &ndash;&gt;-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--            &lt;!&ndash;日志输出位置 可以是相对和绝对路径 &ndash;&gt;-->
<!--            <fileNamePattern>-->
<!--                ${log.home_dir}/error/%d{yyyy-MM-dd}/errorLog-%i.log-->
<!--            </fileNamePattern>-->
<!--            &lt;!&ndash; 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 &ndash;&gt;-->
<!--            <maxHistory>${log.maxHistory}</maxHistory>-->
<!--            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--                &lt;!&ndash; 单个log文件超过该大小就会重新建一个log文件 &ndash;&gt;-->
<!--                <MaxFileSize>2MB</MaxFileSize>-->
<!--            </TimeBasedFileNamingAndTriggeringPolicy>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>-->
<!--                <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
<!--                <charset>utf8</charset>-->
<!--            </pattern>-->
<!--        </encoder>-->
<!--    </appender>-->
    <!-- errorAppender 控制台输出日志 end -->

    <!-- warnAppender 控制台输出日志 start -->
<!--    <appender name="warn" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--            <level>WARN</level>-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            <onMismatch>DENY</onMismatch>-->
<!--        </filter>-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--            <fileNamePattern>-->
<!--                ${log.home_dir}/warn/%d{yyyy-MM-dd}/warnLog-%i.log-->
<!--            </fileNamePattern>-->
<!--            <maxHistory>${log.maxHistory}</maxHistory>-->
<!--            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--                <MaxFileSize>2MB</MaxFileSize>-->
<!--            </TimeBasedFileNamingAndTriggeringPolicy>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>-->
<!--                <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
<!--                <charset>utf8</charset>-->
<!--            </pattern>-->
<!--        </encoder>-->
<!--    </appender>-->
    <!-- warnAppender 控制台输出日志 end -->

    <!-- infoAppender 控制台输出日志 start -->
<!--    <appender name="info" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--            <level>INFO</level>-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            <onMismatch>DENY</onMismatch>-->
<!--        </filter>-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--            <fileNamePattern>${log.home_dir}/info/%d{yyyy-MM-dd}/infoLog-%i.log</fileNamePattern>-->
<!--            <maxHistory>${log.maxHistory}</maxHistory>-->
<!--            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--                <MaxFileSize>2MB</MaxFileSize>-->
<!--            </TimeBasedFileNamingAndTriggeringPolicy>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>-->
<!--                <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
<!--                <charset>utf8</charset>-->
<!--            </pattern>-->
<!--        </encoder>-->
<!--    </appender>-->
    <!-- infoAppender 控制台输出日志 end -->

    <!-- debugAppender 控制台输出日志 start -->
<!--    <appender name="debug" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!--        <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!--            <level>DEBUG</level>-->
<!--            <onMatch>ACCEPT</onMatch>-->
<!--            <onMismatch>DENY</onMismatch>-->
<!--        </filter>-->
<!--        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!--            <fileNamePattern>${log.home_dir}/debug/%d{yyyy-MM-dd}/debugLog-%i.log</fileNamePattern>-->
<!--            <maxHistory>${log.maxHistory}</maxHistory>-->
<!--            <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!--                <MaxFileSize>2MB</MaxFileSize>-->
<!--            </TimeBasedFileNamingAndTriggeringPolicy>-->
<!--        </rollingPolicy>-->
<!--        <encoder>-->
<!--            <pattern>-->
<!--                <pattern>${CONSOLE_LOG_PATTERN}</pattern>-->
<!--                <charset>utf8</charset>-->
<!--            </pattern>-->
<!--        </encoder>-->
<!--    </appender>-->
    <!-- debugAppender 控制台输出日志 end -->

    <!--日志发送到logstash=>elasticSearch=>kibana start-->
    <!--<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">-->
        <!--<destination>localhost:9601</destination>-->
        <!--<queueSize>1048576</queueSize>-->
        <!--<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />-->
    <!--</appender>-->

    <!--<logger name="kibanaLog" level="DEBUG" additivity="false">-->
        <!--<appender-ref ref="LOGSTASH"/>-->
    <!--</logger>-->
    <!--日志发送到logstash=>elasticSearch=>kibana end -->

    <!-- 1、控制台输出 -->
    <property name="CONSOLE_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level[%tid][%blue(%thread)][%cyan(%logger)] - %m%n"/>
    <appender name="consoleLog" class="ch.qos.logback.core.ConsoleAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>${CONSOLE_PATTERN}</Pattern>
            </layout>
        </encoder>
    </appender>

    <!-- 异步输出 -->
    <appender name="console-async" class="ch.qos.logback.classic.AsyncAppender">
        <discardingThreshold>0</discardingThreshold>
        <queueSize>1024</queueSize>
        <neverBlock>true</neverBlock>
        <appender-ref ref="consoleLog"/>
    </appender>

    <!-- 2、使用gRpc将日志发送到Skywalking服务端 -->
    <!-- 日志输出格式 -->
    <property name="RPC_PATTERN"
              value="%d{yyyy-MM-dd HH:mm:ss.SSS} [${appName}] %-5p [%tid] [%thread] %logger{36} - %m%n"/>
    <appender name="grpc-log" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
        <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
            <layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
                <Pattern>${RPC_PATTERN}</Pattern>
            </layout>
        </encoder>
    </appender>

    <root>
<!--        <level value="${log.level}"/>-->
        <!-- 控制台输出 -->
<!--        <appender-ref ref="console"/>-->
<!--        <appender-ref ref="consoleLog"/>-->
        <appender-ref ref="console-async" />
        <appender-ref ref="grpc-log" />
        <!-- 文件输出 -->
<!--        <appender-ref ref="error"/>-->
<!--        <appender-ref ref="warn"/>-->
<!--        <appender-ref ref="info"/>-->
<!--        <appender-ref ref="debug"/>-->
    </root>

    <!-- 文件不输出 -->
    <Logger name="org.springframework" level="ERROR"></Logger>
    <Logger name="org.hibernate" level="ERROR"></Logger>
    <Logger name="org.apache" level="ERROR"></Logger>
    <Logger name="com.netflix" level="ERROR"></Logger>
    <Logger name="ch.qos.logback" level="ERROR"></Logger>
    <Logger name="com.alibaba.cloud.nacos" level="INFO"></Logger>
</configuration>

这样日志就会打印到SkyWalking中,不需要在输出到日志文件中

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/637134.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode:496. 下一个更大元素 I + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

深度学习——图像分类(CNN)—训练模型

训练模型 1.导入必要的库2.定义超参数3.读取训练和测试标签CSV文件4.确保标签是字符串类型5.显示两个数据框的前几行以了解它们的结构6.定义图像处理参数7.创建图像数据生成器8.设置目录路径9.创建训练和验证数据生成器10.构建模型11.编译模型12.训练模型并收集历史13.绘制损失…

【AD21】PCB板尺寸与层名称标注

PCB绘制完成后&#xff0c;需要给上级或生产制造商发送输出文件&#xff0c;输出文件中包含板尺寸标识和层标识可以方便工作的交接。 1. 板尺寸标识 首先板尺寸标识所在的层要在与板框不同的机械层&#xff0c;这里我选择机械5层。 点击放置->尺寸->线性尺寸 这里板尺…

微信小程序uniapp+django洗脚按摩足浴城消费系统springboot

原生wxml开发对Node、预编译器、webpack支持不好&#xff0c;影响开发效率和工程构建。所以都会用uniapp框架开发 前后端分离&#xff0c;后端给接口和API文档&#xff0c;注重前端,接近原生系统 使用Navicat或者其它工具&#xff0c;在mysql中创建对应名称的数据库&#xff0…

利用大模型构造数据集,并微调大模型

一、前言 目前大模型的微调方法有很多&#xff0c;而且大多可以在消费级显卡上进行&#xff0c;每个人都可以在自己的电脑上微调自己的大模型。 但是在微调时我们时常面对一个问题&#xff0c;就是数据集问题。网络上有许多开源数据集&#xff0c;但是很多时候我们并不想用这…

Gerchberg-Saxton (GS) 和混合输入输出(Hybrid Input-Output, HIO)算法

文章目录 1. 简介2. 算法描述3. 混合输入输出&#xff08;Hybrid Input-Output, HIO&#xff09;算法3.1 HIO算法步骤3.2 HIO算法的优势3.3 算法描述 4. 算法实现与对比5. 总结参考文献 1. 简介 Gerchberg-Saxton (GS) 算法是一种常用于相位恢复和光学成像的迭代算法。该算法最…

【抽代复习笔记】18-置换练习题(2)及两个重要定理

最近一直忙于学校的事情&#xff0c;好久没更新了&#xff0c;实在抱歉。接下来几期大概也会更得慢一些&#xff0c;望见谅。 练习4&#xff1a;写出4次对称群S4中所有置换。 解&#xff1a;由上一篇笔记结尾的定理我们知道&#xff0c;4次对称群的阶&#xff08;也就是所含元…

JSON的序列化与反序列化以及VSCode执行Run Code 报错

JSON JSON: JavaScript Object Notation JS对象简谱 , 是一种轻量级的数据交换格式。 JSON格式 { "name":"金苹果", "info":"种苹果" } 一个对象&#xff1a;由一个大括号表示.括号中通过键值对来描述对象的属性 (可以理解为, 大…

2024年 电工杯 (A题)大学生数学建模挑战赛 | 园区微电网风光储协调优化配置 | 数学建模完整代码解析

DeepVisionary 每日深度学习前沿科技推送&顶会论文&数学建模与科技信息前沿资讯分享&#xff0c;与你一起了解前沿科技知识&#xff01; 本次DeepVisionary带来的是电工杯的详细解读&#xff1a; 完整内容可以在文章末尾全文免费领取&阅读&#xff01; 问题重述…

MVS net笔记和理解

文章目录 传统的方法有什么缺陷吗&#xff1f;MVSnet深度的预估 传统的方法有什么缺陷吗&#xff1f; 传统的mvs算法它对图像的光照要求相对较高&#xff0c;但是在实际中要保证照片的光照效果很好是很难的。所以传统算法对镜面反射&#xff0c;白墙这种的重建效果就比较差。 …

【Python自动化测试】:Unittest单元测试与HTMLTestRunner自动生成测试用例的好帮手

读者大大们好呀&#xff01;&#xff01;!☀️☀️☀️ &#x1f525; 欢迎来到我的博客 &#x1f440;期待大大的关注哦❗️❗️❗️ &#x1f680;欢迎收看我的主页文章➡️寻至善的主页 文章目录 &#x1f525;前言&#x1f680;unittest编写测试用例&#x1f680;unittest测…

【408精华知识】Cache类题目解题套路大揭秘

有关Cache的题目&#xff0c;需要理解Cache的工作原理&#xff0c;也即给出一个地址&#xff0c;要知道如何在Cache中寻找或者如何将其从主存中复制入Cache&#xff0c;同时理解Cache中具体是如何存储的&#xff0c;包含三种存储方式&#xff0c;分别是直接映射、全相联映射、组…

clion/pycharm 安装中文

楼主版本 2024.1 mac 操作系统&#xff0c;理论上不同版本和不同操作系统操作应该大同小异 首先找到插件的位置 方式一 1、进入工程&#xff0c;右上角找到设置 2、找到插件&#xff08;欢迎界面也能找到这个&#xff09; 方式二 在欢迎界面找到插件 最后 插件商店搜索 l…

矩阵乘法不满足交换律-反证法

假定有2个矩阵A和B A*B 不等于 B*A 手写证明&#xff1a; A*B为 B*A为 由此可以看出&#xff0c;矩阵乘法不满足交换律&#xff01;&#xff01;

Python | Leetcode Python题解之第100题相同的树

题目&#xff1a; 题解&#xff1a; class Solution:def isSameTree(self, p: TreeNode, q: TreeNode) -> bool:if not p and not q:return Trueif not p or not q:return Falsequeue1 collections.deque([p])queue2 collections.deque([q])while queue1 and queue2:node…

centos7和centos8安装mysql5.6 5.7 8.0

https://dev.mysql.com/downloads/repo/yum/ 注意构造下http://repo.mysql.com/mysql-community-release-el*-*.noarch.rpm 【以centos7为例】 安装mysql5.6 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm rpm -ivh mysql-community-release-el7-5…

初识Qt:从Hello world到对象树的深度解析

Qt中的对象树深度解析 Hello world1.图形化界面创建命令行式创建在栈上创建在堆上创建为什么传文本需要QString&#xff0c;std::string不行吗&#xff1f;那为什么要传入this指针&#xff1f;为什么new后不用显示调用delete函数呢&#xff0c;不会造成内存泄漏问题吗&#xff…

国产操作系统上使用SQLynx连接数据库 _ 统信 _ 麒麟 _ 中科方德

原文链接&#xff1a;国产操作系统上使用SQLynx连接数据库 | 统信 | 麒麟 | 中科方德 Hello&#xff0c;大家好啊&#xff01;今天我们将探讨如何在国产操作系统上使用SQLynx。这是一款功能强大的数据库管理工具&#xff0c;可以帮助用户高效地管理和操作数据库。本文将详细介绍…

2024 电工杯高校数学建模竞赛(A题)数学建模完整思路+完整代码全解全析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024电工杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

Docker搭建mysql性能测试环境

OpenEuler使用Docker搭建mysql性能测试环境 一、安装Docker二、docker安装mysql三、测试mysql连接 一、安装Docker 建立源文件vim /etc/yum.repos.d/docker-ce.repo增加内容[docker-ce-stable] nameDocker CE Stable - $basearch baseurlhttps://repo.huaweicloud.com/docker…