4、系统日志配置与管理:slog.conf配置文件、日志轮转策略、日志压缩、远程日志传输
日志这东西,平时没人搭理它,一出问题它就是救命稻草。我在QNX上调试过不少现场故障,十次里有八次是靠日志定位的。所以日志怎么配、怎么存、怎么传,真不是小事。
这一节我们聊聊slog.conf配置文件、日志轮转策略、日志压缩、远程日志传输。说白了,就是让日志系统既好用又省心。
4.1 slog.conf配置文件
slog是QNX的系统日志服务。它的配置文件在/etc/system/config/slog.conf。我个人习惯,拿到一个新系统,第一件事就是看看这个文件。
配置文件的结构其实不复杂。它定义了日志的缓冲区大小、输出目标、过滤规则等。举个例子:
# slog.conf 示例
#
# 格式: [模块名] 级别 输出目标
# 内核日志
[kernel] 7 /dev/slog
# 驱动日志
[io-usb] 5 /dev/slog
# 应用日志
[myapp] 6 /var/log/myapp.log
# 所有模块的默认规则
[*] 4 /dev/slog
这里每个字段的含义:
- 模块名:用方括号括起来,比如
[kernel]、[io-usb]。支持通配符*。 - 级别:0-7的数字,7最详细,0最紧急。一般生产环境设4或5就够了。
- 输出目标:可以是设备文件、普通文件,甚至是管道。
小技巧:调试阶段可以把级别设高一点(比如7),上线前再调低。我曾经有一次上线忘了改级别,结果日志文件一天涨了2GB...嗯,教训深刻。
配置文件修改后,需要重启slog服务:
# slog 重启命令
sloginfo -r
# 或者
killall -HUP slogger
4.2 日志轮转策略
日志不轮转,磁盘迟早会满。我在项目里见过最夸张的一次,一个日志文件写了30GB,系统直接卡死。从那以后,轮转策略我都是必配的。
QNX里日志轮转通常用logrotate工具。它的配置文件在/etc/logrotate.conf。看个例子:
# /etc/logrotate.conf
/var/log/myapp.log {
size 10M # 文件超过10M就轮转
rotate 5 # 保留5个历史文件
compress # 轮转后压缩
delaycompress # 延迟一次再压缩
missingok # 文件不存在不报错
notifempty # 空文件不轮转
postrotate
# 通知slog重新打开日志文件
sloginfo -r
endscript
}
轮转策略的几个关键参数:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| size | 触发轮转的文件大小 | 10M-100M |
| rotate | 保留的历史文件数 | 3-7 |
| compress | 是否压缩历史文件 | 建议开启 |
| delaycompress | 延迟一次压缩 | 建议开启 |
注意:轮转后一定要通知slog重新打开文件。不然slog还在往旧文件里写,轮转就白做了。这个坑我踩过,当时排查了半天才发现。
4.3 日志压缩
日志压缩能省不少磁盘空间。QNX上常用gzip或bzip2。我个人偏爱gzip,解压快,兼容性好。
压缩可以在logrotate里自动做,也可以手动写脚本。手动压缩的例子:
# 手动压缩日志
gzip /var/log/myapp.log.1
# 查看压缩后的日志
zcat /var/log/myapp.log.1.gz | grep "ERROR"
# 或者用zgrep直接搜索
zgrep "ERROR" /var/log/myapp.log.1.gz
压缩率对比:
| 工具 | 压缩率 | 速度 | 适用场景 |
|---|---|---|---|
| gzip | 中等(约70%) | 快 | 日常使用 |
| bzip2 | 高(约80%) | 慢 | 归档保存 |
| xz | 极高(约90%) | 很慢 | 长期归档 |
建议:日常轮转用gzip就够了。归档用bzip2或xz。别为了省空间把压缩时间拖得太长,现场排查时等不起。
4.4 远程日志传输
有时候日志不在本地看,要传到远程服务器。QNX支持syslog协议,也支持自定义传输。
syslog是最常用的方式。配置远程日志传输:
# 在slog.conf中配置远程输出
[myapp] 6 @192.168.1.100:514
# 或者用syslogd转发
# 启动syslogd并指定远程服务器
syslogd -R 192.168.1.100:514
远程传输的几种方式:
- UDP syslog:简单快速,但可能丢包。适合局域网。
- TCP syslog:可靠传输,但开销大。适合跨网络。
- 自定义TCP/UDP:灵活,但需要自己写客户端和服务端。
我一般这么选:
- 局域网内调试:UDP syslog,简单够用。
- 跨网络或重要日志:TCP syslog,保证不丢。
- 特殊格式需求:自己写传输脚本。
实战经验:我曾经在一个项目中,设备部署在偏远地区,日志通过4G网络传回。一开始用UDP,结果丢包严重。后来改成TCP,又发现网络不稳定时连接经常断开。最后用了TCP+本地缓存+断线重连的方案,才算稳定下来。所以远程传输一定要考虑网络环境。
4.5 综合配置示例
最后给一个完整的配置示例,是我在实际项目中用过的:
# slog.conf
[kernel] 5 /dev/slog
[io-usb] 4 /dev/slog
[myapp] 6 /var/log/myapp.log
[myapp] 6 @192.168.1.100:514
[*] 3 /dev/slog
# logrotate.conf
/var/log/myapp.log {
size 10M
rotate 7
compress
delaycompress
missingok
notifempty
postrotate
sloginfo -r
endscript
}
# 远程传输脚本(断线重连)
while true; do
cat /var/log/myapp.log | nc -w 5 192.168.1.100 514
sleep 10
done
这个配置的好处:
- 本地保留7天日志,压缩后占不了多少空间。
- 远程传输有断线重连,网络不稳定也不怕。
- 内核和驱动日志级别低一些,减少IO开销。
嗯,日志配置这块就这些。记住一句话:日志是调试的命根子,配好了省心,配不好闹心。下一节我们聊聊日志分析工具,到时候你就知道日志配得好有多重要了。