乐钱科技

台湾公司文档库


日志模块重构

[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

告警事件规划

页面列表

ITEM_HTML