项目集成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>-->
<!-- <!–<charset>utf8</charset>–>-->
<!-- </pattern>-->
<!-- </encoder>-->
<!-- </appender>--><!-- ConsoleAppender 控制台输出日志 end --><!-- errorAppender 控制台输出日志 start -->
<!-- <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">-->
<!-- <!– 过滤器,只记录WARN级别的日志 –>-->
<!-- <!– 果日志级别等于配置级别,过滤器会根据onMath 和 onMismatch接收或拒绝日志。 –>-->
<!-- <filter class="ch.qos.logback.classic.filter.LevelFilter">-->
<!-- <!– 设置过滤级别 –>-->
<!-- <level>ERROR</level>-->
<!-- <!– 用于配置符合过滤条件的操作 –>-->
<!-- <onMatch>ACCEPT</onMatch>-->
<!-- <!– 用于配置不符合过滤条件的操作 –>-->
<!-- <onMismatch>DENY</onMismatch>-->
<!-- </filter>-->
<!-- <!– 最常用的滚动策略,它根据时间来制定滚动策略.既负责滚动也负责触发滚动 –>-->
<!-- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">-->
<!-- <!–日志输出位置 可以是相对和绝对路径 –>-->
<!-- <fileNamePattern>-->
<!-- ${log.home_dir}/error/%d{yyyy-MM-dd}/errorLog-%i.log-->
<!-- </fileNamePattern>-->
<!-- <!– 可选节点,控制保留的归档文件的最大数量,超出数量就删除旧文件假设设置每个月滚动,且<maxHistory>是6, 则只保存最近6个月的文件,删除之前的旧文件。注意,删除旧文件是,那些为了归档而创建的目录也会被删除 –>-->
<!-- <maxHistory>${log.maxHistory}</maxHistory>-->
<!-- <TimeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">-->
<!-- <!– 单个log文件超过该大小就会重新建一个log文件 –>-->
<!-- <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中,不需要在输出到日志文件中
相关文章:
项目集成SkyWalking,基于k8s搭建
一、搭建SkyWalking 官方文档(英文):skywalking/docs at master apache/skywalking 中文可以使用:GitHub - SkyAPM/document-cn-translation-of-skywalking: [已过期,请使用官网AI文档] The CN translation version of Apache…...
mysql-差异备份流程
4.差异备份流程 差异备份流程(重要) 第一次完整备份 innobackupex /xtrabackup innobackupex --userroot --password123456 /xtrabackup2024-05-23_20-25-05 第一次完整备份 2024-05-23_20-40-55 第二次差异备份 2024-05-23_20-47-37 第三次差异备份再往数据库里面…...
基于动态规划算法的DNA序列比对函数,给出两条序列(v和w)的打分矩阵
一.什么是动态规划算法 1.1总体思想 动态规划算法与分治法类似,基本思想也是将待求解的问题分成若干个子问题 经过分解得到的子问题往往不是互相独立的,有些子问题被重复计算多次 如果能够保存已解决的子问题答案,在需要时再找出来已求得…...
Tailwind CSS快速入门
文章目录 初识安装Tailwindcss试用安装快速书写技巧扩展好处Todo 初识 只需书写 HTML 代码,无需书写 CSS,即可快速构建美观的网站 Tailwind CSS 是一个功能类优先的 CSS 框架,它通过提供大量的原子类(utility classes)…...
Postman使用技巧
Postman是一款广泛使用的API开发和测试工具,专为简化Web服务API的开发、测试、文档编制和协作过程而设计。它支持各种HTTP请求方法,包括GET、POST、PUT、DELETE等,允许用户轻松地构建和发送请求,以及检查响应。 本文介绍几个提升效…...
sqli-labs靶场
less---11 1.求闭合字符 输入1报错说明存在注入点 存在注入点 2.查库名 使用报错注入查库名 admin” and (select 1 from (select count(*),concat(database(),floor(rand(0)*2))x from information_schema.tables group by x)y)# //floor函数报错 3.查表名 admin and upd…...
基于springboot的大创管理系统
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了大创管理系统的开发全过程。通过分析大创管理系统管理的不足,创建了一个计算机管理大创管理系统的方案。文章介绍了大创管理系统的系统分析部分&…...
常用torch.nn
目录 一、torch.nn和torch.nn.functional二、nn.Linear三、nn.Embedding四、nn.Identity五、Pytorch非线性激活函数六、nn.Conv2d七、nn.Sequential八、nn.ModuleList九、torch.outer torch.cat 一、torch.nn和torch.nn.functional Pytorch中torch.nn和torch.nn.functional的区…...
力扣226.翻转二叉树101.对称二叉树
解决二叉树的问题,经常要习惯从递归角度思考 左子树/右子树是否具备某属性、是否属于什么类型(和题目要求的判断当前树是否xxx一样); 对左/右子树进行什么操作(和题目要求的对当前树的操作一样)。 226.翻转…...
word如何按照原本页面审阅文档
1 视图-阅读视图 2 视图,自己看,懒得打字了哈哈...
前端基础入门三大核心之HTML篇:探索WebAssembly —— 开启网页高性能应用新时代
前端基础入门三大核心之HTML篇:探索WebAssembly —— 开启网页高性能应用新时代 WebAssembly基础概念工作原理概览WebAssembly实战示例基本使用 安全性与性能优化防范漏洞实践实际工作中的使用技巧结语与讨论 随着Web技术的飞速发展,前端开发者面临越来越…...
NDIS小端口驱动(四)
NDIS中断相关 1. 注册和取消注册中断: 微型端口驱动程序调用 NdisMRegisterInterruptEx 来注册中断。 驱动程序分配并初始化 NDIS_MINIPORT_INTERRUPT_CHARACTERISTICS 结构,以指定中断特征和函数入口点,驱动程序将结构传递给 NdisMRegister…...
用户态网络缓冲区设计
基于数组实现的环形缓冲区: 优点 使用固定大小的连续空间做用户态缓冲区,利用了内存访问的局部性,可以提高缓存命中率,提高程序性能,在处理大量数据时,缓存的利用率对性能有着很大的影响 正是基于性能的…...
Linux运维工程师基础面试题整理(三)
Linux运维工程师基础面试题整理(三) 1. 文件inode号有什么用?2. 文件的权限怎么设置与管理?3. 如何SSH免密配置?4. 如何快速部署一个web服务?5. 如何更新Linux系统内核?6. centos中如何配置本地yum源?7.Linux 防火墙如何简单配置?8. 有哪些工具可以批量管理Linux服务器…...
基于单片机与传感器技术的汽车起动线路设计
摘 要:在以发动机为动力源的汽车中,起动系统承担起使发动机由非工作状态进入工作状态的重要作用,属于发动机的附属系统。在传统汽车起动系统的基础上提出将单片机与传感器技术运用到起动控制线路中,通过传感器采集发动机工作状态信…...
C#如何通过反射获取外部dll的函数
在C#中,你可以使用反射(Reflection)来加载外部的DLL(动态链接库)并获取其中的函数(在C#中通常称为方法)。但是,请注意,反射主要用于访问类型信息,并且对于非托…...
从零开始傅里叶变换
从零开始傅里叶变换 1 Overview2 傅里叶级数2.1 基向量2.2 三角函数系表示 f ( t ) f(t) f(t)2.2.1 三角函数系的正交性2.2.2 三角函数系的系数 2.3 复指数函数系表示 f ( t ) f(t) f(t)2.3.1 复指数函数系的系数2.3.2 复指数函数系的正交性 2.4 傅里叶级数总结 3 傅里叶变换…...
解决1万条数据前端渲染不卡的问题
万级数据前端渲染优化 解决思路requestAnimationFrame完整代码 解决思路 将数据分组,通过定时器或requestAnimationFrame两种方式分组渲染到Dom上 requestAnimationFrame 渲染数据-动画requestAnimationFram方法 使用requestAnimationFrame可以将动画的每一帧绘制…...
如何编写一个API——Python代码示例及拓展
下面是一个必备的API的demo,包括用户认证、数据库交互、错误处理和更复杂的异步任务处理。使用Flask来创建一个RESTful API,涉及用户注册、登录、以及获取用户信息的功能。 示例1:编写API 安装依赖 首先,你需要安装以下库来支持示例的功能: pip install flask flask-c…...
UMPNet: Universal Manipulation Policy Network for Articulated Objects
1. 摘要 UMPNet是一个基于图像的策略网络,能够推理用于操纵铰接物体的闭环动作序列。该策略支持6DoF动作表示和可变长度轨迹。 为处理多种类的物体,该策略从不同的铰接结构中学习,并泛化到未见过的物体或类别上。该策略是以自监督探索的方式…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
IDEA运行Tomcat出现乱码问题解决汇总
最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...
全球首个30米分辨率湿地数据集(2000—2022)
数据简介 今天我们分享的数据是全球30米分辨率湿地数据集,包含8种湿地亚类,该数据以0.5X0.5的瓦片存储,我们整理了所有属于中国的瓦片名称与其对应省份,方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南
精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南 在数字化营销时代,邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天,我们将深入解析邮件打开率、网站可用性、页面参与时…...
智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
