2 个版本
0.1.3 | 2021 年 12 月 20 日 |
---|---|
0.1.2 | 2021 年 12 月 19 日 |
#13 in #fly
11KB
191 行
drep 是动态正则表达式打印
drep
是带有动态可重载过滤表达式的 grep
。这允许在动态更改过滤器的同时过滤日志/行流。
过滤器可以是正则表达式或纯文本匹配,通过输入文件提供。
以下是一个使用示例
tail -f /var/log/nginx/error.log | drep -f /etc/drep/filters
通常您会与服务器一起使用此功能
java -jar my-server.jar | drep -f server-filters
或
./uwsgi -s :8080 -w my_app | drep -f server-filters
过滤器文件语法
过滤器文件的每一行都是一个以 ~
、=
、!=
或 !~
开头的表达式。匹配将按文件中过滤器书写的顺序进行,如果过滤器匹配,则不会执行后续过滤器。
- 以
!~
开头的任何行意味着不匹配正则表达式,例如:!~"time": \d+.\d{0,2}
- 以
~
开头的任何行意味着匹配正则表达式,例如:~"time": \d+.\d{3,}
- 以
!=
开头的任何行意味着不包含文本,例如:!=INFO
- 以
=
开头的任何行意味着包含文本,例如:="total-duration"
其他一切都将被忽略,如纯文本所示。有关正则表达式文档,请参阅此文档。
为什么?
虽然 grep --line-buffered
可以做类似的事情,但动态更改正则表达式是不可能的。在服务器/进程环境中,当无法仅为了更改 grep
过滤器而重新启动进程时,动态更改过滤器正则表达式非常有用。
基于Unix哲学,drep
只做一件事并且做得很好,给定一个输入文件的过滤器,它可以过滤输入行到标准输出。
特性
- 轻量级,对CPU和内存占用小(内存占用约为3MB,总共有2个线程)。
- 监视并重新加载过滤器文件。
- 没有GC暂停,内存安全(用Rust编写)。
- 纯文本和正则表达式匹配(支持否定)。
使用示例
给定以下简单的fizzbuzz.py
import time
i = 1
while True:
fb = ""
if i % 3 == 0:
fb = "fizz"
if i % 5 == 0:
fb = "{}buzz".format(fb)
if fb:
print("{}. {}".format(i, fb), flush=True)
i = i + 1
time.sleep(0.1)
我们可以启动并管道它的输出python fizzbuzz.py | drep -f filters
。现在如果filters
的内容是
~\sfizz\n
drep只会输出fizz相关的日志。例如:
642. fizz
648. fizz
651. fizz
654. fizz
...
在进程运行而不退出的情况下,您可以只需修改filters
为
~\sbuzz\n
这将动态改变drep的输出,只输出buzz
805. buzz
815. buzz
820. buzz
...
构建
只需克隆仓库并运行cargo build --release
。
依赖
~5–15MB
~165K SLoC