27 个版本

0.52.11 2024 年 1 月 23 日
0.52.1 2023 年 9 月 18 日
0.50.0 2022 年 10 月 6 日
0.10.1 2022 年 5 月 27 日

65命令行工具 中排名

Download history 298/week @ 2024-03-13 23/week @ 2024-03-20 5/week @ 2024-03-27 6/week @ 2024-04-03

每月 149 次下载

Apache-2.0

8.5MB
3.5K SLoC

AsciiDoc 2.5K SLoC Rust 760 SLoC // 0.0% comments BASH 91 SLoC Ruby 49 SLoC // 0.1% comments PowerShell 46 SLoC Shell 45 SLoC Elvish 43 SLoC Go 3 SLoC

codecov Version AUR CICD pre-commit

snazy - 一个漂亮的日志查看器

Snazy 是一个简单的工具,用于解析 JSON 或其他类型的日志,并以漂亮的格式和颜色输出。

作为一个经常需要深入查看 controller/webhook 日志的 tektonpipelines-as-code 开发者,我想要一个稍微容易看一眼并能轻松识别错误/信息/警告语句的工具。

您不必仅将其与 tekton 一起使用,它还可以很好地与使用 go-uber-zap 库的项目(如 knative 和许多其他项目)一起使用。

如果需要流式传输日志并在正则表达式匹配上有“操作”或“高亮显示”,则它也可以作为一个超级 tail 一样使用。

屏幕截图

screenshot

安装

二进制文件

转到 发布 页面,下载针对您平台的目标存档或包。

Homebrew

brew tap chmouel/snazy https://github.com/chmouel/snazy
brew install snazy

Crates.io

cargo install snazy

Arch

使用您喜欢的 aurhelper,例如 yay

yay -S snazy-bin

Nix/NixOS

Snazy 可从 nixpkgs 获取。

nix-env -iA snazy
nix run nixpkgs#snazy -- --help # your args are here

Docker

kubectl logs deployment/pod foo|docker run -i ghcr.io/chmouel/snazy

源代码安装

Snazy 使用 rust 构建,如果您想直接编译它,只需获取源代码并运行 cargo build 即可。(假设您已安装 rust 工具链 安装

使用方法

  • 通常,您可以通过将日志“管道”到它来使用 snazy
kubectl logs deployment/controller|snazy
  • 它也支持流式传输。当你有kubectl logs -f时,它会等待输入并优雅地逐行打印你的日志。

  • 你可以在命令行中将一个或多个文件传递给snazy,它会解析这些文件而不是使用标准输入。

  • 如果你没有传递文件,并且你的输入来自https://github.com/boz/kail,它将自动检测并打印namespace/pod[container]作为前缀

screenshot

  • 标志"--kail-prefix-format"让你自定义如何显示kail格式,模板{namespace}{pod}{container}将被其值替换,而"\n"将被换行符替换。例如,如果你想只显示当前pod后跟一个换行符,你可以使用以下模板

    --kail-prefix-format "{pod}\n"

    环境变量SNAZY_KAIL_PREFIX_FORMAT让你永久设置此设置。

  • 如果你不希望为kail设置任何前缀,可以传递--kail-no-prefix标志。

  • 如果你想突出显示某些模式,可以在-r/--regexp之后添加REGEXP,然后snazy将突出显示它。你可以有多个-r开关与多个正则表达式,并为每个匹配项获得不同的突出显示。

  • 如果你想强制突出显示某些颜色,可以在正则表达式的开头添加颜色,后跟一个冒号。颜色可以是以下之一:yellowredgreenbluemagentacyanwhiteblack或RGB颜色模型,例如:88,48,235。例如,如果你想用红色突出显示ERROR,用黄色突出显示WARNING,你可以这样做

% kubectl log pod|snazy -r red:ERROR -r yellow:WARNING -r green:INFO -r 88,48,235:MITIGATED
  • 如果snazy不识别行作为JSON,它将直接打印。无论如何,它仍然会应用-r选项的正则表达式突出显示或执行匹配的动作命令(见下文)。这使得你可以使用它来对任何日志进行正则表达式突出显示和模式操作。

  • 如果你想只显示某些特定级别,可以添加标志-f/--filter-levels来按级别过滤或多个-f来过滤多个级别,例如,这仅显示日志中的警告和错误

% kubectl log pod|snazy -f warning -f error
  • 如果你传递标志-l/--level-symbols或设置环境变量SNAZY_LEVEL_SYMBOLS,snazy将显示一些漂亮的表情符号而不是普通的日志级别标签

snazy level symbols

  • 你可以使用--time-format标志(或环境变量SNAZY_TIME_FORMAT)自定义打印的时间,该变量遵循UNIX strftime格式字符串。

  • 如果您想跳过显示某些行,可以指定标志 -S/--skip-line-regexp。当它匹配此值中的单词或正则表达式时,将简单地跳过打印该行。如果您想跳过多行,可以设置多个标志。

  • 您可以使用 -k/--json-keys 标志进行自己的字段匹配,您需要传递字段 msglevelts。这些字段针对作为 JSON 对象表示法 指定的 json 负载数据中的键。字段的描述如下

    • msg:消息文本(字符串)
    • level:日志级别(例如:info)(字符串)
    • ts:时间戳,一个浮点数或日期时间。

    如果这些字段中缺少任何一个,解析器将失败。

    示例:

    echo '{"the": {"msg": {"is": "message"}, "level": {"is": "INFO"}, "ts": [{"is": "2022-04-25T14:20:32.505637358Z"}]}}' | \
          snazy -k msg=/the/msg/is -k level=/the/level/is -k ts=/the/ts/0/is
    # => INFO  14:20:32 message
    
  • Snazy 支持 regexp 的操作命令,这意味着如果您有一个匹配消息的正则表达式,它将对该消息执行操作。它目前仅支持一个正则表达式一个操作。如果您指定字符串 "{}",它将被扩展为匹配的字符串。例如,在 MacOS 上,此命令将显示已成功的 pipelinerun 通知

    snazy --action-regexp "pipelinerun(s)?\s*.*has success" --action-command "osascript -e 'display notification \"{}\"'"
    

使用 fzf 进行交互式过滤

您甚至可以使用 UNIX shell 管道进一步操作,将 snazy 传递给 fzf 以进行流的交互式过滤。例如,使用 kail 将 Kubernetes 集群上的所有内容流式传输,通过 snazy 转换日志,最后使用 fzf 交互式选择要匹配的模式

kail --since=1h | snazy | fzf +s --ansi

这将为您提供带有 fzf 的提示,您可以在其中输入您想要的查询。

使用 snazy 显示 GitHub Action 运行日志

一个位于 这里 的便捷脚本,让您可以通过 snazy 和 bat 分页器显示 GitHub action 运行的日志。

您需要设置 gh cli 并安装 fzf 才能使其正常工作。

这里是一个展示该功能的视频 https://streamable.com/7sf1hq

Shell 完成功能

大多数 shell 都可以使用命令 --shell-completion 获取 shell 完成功能,例如 --shell-completion=zsh。许多不同的 shell 都受到支持。我让读者自行决定如何使用它们与各自的 shell。Brew 和 RPM 软件包应该已经自动配置为 bash/fish/zsh。

常见问题解答

  • 我以前见过一个类似这样的工具,但名字很愚蠢?我以前有一个名为 (sugarjazy) 的 python 脚本,它执行相同的功能,但我想用 Rust 进行实验,所以我称这个为 snazy
  • 您在 "snazzy" 中漏掉了一个 z。确实如此。但 snazy 比 snazzy 更容易在 Google 中搜索到 :p
  • 为什么是 Rust?这是一个很好的问题,我想我会问为什么不是?使用低级语言轻松地编写高级 CLI 程序感觉很好。 sharkdp/fd

Apache-2.0

作者

Chmouel Boudjnah <@chmouel>

依赖项

~7–18MB
~255K SLoC