日志模块重构
[toc]
新老板兼容问题
- 首先 由于新版使用了自己开发的glog包,所以删掉了两个启动参数:
// "--stderrthreshold", "INFO",
// "--color", "true",
- 如果要继续使用elk的配置:
// env 文件中:
GRAYLOG_ADDR= // 不赋值即可
// docker-compose 文件中:
// static message game gateway 服务里的 logging 字段(跟原来一致) :
logging:
driver: "fluentd"
options:
fluentd-address: ${DOCKER_LOG_FLUENTD_HOST}:${DOCKER_LOG_FLUENTD_PORT}
# fluentd-async: "true"
tag: docker.service.gateway
- 如果使用graylog的配置:
// env 文件中:
GRAYLOG_ADDR=127.0.0.1:12201 // 赋值
// docker-compose 文件中:
// static message game gateway 服务里的 logging 字段(跟原来一致) :
logging:
driver: "gelf"
options:
gelf-address: udp://${GRAYLOG_ADDR}
tag: docker.service.gateway
日志流转图
大致解释下: 数据从 input 进入 通过各个streams以及default stream, 最终落库Index. 在streams上绑定的有告警模块(可配置多个),告警模块http回调告警服务. 告警服务负责组织消息推送到钉钉告警群.
graylog使用
本节内容以演示为主.
新版glog
原本是想改造glog包的,折腾了一天. 感觉改造别人的包很不方便. 所以就重写了glog包,包名还是glog. 提供了更方便易用的接口.
- 测试容器: docker run --log-driver=gelf --log-opt gelf-address=udp://192.168.10.35:tag=redis -p 6379:6379 --name my_redis -v /data/redis/redis.conf:/etc/redis/redis.conf -v /data/redis/data:/var/redis_data redis redis-server /etc/redis/redis.conf --appendonly yes
-
测试http curl -XPOST http://192.168.10.35:12201/gelf -p0 -d '{"short_message":"Hello there 5", "host":"example.org", "tag":"test_curl", "_foo":"bar"}'
- 查询条件语法
// 1 日志里面包含 目标字符串
something
// 2 日志里面包含 目标字符串中任何一个
cloud apex // 等于 cloud OR apex
// 3 目标字符串中包含空格要用引号
"cloud apex"
// 4 通配符
source:*.org
source:exam?le.org
source:exam?le.*
// 5 字段匹配
level:1 // level 的值 = 1
level:>0
level:<4
level:>=1
level:<=4
level:{400 TO 404} // 不包含 400 和 404
level:[0 TO 64} // 包含 0
日志等级
大家参考使用:
等级(枚举) | lv | lv_name | 描述&使用场景 |
---|---|---|---|
ELL_Trace | 0 | TRC | 用于记录函数调用轨迹,或者理解为比Debug级别更低的一种级别. |
ELL_Debug | 1 | DBG | 用于功能调试日志输出.通常用于排查问题,定位问题时使用,用完后及时删除相关日志代码 |
ELL_Infos | 2 | INF | 用于记录更有价值的事件输出. |
ELL_Warns | 3 | WRN | 用户输出程序警告类日志 |
ELL_Error | 4 | ERR | 用于记录错误类日志 |
ELL_Fatal | 5 | FAL | 用于记录程序退出日志.遇到此级别日志,程序会自动退出. |
日志效果
控制台里面的效果,颜色,格式,间隙行...
日志使用(接口)
// import
"gddserver/internal/pkg/glog"
// 日志输出-基本版
func Trace(format string, v ...interface{}) // 格式化输出日志+默认栈基本信息
func Tracev(v ...interface{}) // 多变量输出日志+默认栈基本信息
func TraceD(depth int, format string, v ...interface{}) // 格式化输出日志+指定深度栈基本信息
func TraceDv(depth int, v ...interface{}) // 多变量输出日志+指定深度栈基本信息
func Tracef(format string, v ...interface{}) // 格式化输出日志
func Traceln(v ...interface{}) // 多变量输出日志
// 其他级别的日志接口 同理,这里就不列全了.
// 日志输出-扩展版
myModuleLogger:=glog.Field("user_id","xxxx") // 构造一个ILoger对象,带自定义的字段和值
myModuleLogger.Debug(...)
myModuleLogger.Warn(...)
myModuleLogger.Error(...)
... // 这些日志输出时都会带上user_id的k-v键值对上报给graylog. 到时候到graylog中查询的时候就可以对user_id进行分组等方便快速的查找日志了.
// ILoger 接口提供的方法:
Field(field string, val interface{}) ILoger // 相比基本版多了Field方法的扩展,也就是说可以挂多个k-v对.
// TRACE
Trace(format string, v ...interface{}) // 格式化输出日志+默认栈基本信息
Tracev(v ...interface{}) // 多变量输出日志+默认栈基本信息
TraceD(depth int, format string, v ...interface{}) // 格式化输出日志+指定深度栈基本信息
TraceDv(depth int, v ...interface{}) // 多变量输出日志+指定深度栈基本信息
// 其他级别的日志接口 同理,这里就不列全了.
// 日志输出-我想把某条日志显示在'运维监控'钉钉群里面
myAlertLogger := glog.Alert()
myAlertLogger.Debug(...) // 输出的内容就可以显示在'运维监控'里面.
合并代码冲突问题.
新的glog包的日志输出方法跟老的glog包有一定差异,所以大家在合并代码时候可能会发生冲突或者编译报错的问题.接下来我们看如何修改问题:
1 确保你的 go.mod 里面已经不再引入 "github.com/golang/glog" 包了.
2 尝试编译让他报错,主要报错的二个方法:
- a glog.Error() 自己调整下更换为 glog.Errorv or glog.Errorln
- a glog.Info() 自己调整下更换为 glog.Errorv or glog.Errorln
graylog安装
先up一把,自动创建相关目录,然后赋予权限,然后再up一次
chmod -R 777 data_graylog_journal data_elasticsearch
开发或者个人环境
docker-compose.yml
version: '3'
services:
mongo:
image: mongo:4.2
volumes:
- "./data_mongo:/data/db"
networks:
- graylog_net
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
volumes:
- "./data_elasticsearch:/usr/share/elasticsearch/data"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 2g
networks:
- graylog_net
graylog:
image: graylog/graylog:4.2
environment:
- GRAYLOG_PASSWORD_SECRET=wVJsl0o1k7hQygMH
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
- GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.0.155:9000/
- GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 -- /docker-entrypoint.sh
volumes:
- "./data_graylog_journal:/usr/share/graylog/data/journal"
networks:
- graylog_net
restart: always
depends_on:
- mongo
- elasticsearch
ports:
# Graylog web interface and REST API
- 9000:9000
# Syslog TCP
- 1514:1514
# Syslog UDP
- 1514:1514/udp
# GELF TCP
- 12201:12201
# GELF UDP
- 12201:12201/udp
networks:
graylog_net:
driver: bridge
生产环境
version: '3'
services:
mongo:
image: mongo:4.2
restart: on-failure
container_name: graylog_mongo
volumes:
- "./data_mongo:/data/db"
networks:
- graylog_net
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2
restart: on-failure
container_name: graylog_es
volumes:
- "./data_elasticsearch:/usr/share/elasticsearch/data"
environment:
- http.host=0.0.0.0
- transport.host=localhost
- network.host=0.0.0.0
- "ES_JAVA_OPTS=-Xms512m -Xmx512m"
ulimits:
memlock:
soft: -1
hard: -1
deploy:
resources:
limits:
memory: 4g
networks:
- graylog_net
graylog:
image: graylog/graylog:4.2
restart: on-failure
container_name: graylog_main
volumes:
- "./data_graylog_journal:/usr/share/graylog/data/journal"
environment:
- GRAYLOG_PASSWORD_SECRET=wVJsl0o1k7hQygMH
- GRAYLOG_ROOT_PASSWORD_SHA2=8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
- GRAYLOG_HTTP_EXTERNAL_URI=http://192.168.1.191:9000/
- GRAYLOG_ROOT_TIMEZONE=Asia/Shanghai
entrypoint: /usr/bin/tini -- wait-for-it elasticsearch:9200 -- /docker-entrypoint.sh
networks:
- graylog_net
depends_on:
- mongo
- elasticsearch
ports:
# Graylog web interface and REST API
- 9000:9000
# Syslog1 TCP
- 5101:5101
# Syslog1 UDP
- 5101:5101/udp
# Syslog2 TCP
- 5102:5102
# Syslog2 UDP
- 5102:5102/udp
# GELF Http1
- 5201:5201
# GELF Http1
- 5202:5202
# GELF TCP1
- 5301:5301
# GELF UDP1
- 5301:5301/udp
# GELF TCP2
- 5302:5302
# GELF UDP2
- 5302:5302/udp
# GELF TCP3
- 5303:5303
# GELF UDP3
- 5303:5303/udp
# GELF TCP4
- 5304:5304
# GELF UDP4
- 5304:5304/udp
# GELF TCP5
- 5305:5305
# GELF UDP5
- 5305:5305/udp
networks:
graylog_net:
driver: bridge
告警服务安装
docker run -d -p 3838:3838 --name gdd_alert cloudapex/u.alert:1.0