一直以来我都没有找到一个称心如意的 Go 日志库,从个人角度看来,有的库功能太过单一,有的库接口使用起来不够顺手,有的库专注的点不在自己需要的点上。(好吧,以上都是自己造轮子的借口。)于是,我结合自己近几年的一些想法和实际需求实现了一个(希望)可以让人眼前一亮的 Go 日志库—— gxlog。gxlog 只依赖于标准库,简洁易用、功能丰富、灵活可扩展是它的设计目标。
很多人只需要一些常规日志功能,比如:日志分级,日志信息(时间、文件名、行号、消息等)格式化,日志输出到控制台或文件,日志文件按天保存到子目录,日志文件大小到上限时创建新文件等。
一部分人可能有一些特殊需求,比如:日志格式化为 JSON 等其他格式,日志输出对接 syslog 等后端系统,出错时不仅打印日志还要产生告警事件等。
gxlog 用比较恰当合理的方式同时满足了上述核心需求和扩展需求:对于核心需求用户,gxlog 使用简单方便;对于扩展需求用户,gxlog 能进行灵活定制和扩展。
gxlog 采用了插槽式结构,并且对格式化和输出进行了分离。gxlog 内置 8 个槽,每个槽可放置一个 formatter 和一个 writer,也可闲置。另外,gxlog 整体和每个槽都有独立的 level 和 filter。这样,日志格式和输出方式就可以灵活搭配,比如:槽 1 放 text formatter 和 file writer,槽 2 放 json formatter 和 syslog writer,槽 3 放 text formatter 和 file writer,但是 level 设置为 Error,额外单独保存错误日志。
另外,有需要的用户也可把 event 或 hook 集成进 gxlog,比如:实现一个自定义 formatter,用来发送事件通知,然后把自定义的 formatter 和一个 null writer 放到槽 4,可选地设置槽 4 的 level 或 filter,这样就能在输出日志的同时进行一些额外的操作。
formatter 方面,gxlog 内置了:
writer 方面,gxlog 内置了:
另外,gxlog 还提供了一些“酷炫”功能:
最后,gxlog 还提供了一些方便使用的辅助方法:
项目目前已经有了比较高的完成度,其中有详细的文档和使用示例。_examples 目录下的示例可以"go run"看效果。欢迎大家试用、提建议、做贡献。感觉项目合自己胃口的,请猛击 Star 。 项目地址: https://github.com/gxlog/gxlog
后面预计会增加一些配套工具,如压缩加密的日志文件的解压解密、为之前未染色的日志增加染色。根据配置文件初始化日志实例的功能目前也在考虑。
题外话:vim (通过插件)和 emacs (内置命令支持)都是可以解析转义序列表示的颜色的,有需要的不妨也为要写入文件的日志打开染色功能,让眼睛更轻松。
几张跑示例的截图:
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.