slogmask 是一个轻量的 Go 敏感信息脱敏库,专注日志、JSON、map、struct 和标准库 log/slog 场景。
它适合放在服务端日志出口层,避免手机号、邮箱、身份证、银行卡、Token、密码、密钥等敏感信息被直接写入日志。
- 字符串脱敏:手机号、邮箱、身份证、银行卡、Bearer Token、常见 API Token
- 结构化数据脱敏:
map[string]any、struct、slice、JSON log/slogHandler:日志写出前自动脱敏- 敏感字段名识别:
password、token、secret、authorization、api_key、ak、sk等 - 支持自定义规则和自定义敏感字段
- 零三方运行时依赖
go get github.com/rhecs/slogmaskpackage main
import (
"fmt"
"github.com/rhecs/slogmask"
)
func main() {
out := slogmask.String("phone=13800138000 email=alice@example.com")
fmt.Println(out)
// phone=138****8000 email=a****e@example.com
}更多示例:
package main
import (
"log/slog"
"os"
"github.com/rhecs/slogmask"
)
func main() {
logger := slog.New(slogmask.NewHandler(slog.NewJSONHandler(os.Stdout, nil)))
logger.Info(
"user login",
"phone", "13800138000",
"password", "secret",
"authorization", "Bearer abcdefghijklmnopqrstuvwxyz",
)
}输出中的 phone 会保留必要定位信息,password 和 authorization 会被完整替换为 ****。
data := []byte(`{
"user": {
"email": "alice@example.com",
"phone": "13800138000"
},
"access_token": "secret-token"
}`)
out, err := slogmask.JSON(data)
if err != nil {
panic(err)
}
fmt.Println(string(out))type User struct {
Name string `json:"name"`
Phone string `json:"phone"`
Password string `json:"password"`
}
safe := slogmask.Value(User{
Name: "Alice",
Phone: "13800138000",
Password: "secret",
})struct 会按 json tag 输出为 map[string]any,未导出字段会被跳过。
m := slogmask.New(slogmask.WithRule(slogmask.Rule{
Name: "order_id",
Pattern: regexp.MustCompile(`ORD-\d{6}`),
Mask: func(s string) string {
return "ORD-****"
},
}))
fmt.Println(m.String("order=ORD-123456"))m := slogmask.New(slogmask.WithSensitiveKeys("session_id", "tenant_secret"))
safe := m.Map(map[string]any{
"session_id": "abc",
"name": "Alice",
})| 类型 | 示例 | 结果 |
|---|---|---|
| 中国大陆手机号 | 13800138000 |
138****8000 |
| 邮箱 | alice@example.com |
a****e@example.com |
| 中国居民身份证 | 110101199003071234 |
110101****1234 |
| 银行卡 | 6222020202020202020 |
6222****2020 |
| Bearer Token | Bearer abcdefghijklmnopqrstuvwxyz |
Bearer abc****wxyz |
| 敏感字段值 | password=secret |
password=**** |
slogmask 不尝试判断所有业务语义,只在两类场景做确定性处理:
- 值本身有明显敏感格式,例如手机号、邮箱、身份证、银行卡、Token。
- 字段名明显敏感,例如
password、authorization、secret_key。
这样可以降低误伤,同时覆盖日志泄露中最常见的问题。
go test ./...
go test -bench=. ./...也可以使用:
make check
make bench内置规则说明见 docs/rules.md。
v0.1.x:稳定字符串、JSON、map、struct 和slogHandlerv0.2.x:增加更多地区化规则和更细粒度的规则开关v0.3.x:补充常见日志框架适配器
MIT