一飞开源,介绍创意、新奇、有趣、实用的免费开源应用、系统、软件、硬件及技术,一个探索、发现、分享、使用与互动交流的开源技术社区平台。致力于打造活力开源社区,共建开源新生态!
一个go实现的日志中心 glogcenter,简称GLC,目标是用以替代传统的ELK。
日志中心,一直是用传统的三件套ELK,感激之余,终究还是不理想(定制安装并非简单、页面打开初始化太慢,界面操作不习惯,最主要的是资源占用太厉害,甚至隔段时间就会崩溃),替代品总是找不到。终于,用go试写一个logcenter,结果各种优异表现确实是惊艳到了自己,故起名glogcenter,简称GLC,开仓建库。
目标: 逐步替换线上的ELK。
使用LGPL-3.0开源协议
- 使用golang实现,具备go的各种特性优势,关键是省资源、性能高
- 借助goleveldb做数据保存,结合日志写多读少特点稍加设计,真是快
- 关键词全文检索,支持中文分词(使用jiebago进行分词),毫秒级响应,自然流畅
- 日志吞食量每秒近万条,闲时建索引速度每秒数千条,基本能满足大多项目需要
- 支持个性化环境变量开关控制,支持日志仓自动化维护,灵活省心
- 提供docker镜像,支持容器化部署,方便之极
- 提供java项目日志收集包,java项目闭环支持
- 提供golang项目日志收集包,golang项目闭环支持
- 支持从RabbitMQ收取日志信息,满足更多闭环需求
- 内置提供简洁的VUE实现的日志查询管理界面
- 支持多服务集群模式部署,确保服务及数据的冗余性
# 简单示例 docker run -d -p 8080:8080 gotoeasy/glc # 外挂数据目录 docker run -d -p 8080:8080 -v /glc:/glogcenter gotoeasy/glc
# 以下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
- GLC_STORE_NAME_AUTO_ADD_DATE日志仓是否自动按日存储,默认true
- GLC_SAVE_DAYS日志仓按日存储自动维护时的保留天数(0~180),0表示不自动删除,默认180天
- GLC_ENABLE_LOGIN是否开启用户密码登录功能,默认false
- GLC_USERNAME查询界面登录用的用户名,默认glc
- GLC_PASSWORD查询界面登录用的密码,默认GLogCenter100%666
- GLC_ENABLE_SECURITY_KEY日志添加的接口是否开启API秘钥校验,默认false
- GLC_HEADER_SECURITY_KEYAPI秘钥的header键名,默认X-GLC-AUTH
- GLC_SECURITY_KEYAPI秘钥,默认glogcenter
- 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_LOG_LEVEL日志级别,可设定值为debug/info/warn/error,默认info
- GLC_GOMAXPROCS使用最大CPU数量,设定值不在实际范围内时按最大值看待,默认最大值,通常非docker方式启动使用
- 支持命令行参数-v查看版本
- 在Linux系统下支持命令行参数-d以后台方式启动
- 在Linux系统下支持命令行参数stop关闭程序
- 在Linux系统下支持命令行参数restart重启程序
- 服务端口可通过环境变量GLC_SERVER_PORT设定,默认8080
- 其他环境变量同以上docker启动环境变量
- /glc/v1/log/add日志添加,POST,application/json
- 字段system: 字符串,对应页面的分类
- 字段date: 字符串,对应页面的日期时间
- 字段text: 字符串,对应页面的日志内容
<!-- pom坐标 --> <dependency><groupId>top.gotoeasy</groupId><artifactId>glc-logback-appender</artifactId><version>0.8.0</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[%p %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[%p %m %n]]></pattern></layout> </appender>
# 引入工具包 go get github.com/gotoeasy/glang # 按需设定环境变量 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=demo export GLC_ENABLE=true export GLC_LOG_LEVEL=debug # 日志级别(trace/debug/info/warn/error/fatal) // 方式1: 通过 cmn.Debug(...)、cmn.Info(...)等方式,打印日志的同时发送至日志中心 // 方式2: 通过 cmn.NewGLogCenterClient()创建客户端对象后使用 // 更多内容详见文档 https://pkg.go.dev/github.com/gotoeasy/glang import "github.com/gotoeasy/glang/cmn" func main() { cmn.Info("启动WEB服务") err := cmn.NewFasthttpServer().Start() if err != nil { cmn.Fatalln("启动失败", err) } }