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开销。

嗯,日志配置这块就这些。记住一句话:日志是调试的命根子,配好了省心,配不好闹心。下一节我们聊聊日志分析工具,到时候你就知道日志配得好有多重要了。