两套日志系统并存

传统 syslog(文本文件)        /var/log/*.log
systemd journal(结构化)      journalctl 查询

现代 Linux 通常两套都有——很多程序还在写传统日志,systemd 服务用 journal。

/var/log 重要文件

sudo ls /var/log/
文件 内容
syslog(Debian/Ubuntu)/ messages(RHEL) 系统综合日志
auth.log(Deb)/ secure(RHEL) 认证 / sudo / SSH
kern.log 内核
dpkg.log / yum.log 包管理
nginx/access.log / error.log nginx
mysql/error.log mysql
apt/history.log apt 安装历史

看日志的几个套路

1. 实时跟踪

sudo tail -f /var/log/syslog
sudo tail -F /var/log/nginx/access.log  # 大写 F:文件被轮转后也跟上

2. 过滤关键词

sudo grep -i error /var/log/syslog | tail -20
sudo grep "$(date +%b' '%e)" /var/log/auth.log  # 今天的日志

3. 按时间段

# tail 最近 N 行
sudo tail -n 1000 /var/log/syslog | grep ERROR

# 按日期(syslog 行首是日期)
sudo awk '/May  9 10:/' /var/log/syslog

journalctl:systemd 日志查询

# 当前 boot 的所有日志
sudo journalctl

# 实时跟踪
sudo journalctl -f

# 某个服务
sudo journalctl -u nginx
sudo journalctl -u nginx -f

# 按时间
sudo journalctl --since "10 minutes ago"
sudo journalctl --since "2026-05-09 10:00"
sudo journalctl --since today
sudo journalctl --since yesterday --until "1 hour ago"

# 按优先级
sudo journalctl -p err         # 仅 error 及以上
sudo journalctl -p warning -p err

# 按 PID / UID
sudo journalctl _PID=1234
sudo journalctl _UID=1000

# 内核日志
sudo journalctl -k

# 反向(最新在上)
sudo journalctl -r

# 摘要:最近一次启动各服务日志计数
sudo journalctl --list-boots
sudo journalctl -b 0           # 当前 boot
sudo journalctl -b -1          # 上次 boot

优先级

0  emerg     紧急
1  alert     警报
2  crit      严重
3  err       错误
4  warning   警告
5  notice    提示
6  info      信息(默认)
7  debug     调试

dmesg:内核环形缓冲

硬件 / 内核相关消息。

sudo dmesg                     # 全部
sudo dmesg -T                  # 带可读时间戳
sudo dmesg --level=err         # 仅错误
sudo dmesg | tail -50          # 最近的
sudo dmesg -w                  # 实时跟踪

典型用途:

  • 插 U 盘看识别成什么设备名
  • 硬盘报错 / 内存错误
  • OOM killer 杀进程的记录
sudo dmesg | grep -i "out of memory"
sudo dmesg | grep -i "killed process"

日志轮转:logrotate

日志会无限增长 → logrotate 自动按天 / 大小切分 + 压缩 + 删旧。

配置在 /etc/logrotate.d/

ls /etc/logrotate.d/
# apache2  apt  dpkg  mysql-server  nginx  rsyslog ...

/etc/logrotate.d/myapp:

/var/log/myapp/*.log {
    daily                   # 每天切
    rotate 14               # 保留 14 份
    compress                # 旧的 gzip
    delaycompress           # 上一份不压缩(应用还在写)
    missingok               # 文件不存在不报错
    notifempty              # 空文件跳过
    create 0640 myapp myapp # 切完后新文件的权限
    sharedscripts
    postrotate
        systemctl reload myapp
    endscript
}

测试:

sudo logrotate -d /etc/logrotate.d/myapp        # 演练
sudo logrotate -f /etc/logrotate.d/myapp        # 立即跑

看日志的实战

1. 排查 SSH 暴破

sudo grep "Failed password" /var/log/auth.log | tail -50
sudo grep "Failed password" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -rn | head

2. 排查服务挂了

sudo journalctl -u myapp --since "10 minutes ago" -p err

3. 看是不是内存爆了

sudo dmesg -T | grep -i "killed process"

下一篇起进入模块五:网络基础。