Ktor+Logback环境下,如何让lnav仅显示journalctl JSON输出中的目标日志内容?
我来帮你搞定这个日志显示的困扰——你想要保留JSON模式的稳定性和正确颜色,同时去掉那些不需要的系统元数据前缀,只留下Logback输出的日志内容对吧?这里有两个简单可行的方案:
方法一:用jq提取核心日志内容(推荐)
既然journalctl的JSON输出里,你需要的日志文本都存在MESSAGE字段里,我们可以先用jq把这个字段提取出来,再传给lnav。这样既保留了JSON模式的稳定性,又能让lnav只处理你需要的内容,颜色也不会丢失。
直接用这条命令就行:
journalctl -u mycompass-staging -n 1000 -f -o json | jq -r '.MESSAGE' | lnav
-r参数是关键,它让jq输出不带引号的原始字符串,这样lnav能正确识别Logback输出里的ANSI颜色代码- 处理后,lnav收到的就是纯日志内容,和你用
-o cat时的内容一致,但完全避免了解析错误的问题
方法二:给lnav加自定义格式配置
如果你不想额外依赖jq,也可以通过lnav的自定义格式来过滤显示的字段:
- 先创建lnav的格式配置文件:在
~/.lnav/formats目录下新建systemd-message-only.json,内容如下:
{ "format": { "name": "systemd-message-only", "description": "只显示systemd JSON日志中的MESSAGE字段", "regex": { "main": "^\\{.*\"MESSAGE\":\"(?<message>.*)\".*\\}$" }, "columns": { "message": { "title": "日志内容", "display": true } }, "level-field": "", "time-field": "" } }
- 然后用这条命令启动lnav:
journalctl -u mycompass-staging -n 1000 -f -o json | lnav -f systemd-message-only
不过这个方法需要维护自定义配置,不如用jq直接提取来得省心。
效果验证
不管用哪种方法,最终你看到的日志都会是你想要的样子:
2025-09-11 14:07:50.660 INFO Application - Application started in 4.6 seconds.
既保留了正确的颜色高亮,也不会再出现Invalid log message的错误提示。
顺便说下为什么之前的两种方式有问题:-o cat模式下journalctl直接输出原始日志,但lnav会尝试按默认规则解析,遇到不符合的内容就报错;而-o json是结构化输出,lnav能稳定解析,但默认会展示所有系统元数据字段,所以需要过滤掉多余的部分。
内容的提问来源于stack exchange,提问作者ixx
相关产品推荐
相关产品推荐

