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就都支持起来了。

Speedy emails, satisfied customers

Postmark Image

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

Top comments (0)

Sentry image

See why 4M developers consider Sentry, “not bad.”

Fixing code doesn’t have to be the worst part of your day. Learn how Sentry can help.

Learn more

👋 Kindness is contagious

Engage with a sea of insights in this enlightening article, highly esteemed within the encouraging DEV Community. Programmers of every skill level are invited to participate and enrich our shared knowledge.

A simple "thank you" can uplift someone's spirits. Express your appreciation in the comments section!

On DEV, sharing knowledge smooths our journey and strengthens our community bonds. Found this useful? A brief thank you to the author can mean a lot.

Okay