2. sloginfo工具详解:基本用法、常用参数、日志过滤、格式化输出

好,咱们接着聊sloginfo。这个工具,说实在的,是我在QNX系统上用得最频繁的调试利器之一。你想想看,系统跑着跑着出问题了,第一反应是什么?肯定是先看看日志里有什么线索。sloginfo就是那个帮你把slogger攒下来的日志倒腾出来的家伙。

2.1 sloginfo基本用法

先来个最直接的。你在终端里敲下这行命令:

sloginfo

嗯,就这么简单。它会一股脑儿把当前系统里所有的日志都打印出来。我第一次用的时候,屏幕上刷刷刷地滚过去几百行,说实话有点懵。但别急,这就像打开了一个装满线索的抽屉,关键是你得知道怎么翻。

我个人习惯,刚接手一个陌生系统时,先跑一遍不带参数的sloginfo,大致看看日志的格式和内容分布。这样心里有个底。

日志的默认格式长这样:

   1.234567 [1234] my_program: This is a log message

从左到右分别是:时间戳、进程ID、程序名、日志内容。这个结构很清晰,对吧?

2.2 常用参数详解

光会用基本命令可不够。sloginfo的参数才是它的灵魂。我挑几个最常用的,一个一个说。

-f 参数:实时跟踪

这个参数我太喜欢了。它就像Linux下的tail -f,能让你实时盯着日志输出。

sloginfo -f

我在调试一个网络协议栈的时候,就靠这个参数盯着每一条收发的报文日志。程序跑起来,日志一条条蹦出来,问题出在哪一目了然。

-w 参数:等待新日志

这个和-f有点像,但有个细微差别。-w是等待新日志,但不会把已有的历史日志打印出来。

sloginfo -w

什么时候用这个?比如你刚启动了一个服务,只想看它启动之后的日志,不想被之前乱七八糟的历史记录干扰。我经常在重启某个模块后用这个命令。

-c 参数:清除缓冲区

这个参数要小心用。它会清空slogger缓冲区里的所有日志。

sloginfo -c

我曾经在客户现场调试时,习惯性地敲了个sloginfo -c,结果旁边的同事脸都绿了——他刚抓到的关键日志被我一把清掉了。嗯,从那以后,我每次用-c之前都会先确认一下:「这日志还有人要吗?」

警告:-c参数会永久删除缓冲区中的日志,无法恢复。请务必确认日志已备份或无人需要时再使用。

-b 参数:指定缓冲区

QNX系统里可以有多个日志缓冲区。默认是系统缓冲区,但你也可以创建自己的。

sloginfo -b my_buffer

这个功能在大型项目里特别有用。比如我把驱动日志写到一个独立缓冲区,应用日志写到另一个。排查问题时各看各的,互不干扰。

2.3 日志过滤

说实话,不加过滤的sloginfo输出,信息量太大了。你想想看,一个跑了几天的系统,日志可能有几十万条。从中找到你需要的那一条,无异于大海捞针。

按进程ID过滤

sloginfo -i 1234

只显示进程ID为1234的日志。我调试某个特定进程时,这个参数是标配。

按程序名过滤

sloginfo -p my_program

按名字过滤比按PID更直观。毕竟你不可能每次都记得PID是多少。

按优先级过滤

sloginfo支持按日志等级过滤。比如只看错误和警告:

sloginfo -l 2

这里的数字对应不同的优先级:

优先级值 含义
0 SHUTDOWN(系统关闭)
1 CRITICAL(严重错误)
2 ERROR(错误)
3 WARNING(警告)
4 INFO(信息)
5 DEBUG(调试)

我个人习惯,日常监控只看ERROR和WARNING以上级别的日志。INFO和DEBUG太多了,容易淹没问题。

组合过滤

这些参数可以组合使用。比如:

sloginfo -p my_program -l 2 -f

这条命令的意思是:实时跟踪my_program这个程序,只显示ERROR及以上级别的日志。你看,这样过滤下来,信息量就刚刚好。

2.4 日志格式化输出

默认的日志格式虽然能用,但有时候不够灵活。sloginfo提供了几个参数让你调整输出格式。

-t 参数:显示完整时间戳

sloginfo -t

默认的时间戳是从系统启动开始的秒数。加上-t后,会显示更精确的纳秒级时间戳。我在做性能分析时经常用这个,能精确到纳秒的时序对定位竞态条件非常有帮助。

-d 参数:显示日期时间

sloginfo -d

这个会把时间戳转换成人类可读的日期时间格式。比如:

2024-01-15 14:23:45.123456 [1234] my_program: ...

嗯,看着舒服多了。我写报告或者给客户看日志时,一定会用-d参数。没人愿意看那个从启动开始的秒数,对吧?

-v 参数:详细模式

sloginfo -v

这个参数会显示更多元信息,比如线程ID、CPU编号等。我在分析多线程问题时,-v参数是必开的。

小技巧:如果你想把日志保存到文件里慢慢分析,可以这样:
sloginfo -d -p my_program > my_log.txt
这样就把格式化后的日志存到文件里了,方便后续用文本编辑器慢慢看。

2.5 实战组合拳

说了这么多,来一个我实际项目中用过的组合:

sloginfo -d -p can_driver -l 2 -f | tee can_errors.log

这条命令做了几件事:

  • 显示日期时间格式
  • 只关注can_driver这个程序
  • 只看ERROR及以上级别的日志
  • 实时跟踪输出
  • 同时把输出保存到文件里

我当时在调试CAN总线驱动,总线时不时报错。用这条命令挂着,一边跑测试一边盯着屏幕。等错误复现了,日志已经妥妥地存到文件里了。省心。

2.6 避坑指南

最后说几个我踩过的坑:

  • 缓冲区溢出:slogger的缓冲区是有限的。如果日志量太大,旧的日志会被覆盖。我曾经调试一个疯狂打日志的模块,结果关键信息被后面的日志冲掉了。后来我学乖了,要么增大缓冲区,要么及时把日志导出来。
  • 性能影响:频繁调用sloginfo -f会占用CPU资源。在生产环境上,我一般不会长时间挂着-f,而是用定时任务把日志dump出来分析。
  • 权限问题:有些受保护的缓冲区需要root权限才能读取。如果你发现sloginfo啥都看不到,先检查一下是不是权限不够。

好了,sloginfo的基本用法就这些。记住,工具是死的,人是活的。多在实际项目中用用,你自然就会找到最适合自己的那一套组合拳。