DEV Community

晓道
晓道

Posted on

lnav 自定义日志格式支持

早上看了一篇文章,盘点一些小而美的终端命令行工具,里面提到lnav,感觉挺高级的
对这个工具挺感兴趣,最近公司项目,由于性能太好,用户增长很快,日志增长也越来越快,一天要产生几个g的日志,所以如何快速的从日志中找出来问题,确实是个大问题。
虽然我比较善用grep等工具,毕竟每次写正则表达式还是比较费脑。
所以开始折腾吧!

一些介绍文章链接

lnav-日志查看器

lnav:Linux 下一个基于控制台的高级日志文件查看器

安装

我这里是mac,这么安装

brew install lnav

安装好,找到一个线上日志,lnav gateway.log
看上面的文章,我挺满怀期待的,结果没有高亮,按键e 也没有跳到相应的error位置。

开始分析

所以开始看文档吧,折腾陌生的软件的问题,也是学习成长的一种方式。
初步判断,应该是我的日志格式,lnav内置的格式中没有。

我的代码里是这样写的:

fmt.Fprintf(b, "[%s] [%s] [%s] %s ", r.Call.String(), lvl, r.Time.Format(termTimeFormat), r.Msg)
Enter fullscreen mode Exit fullscreen mode

这是一个输出

[app.go:248] [INFO] [02-19|00:00:05.050] recv new challenge module=app round=92164 height=39448849
Enter fullscreen mode Exit fullscreen mode

处理

软件不支持,就给支持一个呗。

官方文档 Defining a New Format

官方推荐你使用regex101 来生成正则表达式匹配日志规则

然后再通过,

lnav -m regex101 import <regex101-url> <format-name> [<regex-name>]
Enter fullscreen mode Exit fullscreen mode

来建立一个配置文件,文件生成在~/.lnav/formats/installed/ 目录

我的正则表达式这么写的,

\[(?P<filename>.*)?\].*\[(?P<level>.*)?\].*\[(?P<timestamp>.*)?\](?P<body>.*)$
Enter fullscreen mode Exit fullscreen mode

就是4个变量,匹配文件名、级别、时间、内容

再运行一次

lnav gateway.log

发现一个错误,timestamp不支持
输出提示,配置timestamp-format就可以搞定,搜索了一下他的其他格式,
因为我使用的,[02-19|00:00:05.050] 是和标准的不一样,搞定他:

        "timestamp-format": [
            "%m-%d|%H:%M:%S.%L",
            "%m-%d|%H:%M:%S,%L"
        ],
Enter fullscreen mode Exit fullscreen mode

依然没有高亮,
发现可能是level的单词问题,
加入一个段来专门设置这个:

        "level": {
            "error": "EROR",
            "warning": "WARN",
            "debug": "DEBUG",
            "info": "INFO"
        },
Enter fullscreen mode Exit fullscreen mode

好了,再来

后面两个设置是直接修改的,你倒入的~/.lnav/formats/installed/的文件

现在lnav的高亮,按e跳到error就都支持起来了。

Top comments (0)