2 个不稳定版本
0.2.0 | 2020年5月24日 |
---|---|
0.1.0 | 2020年5月23日 |
#2014 in 解析实现
34KB
809 行
Grup
Grup 是一个由 grok
驱动的类似 grep
的 CLI 工具,允许用户以不同的方式操作以 grok
分隔的列(例如,通过列过滤行)。
安装
cargo install grop
使用方法
A grok powered grep-like utility
USAGE:
grop [FLAGS] [OPTIONS] [--] [input]
FLAGS:
-h, --help Prints help information
--merge-scope-exclusive Whether to take the line matching `merge_exp_end` as part of the merged section
-q, --quiet Silence all output
-V, --version Prints version information
-v, --verbose Verbose mode (-v, -vv, -vvv, etc)
OPTIONS:
--config <config-file> Config file in toml format. A sample file could be found at
"doc/sample.toml"
-e, --expression <expression> Grok match expression
--filter <filter>... Filter to include (`field_name pattern`) or exclude (`-field_name
pattern`) some pattern
-l, --list-pattern <list-pattern> List available patterns
--merge-exp-end <merge-exp-end> Grok match expression indicating the end of the merged section
--merge-exp-start <merge-exp-start> Grok match expression indicating the start of the merged section
-m, --merge-field <merge-field>... Field(s) to be merged among lines. The unspecified fields will be skipped
and only keep the ones in first line
-o, --output-format <output-format> Output format (fields of grok expression, separated by comma)
-p, --pattern <pattern>... Custom Grok pattern (format: `<pattern_name> <regexp>`)
ARGS:
<input> Input file, stdin if not present
动机
terraform-provider-azurerm 将输出日志日志,我想有一种方法可以过滤掉不感兴趣的日志。
一些日志可以使用如 grep -v
这样的工具轻松过滤,只要这些日志是一行。
然而,由于 terraform 的“自动分割行”功能,一些由 Azure Go SDK 生成的日志是多行的有效负载。这种类型的日志将被分割成多个日志,并带有一些 terraform 日志格式化(例如,时间戳、日志级别等)。当您通过终端/文件查看整个日志文件时,这个功能很好。但是,当您想要过滤时,它使得像 grep -v
这样的工具变得无用,因为 grep
是基于行的工具,它没有关于跨越多行的有效负载完整性的知识。
这就是 grop
能发挥作用的地方!grop
以管道风格工作
- 使用 grok 对输入进行结构化
- 根据合并模式(起始行模式、结束行模式,支持包含合并和排除合并)合并一个或多个结构化字段
- 根据(合并的)字段级别模式进行过滤/输出
- 格式化输出(例如,仅提取感兴趣的字段)
以下是一个示例片段,说明如何过滤掉一些不感兴趣的日志,用于 terraform-provider-azurerm
$ TF_LOG=DEBUG terraform plan 2>&1 | tee /tmp/tf.log | \
grop -p "LOGLEVEL DEBUG|INFO|WARN|ERROR" \
-p "PROVIDER_SUBJECT plugin.terraform-provider-azurerm" \
-e "%{TIMESTAMP_ISO8601:ts} \[%{LOGLEVEL:lvl}\] %{PROVIDER_SUBJECT}: %{GREEDYDATA:data}" \
-m data \
--merge-exp-start=".* AzureRM Request|Response" \
--merge-exp-end="%{TIMESTAMP_ISO8601:ts} \[%{LOGLEVEL:lvl}\] %{PROVIDER_SUBJECT}: \[DEBUG\]" \
--merge-scope-exclusive \
--filter="-data \[DEBUG\] AzureRM Client User Agent" \
--filter="-data \[DEBUG\] Registering" \
-o ts,data
依赖项
~7–16MB
~221K SLoC