Skip to content

一个golang实现的日志中心glogcenter,简称GLC,资源占用低,性能高。作为传统ELK的替代方案,上至央企大项目下至本地开发调试,已历经众多案例磨炼,表现稳定出色,达生产级别应用要求。

License

gotoeasy/glogcenter

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

缘起

昔者,吾日志中心之事,恒用传统三件套,曰ELK,然岁月流转,如行舟江河,难免潮涌沉浮,不维其盛,则不足以久存。故见诸多不如意,如定制之难,如索引之弗易,如初启之迟缓如蜗牛,如操作之陌生如他邦,如资甚之贪婪如饕餮之兽,如崩溃之险如山崩川竭,疑难重重,如堆积之沙石。

终有一日,愈发执志,以go之巧工,铸造新日志中心,其表现多舛,实足以令人惊艳,是以,赋名曰glogcenter,亦称GLC,开仓建库。

当下,架库之作已可窥见,与君共享。
(以上由GPT编辑)



国外仓库地址: https://github.com/gotoeasy/glogcenter
国内(仅同步): https://gitee.com/gotoeasy/glogcenter

演示地址(网络可能不稳定): https://glc.gotoeasy.top

特点

  • 使用golang实现,具备go的各种特性优势,特别【节省资源】
  • 基于LSMT存储,融合日志写多读少的特点进行实现,毫秒级查询响应 【性能卓越】
  • 日志吞食量每秒近万条,闲时建索引每秒数千条,满足大多项目场景 【广泛适用】
  • 支持多关键词全文检索,支持多维度线索查询,支持定位相邻查询 【功能丰富】
  • 内置提供VUE实现的查询管理界面,页面简洁大方,操作习惯自然 【体验优秀】
  • 提供docker镜像,支持容器化部署,支持个性化环境变量配置 【部署方便】
  • 提供java/go/python等客户端工具包,日志收集信手拈来 【集成简单】
  • 支持登录验证,秘钥校验,权限控制,黑白名单等安全设定 【安全可靠】
  • 支持多服务集群模式部署,提供服务稳定性保障、数据冗余性保障 【高可用保障】
  • 上至央企大项目下至本地调试,已历经众多案例磨炼,表现出色 【生产级别品质】

docker单机部署模式简易示例

# 快速体验(其中通过GLC_TEST_MODE=true开启测试模式,页面上会显示生成测试数据的按钮,方便测试或快速体验)
docker run -d -p 8080:8080 -e GLC_TEST_MODE=true gotoeasy/glc

# 外挂数据目录
docker run -d -p 8080:8080 -v /glc:/glogcenter gotoeasy/glc

# 【简易用法】
# 启动成功后即可按 http://ip:port 访问
# 支持多关键词检索,比如输入【key1、key2、key3】检索出同时满足这3个关键词的结果
# 默认每次检索100条,滚动到底部时自动检索后面100条

docker集群部署模式简易示例

# 以下3台以集群方式启动,配置本节点地址及关联节点地址即可
# 采用“乐观集群”方式,简易选主(简单排序)+日志群发(忽略失败)+数据补偿(隔日同步历史数据)

# 服务1
docker run -d -p 8080:8080 -e GLC_CLUSTER_MODE=true -e GLC_SERVER_URL=http://172.27.59.51:8080 \
       -e GLC_CLUSTER_URLS=http://172.27.59.51:8080;http://172.27.59.52:8080;http://172.27.59.53:8080 \
       gotoeasy/glc
# 服务2
docker run -d -p 8080:8080 -e GLC_CLUSTER_MODE=true -e GLC_SERVER_URL=http://172.27.59.52:8080 \
       -e GLC_CLUSTER_URLS=http://172.27.59.51:8080;http://172.27.59.52:8080;http://172.27.59.53:8080 \
       gotoeasy/glc
# 服务3
docker run -d -p 8080:8080 -e GLC_CLUSTER_MODE=true -e GLC_SERVER_URL=http://172.27.59.53:8080 \
       -e GLC_CLUSTER_URLS=http://172.27.59.51:8080;http://172.27.59.52:8080;http://172.27.59.53:8080 \
       gotoeasy/glc

docker启动环境变量

  • GLC_STORE_NAME_AUTO_ADD_DATE日志仓是否自动按日存储,默认true
  • GLC_SAVE_DAYS日志仓按日存储自动维护时的保留天数(有效范围0~1200),0表示不自动删除,默认180
  • GLC_SEARCH_MULIT_LINE,是否对日志列的全部行进行索引检索,默认false仅第一行
  • GLC_ENABLE_LOGIN是否开启用户密码登录功能,默认false
  • GLC_USERNAME管理员用户名,默认glc,从0.13.0版本开始,管理员有新增用户及权限管理功能,并且有全部系统的查询权限
  • GLC_PASSWORD管理员密码,默认GLogCenter100%666
  • GLC_TOKEN_SALT用以生成令牌的字符串令牌盐,开启登录功能时建议设定提高安全性,默认空白
  • GLC_ENABLE_SECURITY_KEY日志添加的接口是否开启API秘钥校验,默认false
  • GLC_HEADER_SECURITY_KEYAPI秘钥的header键名,默认X-GLC-AUTH
  • GLC_SECURITY_KEYAPI秘钥,默认glogcenter
  • GLC_ENABLE_CORS是否允许跨域,默认false
  • GLC_PAGE_SIZE每次检索件数,默认100(有效范围1~1000
  • GLC_ENABLE_WEB_GZIP网页服务是否开启压缩,默认false
  • GLC_ENABLE_AMQP_CONSUME是否开启rabbitMq消费者接收日志,默认false
  • GLC_AMQP_ADDR消息队列rabbitMq连接地址,例:amqp://user:password@ip:port/,默认空白
  • GLC_AMQP_JSON_FORMAT消息队列rabbitMq消息文本是否为json格式,默认true
  • GLC_CLUSTER_MODE是否集群模式启动,默认false
  • GLC_SERVER_URL集群模式时的本节点服务地址,默认空白
  • GLC_CLUSTER_URLS集群模式时的关联节点服务地址,多个时;分隔,默认空白
  • GLC_GOMAXPROCS使用最大CPU数量,值不在实际范围内时按最大值看待,默认最大值,常用于docker方式
  • GLC_TEST_MODE是否开启测试模式,开启时显示生成测试数据的按钮,供测试或快速体验用,默认false
  • GLC_WHITE_LIST白名单,多个用逗号分隔,黑白名单冲突时白名单优先,默认空白。可设定IP,最后段支持通配符,如1.2.3.*,内网IP默认都是白名单不必设定,实验性质的支持区域名称(因为IP地域查询可能有误差),如上海市,深圳市
  • GLC_BLACK_LIST黑名单,多个用逗号分隔,黑白名单冲突时白名单优先,默认空白。可设定IP,最后段支持通配符,如1.2.3.*,也支持单个通配符*代表全部(也就是只允许内网或白名单指定使用),实验性质的支持区域名称(因为IP地域查询可能有误差)
  • GLC_IP_ADD_CITY对IP字段是否自动附加城市信息,默认false
  • GLC_NEAR_SEARCH_SIZE定位相邻检索时的检索件数,默认200,有效范围50-1000
  • GLC_ENABLE_CHATAI是否开启GLC智能助手,默认true,会在菜单栏显示

接口

  • /glc/v1/log/add日志添加,POSTapplication/json
    字段system: 字符串,对应页面的系统名
    字段date: 字符串,对应页面的日期时间,格式yyyy-MM-dd HH:mm:ss.SSS
    字段text: 字符串,对应页面的日志
    字段servername: 字符串,对应页面的主机名
    字段serverip: 字符串,对应页面的主机IP
    字段loglevel: 字符串,对应页面的日志级别
    字段traceid: 字符串,对应页面的追踪码
    字段clientip: 字符串,对应页面的客户端IP
    字段user: 字符串,对应页面的用户
# 发送测试数据的参考脚本
# 注意时间格式要一致,否则按时间范围检索可能无法得到预想结果
curl -X POST -d '{"system":"demo", "date":"2023-01-01 01:02:03.456","text":"demo log text"}' \
     -H "Content-Type:application/json" http://127.0.0.1:8080/glc/v1/log/add

使用logbackjava项目,支持日志收集,确保主次版本和GLC版本一致

<!-- pom坐标 -->
<dependency>
    <groupId>top.gotoeasy</groupId>
    <artifactId>glc-logback-appender</artifactId>
    <version>0.14.2</version>
</dependency>
<!-- logback配置例子1,发送至 glogcenter -->
<appender name="GLC" class="top.gotoeasy.framework.glc.logback.appender.GlcHttpJsonAppender">
    <glcApiUrl>http://127.0.0.1:8080/glc/v1/log/add</glcApiUrl> <!-- 可通过环境变量 GLC_API_URL 设定 -->
    <glcApiKey>X-GLC-AUTH:glogcenter</glcApiKey>                <!-- 可通过环境变量 GLC_API_KEY 设定 -->
    <system>demo</system>                                       <!-- 可通过环境变量 GLC_SYSTEM 设定 -->
    <layout>
        <pattern><![CDATA[%m %n]]></pattern>
    </layout>
</appender>
<!-- logback配置例子2,发送至 rabbitmq -->
<appender name="GLC" class="top.gotoeasy.framework.glc.logback.appender.GlcAmqpAppender">
    <amqpHost>127.0.0.1</amqpHost>                <!-- 可通过环境变量 GLC_AMQP_HOST 设定 -->
    <amqpPort>5672</amqpPort>                     <!-- 可通过环境变量 GLC_AMQP_PORT 设定 -->
    <amqpUser>rabbitmqUsername</amqpUser>         <!-- 可通过环境变量 GLC_AMQP_USER 设定 -->
    <amqpPassword>rabbitmqPassword</amqpPassword> <!-- 可通过环境变量 GLC_AMQP_PASSWORD 设定 -->
    <system>Demo</system>                         <!-- 可通过环境变量 GLC_SYSTEM 设定 -->
    <layout>
        <pattern><![CDATA[%m %n]]></pattern>
    </layout>
</appender>
<!-- 一个简单的logback-spring.xml配置例子 -->
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
    <appender name="CONSOLE"
        class="ch.qos.logback.core.ConsoleAppender">
        <Target>System.out</Target>
        <encoder>
            <pattern>%d-%c-%t-%5p: %m%n</pattern>
        </encoder>
    </appender>

    <appender name="GLC" class="top.gotoeasy.framework.glc.logback.appender.GlcHttpJsonAppender">
        <glcApiUrl>http://127.0.0.1:8080/glc/v1/log/add</glcApiUrl>
        <system>demo</system>
        <layout>
            <pattern><![CDATA[%m %n]]></pattern>
        </layout>
    </appender>

    <root level="DEBUG">
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="GLC" />
    </root>
</configuration>

使用golang语言的项目,提供工具包,开箱即用

# 方式1)通过环境变量自动配置,程序直接使用cmn.Debug(...)写日志即可
export GLC_ENABLE=true # 此配置默认false,要发送日志中心必须配置为true
export GLC_ENABLE_CONSOLE_LOG=true # 默认true,控制台不打印时配置为false
export GLC_API_URL='http://127.0.0.1:8080/glc/v1/log/add' # 未配置时将取消发送
export GLC_API_KEY='X-GLC-AUTH:glogcenter' # 这是默认值,按需修改
export GLC_SYSTEM=default  # 默认default,按需修改
export GLC_LOG_LEVEL=debug # 日志级别(debug/info/warn/error)
export GLC_TRACE_ID=12345  # 默认空,跨进程调用等一些特殊场景使用
export GLC_PRINT_SRC_LINE=true # 是否打印源码行号,go语言专用,默认false
// 方式2) 使用前通过程序cmn.SetGlcClient(...)手动配置初始化
import "github.com/gotoeasy/glang/cmn"

func main() {
    // 这里用手动初始化替代环境变量自动配置方式,更多选项详见GlcOptions字段说明
    cmn.SetGlcClient(cmn.NewGlcClient(&cmn.GlcOptions{
        ApiUrl:      "http://ip:port/glc/v1/log/add",
        Enable:      true,
    }))

    cmn.Debug("这是Debug级别日志")
    cmn.Info("这是Info级别日志", "多个参数", "会被拼接")
    gd := &cmn.GlcData{TraceId: "1234567890"} // 跟踪码相同的日志,传入该参数即可
    cmn.Warn("这里的GlcData类型参数都不会打印", "gd只起传值作用", gd)
    cmn.Error("gd参数顺序无关", gd, "用法如同log库,但对GlcData做了特殊的判断处理")
    cmn.WaitGlcFinish() // 停止接收新日志,等待日志都发送完成,常在退出前调用
}

使用python语言的项目,提供工具包,开箱即用

# 支持以下环境变量配置
export GLC_ENABLE=true # 默认false,要发送日志中心必须配置为true
export GLC_ENABLE_CONSOLE_LOG=true # 默认true,控制台不打印时配置为false
export GLC_API_URL='http://127.0.0.1:8080/glc/v1/log/add' # 未配置时将取消发送
export GLC_API_KEY='X-GLC-AUTH:glogcenter' # 这是默认值,按需修改
export GLC_SYSTEM=default  # 默认default,按需修改
export GLC_LOG_LEVEL=debug # 日志级别(debug/info/warn/error),默认debug
export GLC_TRACE_ID=12345  # 默认空,跨进程调用等一些特殊场景使用
# 安装
pip install glogcenter

# 使用
from glogcenter import glc

glc.debug("这是Debug级别日志")
glc.info("这是Info级别日志", "多个参数", "会被拼接")
gd = glc.GlcData()
gd.user = 'abcd'
glc.warn("这里的GlcData类型参数都不会打印", "gd只起传值作用", gd)
glc.error("gd参数顺序无关", gd, "用法如同log库,但对GlcData做了特殊的判断处理")

更新履历

开发版latest

  • 日志审计、告警
  • 集群支持动态删减节点(或是页面管理删除)

版本0.15.1

  • 新增GLC智能助手,可以随时解答日志中心的相关问题
  • 修复#38:系统名大小写可能引起筛选不起作用

版本0.15.0

  • 新增定位相邻检索功能,非常适合快速定位进行上下文查询的场景。相应增加GLC_NEAR_SEARCH_SIZE参数,配置定位相邻检索时的检索件数,默认200,有效范围50-1000
  • 新增Python客户端工具包,方便Python语言的项目接入日志中心
  • 修复一些已知问题
更多历史版本更新履历

版本0.14.2

  • 修复#32 隐蔽的权限控制错误问题

版本0.14.1

  • 新增GLC_IP_ADD_CITY环境变量,对IP字段是否自动附加城市信息,默认false
  • 工具包优化取主机IP地址逻辑(优先eth0网卡内网地址),glc-logback-appender同步升级

版本0.14.0

  • 日志新增用户字段,界面新增用户的精确检索条件,当要做特定用户维度的日志审计时,这会显得非常实用
  • glc-logback-appender同步升级,新增MDC存取用户的接口
  • 修复已知问题

版本0.13.0

  • 新增用户及系统权限管理,仅管理员能操作,可控制指定用户只能访问指定系统的日志,多系统共用且有数据安全需求时尤显重要
  • 升级使用Go1.21.4进行编译

版本0.12.4

  • 新增会话超时GLC_SESSION_TIMEOUT环境变量,单位为分钟,默认30分钟
  • 优化检索性能,部分多选日志级别的场景,性能改善明显

版本0.12.3

  • 新增跨仓检索支持,分仓模式下有时需要逐个检索日志仓进行确认,确实累人。现在只要清空日志仓条件再选择日期范围,就可以轻松的查取目标数据
  • 改善操作体验,修改页面检索条件后再滚动查询时仍旧是按原条件查询,避免新旧条件不同引发令人困惑的查询结果

版本0.12.2

  • 安全无小事,继续加固,连续登录失败5次后,锁定15分钟限制登录
  • 新加白名单GLC_WHITE_LIST环境变量,多个用逗号分隔,黑白名单冲突时白名单优先,默认空白。可设定IP,最后段支持通配符,如1.2.3.*,内网IP默认都是白名单不必设定,实验性质的支持区域名称(因为IP地域查询可能有误差),如上海市,深圳市
  • 新加黑名单GLC_BLACK_LIST环境变量,多个用逗号分隔,黑白名单冲突时白名单优先,默认空白。可设定IP,最后段支持通配符,如1.2.3.*,也支持单个通配符*代表全部(也就是只允许内网或白名单指定使用),实验性质的支持区域名称(因为IP地域查询可能有误差)

版本0.12.1

  • 新增GLC_TOKEN_SALT令牌盐环境变量,默认空串。如果日志内容比较敏感,应该修改用户密码开启登录功能,同时建议设定令牌盐,提高系统安全性
  • 新增GLC_TEST_MODE是否开启测试模式的开关,开启后将显示生成测试数据用的按钮,供测试或快速体验用,默认false
  • 优化改善

版本0.12.0

  • 增加配置开关GLC_SEARCH_MULIT_LINE,设定为true时,支持对日志列的全部行进行索引和检索,默认false。注意:不会对历史数据进行重新索引,也就是说,设定为true时,新加入的日志会做多行索引,但历史数据如果没有多行索引的仍旧没法进行多行检索
  • 同步升级glc-logback-appender,增加过滤器类GlcFilter用以生成客户端IP和跟踪码,可按需配置使用

版本0.11.7

  • 增加支持开始/停止自动查询,观察实时日志时实用

版本0.11.6

  • 升级使用Go1.21.3,一波安全更新
  • 增加robots.txt,拒绝爬虫爬取内容
  • 其他一些细节改善

版本0.11.5

  • 升级使用Go1.21.1
  • 更新升级依赖包,避免潜在问题
  • 前端页面细节改善

版本0.11.4

  • 支持日志级别多选条件,想排除某种级别进行检索时会很实用
  • 改善前端进一步提高使用体验

版本0.11.3

  • 保留页面中表格的配置,避免再次访问或刷新时自动重置

版本0.11.2

  • 支持下载保存当前检索结果

版本0.11.1

  • 升级使用Go1.21.0
  • 运行时基础镜像alpine升级至3.18
  • 页面检索件数提示信息改善

版本0.11.0

  • 前端全面重构改良,支持表格列宽、位置、显示隐藏等各种个性化设定
  • 新增GLC_ENABLE_CORS参数配置是否允许跨域,默认false,方便系统间对接
  • 新增GLC_PAGE_SIZE参数配置每次检索件数,默认100(有效范围1~1000

版本0.10.2

  • 修复issue #16的查询BUG

版本0.10.1

  • 添加支持日志级别展示列及过滤条件,需同步使用glc-logback-appender:0.10.1
  • 添加支持客户端IP展示列,基于MDC实现,Java项目需参考使用MdcUtil类
  • 添加支持TraceId展示列,基于MDC实现,Java项目需参考使用MdcUtil类

版本0.10.0

  • 页面优化:系统名检索条件可选择输入,可以不用敲打了
  • 页面增加主机名、主机IP展示列,可配置是否显示,适用更多复杂使用场景
  • 同步使用glc-logback-appender:0.10.0,即可自动产生主机名、主机IP信息
  • 修复一些小瑕疵

版本0.9.0

  • 增加分类(系统)检索条件,支持多系统时准确筛选
  • 修复一些小瑕疵

版本0.8.8

  • 增加时间范围检索条件
  • 界面进一步简化优化

版本0.8.7

  • 修复:增加特殊字符转换处理,避免日志中的html标签字样无法显示
  • 修复:docker restart 失败问题

版本0.8.6

  • 升级使用Go1.20,更优秀的编译和运行时,进一步减少内存开销,进一步提高整体CPU性能

版本0.8.5

  • 后端配合前端路由,设定自动跳转改善使用体验

版本0.8.4

  • 代码整理优化,前后端升级依赖包
  • golang编译器升级至1.19.4
  • 运行时基础镜像alpine升级至3.17

版本0.8.3

  • 增加CPU使用限制的配置GLC_GOMAXPROCS,默认使用最大CPU数量,通常非docker启动方式使用
  • 代码优化,升级依赖包

版本0.8.2

  • 优化部分场景下的检索性能
  • 修复一些小问题

版本0.8.1

  • 代码重构改善
  • 支持日志级别配置GLC_LOG_LEVEL,可设定值为debug/info/warn/error,默认info

版本0.8.0

  • 集群支持动态扩增节点,日志自动转发
  • 集群支持自动选举Master
  • 隔日之前的历史日志仓自动检查同步

版本0.7.0

  • 增加日志转发功能,支持多服务集群模式部署,确保服务及数据保存的冗余性

版本0.6.0

  • 升级使用Go1.19
  • 优化执行文件体积,此版本考虑直接运行发布,以适用更多部署场景
  • 支持命令行参数使用-v查看版本
  • 在Linux系统下支持命令行参数使用-d以后台方式启动
  • 在Linux系统下支持命令行参数使用stop停止程序
  • 在Linux系统下支持命令行参数使用restart重启程序
  • logbackjar包,支持通过设定环境变量GLC_ENABLE=false关闭日志发送功能

版本0.5.0

  • 增加用户密码登录功能,可设定是否开启用户密码登录
  • 日志按日分仓存储时,默认自动维护保存最多180天,自动维护时不能手动删除日志仓
  • 改善日志仓管理页面的展示
  • 删除旧版接口/glc/add/glc/searchmaven公共仓库包同步修改并更新版本
  • Docker镜像设定默认时区Asia/Shanghai

版本0.4.0

  • 添加相应版本的maven公共仓库包,java项目日志可推至RabbitMQ
  • 添加RabbitMQ简单模式消费者,开启后能从RabbitMQ获取日志
  • 添加服务接口/glc/v1/log/add,接收JSON格式日志以便后续扩展
  • 添加日志仓管理功能,页面支持查看、删除等操作

版本0.3.0

  • 全面重构,不考虑旧版兼容
  • 控制索引文件数,避免大量日志时打开文件过多而崩溃
  • 降低索引文件的磁盘空间占用,优化索引创建速度
  • 检索页面,显示更友好的查询结果提示
  • glc-logback-appender的设定,可通过配置环境变量来覆盖

版本0.2.0

  • DIY了一个logo
  • 接口/glc/add添加system参数
  • 提供简洁的日志查询界面
  • 当前版设计为接收多个项目的日志,界面栏目为分类

初版0.1.0

  • 使用golang实现,就是快
  • 借助goleveldb做数据保存,结合日志写多读少特点稍加设计,真是快
  • 日志量虽大,却是真心节省内存资源
  • 常用的无条件查询最新日志,快到麻木无感
  • 关键词全文检索,支持中文分词,反向索引以空间换时间,快到麻木无感
  • 提供docker镜像支持容器化部署,方便之极
  • 提供java项目日志收集包,日志都发来发来发来
  • 服务接口/glc/add添加日志
  • 服务接口/glc/search查询日志

About

一个golang实现的日志中心glogcenter,简称GLC,资源占用低,性能高。作为传统ELK的替代方案,上至央企大项目下至本地开发调试,已历经众多案例磨炼,表现稳定出色,达生产级别应用要求。

Topics

Resources

License

Stars

Watchers

Forks

Packages

No packages published