第3章:Linux系统日志:rsyslog配置、journalctl使用、/var/log目录详解

日志,说白了就是系统的「黑匣子」。

我干了这么多年安全运维,每次排查故障、追踪入侵,第一件事就是翻日志。没有日志,你就像蒙着眼睛修车,全靠猜。Linux的日志体系,核心就三块:rsyslog(传统日志框架)、journalctl(systemd时代的日志神器)、/var/log(日志的物理仓库)。今天咱们就把这三块彻底讲透。

3.1 /var/log 目录:日志的物理仓库

先说说这个目录。你随便找台Linux机器,cd /var/log 看一眼,里面文件不少。但每个文件干什么用,很多人其实没搞明白。

我列几个最常见的,你对照着看:

日志文件 记录内容 我的经验
/var/log/messages 通用系统日志,大部分非关键信息 排查普通故障首选,但容易被刷屏
/var/log/secure 认证安全日志,ssh登录、sudo操作 我每次看入侵痕迹,第一个翻它
/var/log/maillog 邮件服务器日志 发不出邮件?先看这里
/var/log/cron 计划任务执行日志 定时任务没跑?查它准没错
/var/log/boot.log 系统启动日志 启动卡住了?看这里
/var/log/dmesg 内核环缓冲区日志 硬件问题、驱动报错,找它
/var/log/lastlog 用户最后登录时间 二进制文件,用lastlog命令查看
/var/log/wtmp 登录历史记录 用last命令查看,谁什么时候登录过
/var/log/btmp 失败登录记录 暴力破解的痕迹全在这,用lastb查看

重点提醒:secure、wtmp、btmp这三个文件,是安全审计的「三件套」。我每次做安全事件响应,必查这三个。尤其是btmp,里面全是扫描器和暴力破解的IP,你想想看,一天几千条失败登录,正常吗?

嗯,这里要注意一点:这些日志文件默认会被logrotate轮转。比如messages会变成messages-20250301、messages-20250302。轮转策略在 /etc/logrotate.conf 里配置。我曾经遇到一个案例,客户说日志没了,结果发现是轮转周期太短,只保留3天,根本不够回溯。

我的建议:生产环境至少保留90天日志。如果磁盘不够,考虑远程日志服务器。别等出事了才后悔。

3.2 rsyslog 配置:日志的「交通警察」

rsyslog是什么?它负责决定「哪条日志该去哪」。比如内核日志去dmesg,认证日志去secure,其他杂七杂八的去messages。这个规则,全写在 /etc/rsyslog.conf 和 /etc/rsyslog.d/ 目录下的配置文件里。

咱们看一个典型的配置片段:

# 把认证相关的日志写到 /var/log/secure
authpriv.*                                                 /var/log/secure

# 把邮件相关的日志写到 /var/log/maillog
mail.*                                                     /var/log/maillog

# 把计划任务日志写到 /var/log/cron
cron.*                                                     /var/log/cron

# 所有紧急级别的日志,同时写到控制台和所有用户终端
*.emerg                                                    :omusrmsg:*

# 把内核日志写到 /dev/console(如果有的话)
kern.*                                                     /dev/console

配置格式其实很简单:「选择器」+「动作」。选择器由「设施」和「优先级」组成,中间用点号连接。比如 authpriv.* 表示所有优先级的认证日志。

常见的设施(facility)有:

  • auth / authpriv - 认证安全
  • cron - 计划任务
  • daemon - 守护进程
  • kern - 内核
  • mail - 邮件系统
  • syslog - syslogd自身
  • user - 用户级别
  • local0 ~ local7 - 自定义,给第三方程序用

优先级从低到高:debug, info, notice, warning, err, crit, alert, emerg。

避坑指南:我曾经把某个服务的日志级别设成了debug,结果一天产生了50GB日志,直接把磁盘撑爆了。生产环境慎用debug级别,除非你明确知道自己在干什么。

再说一个实用场景:远程日志收集。假设你有10台服务器,总不能每台都登录上去看日志吧?配置rsyslog把日志发到中央服务器:

# 在客户端配置(发送端)
*.* @192.168.1.100:514    # 使用UDP发送到中央服务器
*.* @@192.168.1.100:514   # 使用TCP发送,更可靠

# 在服务器端配置(接收端)
# 取消注释 /etc/rsyslog.conf 中的以下两行
$ModLoad imudp
$UDPServerRun 514
# 或者TCP
$ModLoad imtcp
$InputTCPServerRun 514

我个人习惯用TCP,虽然比UDP慢一点,但不会丢日志。你想想看,安全审计的时候丢了一条关键日志,那后果...

3.3 journalctl:systemd时代的日志神器

如果你用的是CentOS 7+、Ubuntu 16.04+,那系统日志已经被systemd接管了。journalctl就是它的查看工具。

journalctl和传统日志最大的区别是什么?结构化。传统日志就是一行文本,journalctl的日志包含字段:时间、主机名、进程ID、优先级、消息内容等等。你可以像查数据库一样过滤。

来,看几个最常用的命令:

# 查看所有日志(默认显示最近的)
journalctl

# 查看本次启动以来的日志
journalctl -b

# 查看上一次启动的日志(排查启动故障时很有用)
journalctl -b -1

# 查看某个服务的日志
journalctl -u nginx.service

# 查看某个时间段的日志
journalctl --since "2025-03-01 10:00:00" --until "2025-03-01 12:00:00"

# 实时跟踪日志(类似tail -f)
journalctl -f

# 只显示内核日志
journalctl -k

# 按优先级过滤(只显示错误及以上)
journalctl -p err

# 查看某个PID的日志
journalctl _PID=1234

# 查看某个用户的日志
journalctl _UID=1000

我的最爱:journalctl -u nginx.service -f --since "10 minutes ago"。排查线上问题时,这个组合能让你快速定位到最近10分钟nginx的错误。我几乎每天都在用。

journalctl的日志默认保存在 /run/log/journal/ 目录下,这是内存文件系统,重启就没了。如果你希望持久化保存,需要创建 /var/log/journal/ 目录:

mkdir -p /var/log/journal
systemd-tmpfiles --create --prefix /var/log/journal
systemctl restart systemd-journald

持久化之后,日志会保存在 /var/log/journal/ 下,按机器ID分目录。嗯,这里要注意,journalctl的日志默认有大小限制,在 /etc/systemd/journald.conf 里配置:

# 限制日志最大为500MB
SystemMaxUse=500M

# 单个日志文件最大50MB
SystemMaxFileSize=50M

# 保留最近4周的日志
MaxRetentionSec=4week

我的建议:别把journalctl的日志设得太大。我一般设1GB上限,同时配合rsyslog把关键日志写到文件里。这样既享受了journalctl的查询便利,又保留了传统日志的稳定性。

3.4 实战:日志分析三板斧

光说不练假把式。我分享三个我常用的日志分析场景:

场景一:查找暴力破解

# 查看失败的SSH登录尝试
journalctl -u sshd.service | grep "Failed password"

# 或者从secure日志里查
grep "Failed password" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr

场景二:排查服务启动失败

# 查看nginx为什么起不来
journalctl -u nginx.service -b --no-pager

# 或者看内核日志有没有报错
dmesg | tail -20

场景三:磁盘空间告警排查

# 看看哪个日志文件最大
du -sh /var/log/* | sort -rh | head -10

# 看看journalctl占了多少
journalctl --disk-usage

避坑指南:我曾经遇到一个情况,/var/log/journal/ 目录下积累了上百GB的日志,因为有人把 SystemMaxUse 设成了0(无限制)。结果磁盘满了,服务全挂了。记住,日志也是要「计划生育」的。

好了,这一章的内容就这些。rsyslog、journalctl、/var/log,这三者不是互斥的,而是互补的。我个人的最佳实践是:用journalctl做日常查询和实时跟踪,用rsyslog做远程收集和持久化归档,用/var/log做传统兼容和第三方工具对接。三者配合,日志体系才算完整。

下一章,咱们聊聊日志的轮转和归档策略。到时候我会分享一个我踩过的坑——日志轮转没配好,结果生产环境炸了。嗯,到时候细说。