#filter #regex #dynamic #grep #expression #reloadable #fly

app drep

drep 是带有动态可重载过滤表达式的 grep。这允许在动态更改过滤器的同时过滤日志/行流。

2 个版本

0.1.3 2021 年 12 月 20 日
0.1.2 2021 年 12 月 19 日

#13 in #fly

MIT 许可证

11KB
191

Rust Version

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