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之前都会先确认一下:「这日志还有人要吗?」
-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的基本用法就这些。记住,工具是死的,人是活的。多在实际项目中用用,你自然就会找到最适合自己的那一套组合拳。