SkyWalking实现服务日志异常监控

2024-07-06 00:14:46

前言

最近在做skywalking的日志监控,经过在网上查找,发现由于版本不一样,各种失败,记录一下配置,以备以后查询

skywalking 版本为9.7.0-066457b

在logback.xml中添加 skywalking-grpc appender:

1
2
3
4
5
6
7
<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.mdc.TraceIdMDCPatternLogbackLayout">
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%X{tid}] [%thread] %-5level %logger{36} -%msg%n</Pattern>
</layout>
</encoder>
</appender>

默认情况下,SkyWalking只会保存原始的日志数据,不做任何的处理分析,我们修改 config/lal/default.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# The default LAL script to save all logs, behaving like the versions before 8.5.0.
rules:
- name: default
layer: GENERAL
dsl: |
filter {
text {
abortOnFailure false
regexp "(?<timestamp>\\d{8}) (?<traceId>\\w+) (?<thread>\\w+) (?<level>\\w+) (?<msg>.+)"
}

extractor {
tag level: parsed.level
timestamp parsed.time as String, "yyyy-MM-dd HH:mm:ss.SSS"
if (tag("level") == "ERROR") {
metrics {
timestamp log.timestamp as Long
labels level: parsed.level, service: parsed.service, instance: parsed.instance
name "log_exception_count"
value 1
}
}
}
sink {
}
}

注意这里是if语句,在使用parsed.level的时候无法正常提取metrics

定义了日志的解析规则,并成功提取到了 log_exception_count 指标,接着我们定义指标分析规则

1
2
3
4
5
6
[root@localhost skywalking]# cat config/log-mal-rules/default.yaml 
expSuffix: service(['service'], Layer.GENERAL)
metricPrefix: service
metricsRules:
- name: log_count
exp: log_exception_count.sum(['service']).downsampling(SUM)

指定 downsampling 函数为 SUM,这样可以帮助我们计算一分钟内的错误数和,由于是新创建的文件,别忘了在 config/application.yml 中注册该配置文件:

1
2
3
4
5
log-analyzer:
selector: ${SW_LOG_ANALYZER:default}
default:
lalFiles: ${SW_LOG_LAL_FILES:envoy-als,mesh-dp,mysql-slowsql,pgsql-slowsql,redis-slowsql,k8s-service,nginx,default}
malFiles: ${SW_LOG_MAL_FILES:"nginx,default"}

最后我们打开 skywalking-ui,在 dashboard 中添加指标 service_log_count 并验证指标结果正确性

有了指标数据后,我们可以在 config/alarm-settings.yml 添加对应的告警规则,该规则定义如果一分钟内日志异常数量超过 5 就会发出告警信息

1
2
3
4
service_error_log_rule:
expression: sum(service_log_count >5 ) >= 1
period: 2
message: service {name} Error Level number over 5 in 1 minutes of last 2 minutes

配置好以上规则后,我们稍等 1 分钟,便可以在告警记录面板查看到响应的告警信息

在配置好监控告警之后,想增加个认证,通过nginx来搞吧,发现如果在企业微信里每次都输入账号密码,确实很难受,于是有了下面的配置

1
2
3
4
5
6
7
8
9
10
在http里增加
map $http_user_agent $auth_type {
default "Restricted";
"~*WindowsWechat" "off";
}

在server里增加

auth_basic $auth_type;
auth_basic_user_file auth_basic/auth.pass;