查看日志工具。
Usage ./log.js <command> [options]
可选的命令有:
- list 列出所有匹配日志
- remove 删除所有匹配日志
- all 根据配置,获取所有日志
- tail filepath 以tail方式查看某个日志
-l
: 指定特定的日志系统-r
: 指定正则表达式。默认只会显示匹配的日志条目。-a
: 显示所有日志。与-r配合使用
tail命令用起来和Linux系统的tail -f
命令基本一样。只是在使用上更方便一些。
./log.js tail filepath [-r regex][-o]
tail命令会实时输出文件的最新内容,如果指定-r参数,则会高亮匹配的关键字。如果指定了-o参数,则只会显示匹配的日志(和grep不一样,不是以文本的一行为单位,而是以一条日志为单位,具体配置见conf.json的tail_separator和tail_header)
在使用tail命令的过程中,可以按下回车插入一个彩色tag条,用来标记,方便查看。也可以输入单词再按回车作为tag条的标题。
tag条还有一个功能就是会缓存tag开始后的日志。在查看过程中,可以随时输入/开头的正则表达式。按回车会,会输出这段tag缓存中匹配的日志。同时会更新参数中用来匹配的正则。
效果图:
- 读取配置文件,获得路径规则,日志规则
- 按日志的一行来处理文件,而不是文本的一行
- 根据分钟来筛选
- -r 正则参数(只显示匹配的行)
- -a 显示所有行
- 高亮颜色可配置
- 列出所有日志
- 删除所有日志
- 实现tail功能
- 方便的tail操作,可以回车插入彩色分割行
- 方便的tail操作,可以输入文本,插入带tag的彩色分割行
- 方便的tail操作,支持正则搜索
- 方便的tail操作,支持随时输入正则,更新搜索正则
- 用上日志系统参数
- 方便的tail操作,支持随时输入正则,搜索上节内容(而且只显示否所内容)
- tail操作,正则过滤只显示匹配行
- 时间筛选上,没必要每次都比较时间,因为日志是线性的
- 优化效率
- 给node-tail提issue
配置规则demo:
{
"logs":{
"test":{
"paths" : [ "test","test/@(user) ], // <1>
"file_regex" : [ "input" ],
"log_header_regex" : "^DEBUG|^TRACE|^NOTICE|^WARNING|^FATAL",
"log_time_regex" : "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"
},
"test2":{
"paths" : [ "test" ],
"file_regex" : [ "input","T(YYYYMMDD)-log" ], // <2>
"log_header_regex" : "^DEBUG|^TRACE|^NOTICE|^WARNING|^FATAL",
"log_time_regex" : "\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}"
},
}
"search_color":"red"
}
logs中指定了多个日志配置。每个日志配置,可以指定:
- paths: 文件夹路径,数组。
- file_regex: 过滤文件名的正则表达式,数组。
- log_header_regex:匹配一行日志的正则表达式。直到遇到下一个下一个匹配,都认为是这一行的日志。
- log_time_regex: 匹配日志中时间信息,用来进行时间过滤
扩展:
- <1>: 指定文件夹路径,可以使用
@(param)
的表达式,这个表达式,会在运行的时候被对应的运行参数的值替换掉。举个例子:
node log.js --user "toybn"
使用这条语句运行时,<1>处的paths的值为:["test","test/tobyn"]
-
<2>: 过滤日志文件的正则表达式,可以使用
T(YYYY-MM-DD)
这样的表达式,这个表达式,会在运行的时候替换成对应的时间。举个例子,在2015年10月14日运行脚本,<2>处的file_regex为
[ "input","20151014-log" ]
指定搜索(-r)高亮的颜色,选择有:
- black
- red
- green
- yellow
- blue
- magenta
- cyan
- white
用nodejs写tail功能一直失败。。。。目前使用tail库(node库就是多。。),有空了理解下源码,如何实现的。
node-tail也不行。。。。依然会出现从头输出的情况? TODO 提出issue。 tail-forever可以,但是可以看得出来,是轮询的。 先用后者吧,有空一定弄个明白。
"bin": { "window-size": "cli.js" },
这个怎么用?
$ time grep -E 'fuck' /home/mazhibin/logs/tools.20151014.log
NOTICE: fuck
NOTICE: fuck
real 0m0.890s
user 0m0.678s
sys 0m0.212s
$ time node log.js all -r 'fuck'
======/home/mazhibin/logs/cp.20151014.log========
======/home/mazhibin/logs/tools.20151014.log========
NOTICE: fuck
NOTICE: fuck
real 0m6.926s
user 0m6.815s
sys 0m0.879s