Skip to content

Latest commit

 

History

History

tailflow

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 

日志流过滤查看器

简介

利用 vim8 的异步特性,将动态增长的日志导入一个 buffer,实现类似 在 shell 执行以下命令的功能:

: tail -f xxxxx.log | grep what?

但是可以动态、实时改变要过滤的字符串(实际按 vim 解析的正则表达式)。 也可以通过选项或配置命令调用其他外部命令,只要是向标准输出即可。比如 用 cat 代替 tail -f 就是分析历史不再增长的旧日志文件。

用法

: PI tailflow
: Tail xxxxx.log
: Tail xxxxx.log --cmd other cmd than tail 
: Tail xxxxx.log --and match1 match2 --not nomatch1 nomatch2

在默认情况下,Tail 命令用异步工作的方式调用 tail -f 工具打开 一个(日志)文件,将标准输出显示在一个新开的 buffer 中。

一般假设该文件会持续动态增长,新行会添加到 buffer 末尾。如果光标 在末尾,则在增长的同时光标也顺移,以保持在末尾。但是,你可以像在 普通 buffer 中那样自由移动光标,比如查看之前刷出的日志。所以如果 光标离开末行时,在添加新行时也不会影响光标位置。要恢复自动滚动刷 屏,只要按 G 跳到末行即可。

命令选项

  • --cmd-c:可以提供其他命令覆盖 tail -f,比如 cat
  • --and-a:需要匹配的字符串(vim 正则表达式)
  • --not-n:不能匹配的字符串

每个选项之后都可以跟多个参数,以空格分隔,直到遇到另一个选项开关。 -c 之后的参数当成是外部命令及其可选参数,但不支持管道,(也暂 不支持 - 选项,会与 Tail 命令本身冲突)。

对于标准输出的每一行,会根据 --and--not 列表来决定该行是否 被过滤,是否添加到 buffer 末尾。相当于以下且逻辑:

print if /match1/ && /match2/ && !/nomatch1/ && !/nomatch2/;

如果在 Tail 启动命令时没提供选项,--and 列表与 --not 列表 初始为空。

局部命令

在日志流窗口被打开时,有以下几个命令或快捷键可使用:

  • :And [op] {item list} 动态修改当前的 --and 列表。
  • :Not [op] {item list} 动态修改当前的 --not 列表。

可以提供多个参数,每个参数仍当作 vim 的正则表达式。 参数之前有个可选的操作符,默认是 +=

  • = 完全重置对应的列表,用当前命令行参数覆盖

  • += 将参数添加到列表中,忽略重复已存在的参数

  • '-=' 将参数从列表中删除,忽略原来不存在的参数

  • :Stop 停止外部命令,即调用 vim 的 job_stop()

  • :Run 重新启动外部命令,复用当前日志流 buffer 窗口

  • :Status 查看异步工作状态

  • :File {filename} 改变外部命令的文件名参数

  • :Cmd {command} 改变外部命令及可选参数

调用的外部命令实际上是 :Cmd:File 参数的拼接。 需要 :Stop 之后才允许修改外部命令或文件参数, 修改后之后须再 :Run 才重新生效。

每个 :Tail 全局命令将开启一个异步工作,新建一个 buffer, 并以 tail-1 命名,其中序号后缀将递增。但局部命令 :Stop 后 再 :Run 不会新增 buffer ,也不会清空原来 buffer 中的内容。

改变 :And:Not 参数表,也不会影响之前刷出在 buffer 中的内容。 但你可以自由像普通 buffer 那样删除不想看的内容,或用正则删除:

: g/regexp/d

日志流 buffer 最多保存 10000 行,超值时删除前 10% 行。 这是个特殊 buffer ,但虽可编辑,但不会保存文件。即不会影响原本的 日志文件,也不会保存 tail-1 这样的文件。但可以手动保存 或选定部分行,指定文件名参数保存 buffer:

: w another-file-name

局部快捷键映射

在日志流窗口中,另定义了一些快捷键,调用以上命令。

  • A 当前光标下的单词送给命令 :And <word> 执行
  • X 当前光标下的单词送给命令 :Not <word> 执行

在选择模式下,就将将定的部分当作 :And:Not 的参数。 命令行处于待执行状态,要求用户再按回车确认, 以提供机会修改参数,或取消执行。

格式化单行 JSON 字符串

日志中常有压缩的单行 json 字符串,不便查看, 故提供命令重格式化为易读的多行格式。

  • :JsonBreak 纯 viml 实现的对当前行简单正则替换加回车断行再 = 格式化
  • J 普通模式下大 J 在当前行调用 :JsonBreak。选择 vJ 可重新合并一行
  • K 大 K 调用 !clang-format 过滤重格式化,普通模式下对当前行, 选择模式下对所选行重格式化。

TODO

其他设想,有用且有时间就添加。

  • 新增一个辅助配置窗口,直接编辑配置,避免单独执行 :And :Not 以及 :File :Cmd 等命令调控。
  • 支持区域正则筛选,类似 /begin-line/,/end-line/ 功能 以及更多的过滤规则。