Linux日志管理

日志是系统诊断和故障排查的重要依据,Linux提供了完善的日志系统。

日志系统架构

应用程序/服务
      ↓
  rsyslog ──→ /var/log/...    (传统日志文件)
      ↓
systemd-journald ──→ journal   (二进制日志)

journalctl (systemd日志)

基本查询

# 查看所有日志
journalctl
 
# 查看本次启动的日志
journalctl -b
 
# 查看上一次启动的日志
journalctl -b -1
 
# 实时查看日志
journalctl -f
 
# 反向显示(最新在前)
journalctl -r

时间过滤

# 最近N行
journalctl -n 50
journalctl -n 100
 
# 时间范围
journalctl --since "2026-04-20 10:00:00"
journalctl --until "2026-04-20 12:00:00"
journalctl --since "today"
journalctl --since "yesterday"
journalctl --since "1 hour ago"
journalctl --since "30 minutes ago"
 
# 组合使用
journalctl --since "2026-04-20 08:00" --until "2026-04-20 10:00"

单元过滤

# 按服务单元
journalctl -u nginx
journalctl -u sshd
journalctl -u docker
 
# 多个单元
journalctl -u nginx -u mysql
 
# 组合时间过滤
journalctl -u nginx --since "1 hour ago"

优先级过滤

# 按优先级
journalctl -p emerg       # 紧急
journalctl -p alert       # 警报
journalctl -p crit        # 严重
journalctl -p err         # 错误
journalctl -p warning     # 警告
journalctl -p notice      # 通知
journalctl -p info        # 信息
journalctl -p debug       # 调试
 
# 范围过滤(从err到更高优先级)
journalctl -p err -b

用户和进程过滤

# 按用户
journalctl _UID=1000
 
# 按进程ID
journalctl _PID=1234
 
# 按可执行文件
journalctl /usr/sbin/sshd

输出格式

# JSON格式
journalctl -o json
 
# JSON美化
journalctl -o json-pretty
 
# 仅显示消息
journalctl -o cat
 
# 详细格式
journalctl -o verbose

磁盘管理

# 查看日志占用空间
journalctl --disk-usage
 
# 清理旧日志(保留最近)
journalctl --vacuum-time=7d      # 保留7天
journalctl --vacuum-size=500M    # 限制总大小
 
# 编辑配置限制日志大小
# /etc/systemd/journald.conf
SystemMaxUse=500M
RuntimeMaxUse=100M

传统日志文件

常见日志文件

文件说明
/var/log/syslog系统主日志(Debian/Ubuntu)
/var/log/messages系统主日志(RHEL/CentOS)
/var/log/auth.log认证日志(Debian/Ubuntu)
/var/log/secure认证日志(RHEL/CentOS)
/var/log/kern.log内核日志
/var/log/dmesg启动信息
/var/log/cron定时任务日志
/var/log/boot.log启动日志

查看日志

# 查看文件
cat /var/log/syslog
less /var/log/syslog
 
# 实时查看
tail -f /var/log/syslog
tail -f /var/log/auth.log
 
# 查看最近N行
tail -n 100 /var/log/syslog
 
# 查看开头
head -n 50 /var/log/syslog

搜索日志

# grep搜索
grep "error" /var/log/syslog
grep -i "error" /var/log/syslog          # 忽略大小写
grep "Failed password" /var/log/auth.log
 
# 多文件搜索
grep -r "error" /var/log/
 
# 统计匹配次数
grep -c "error" /var/log/syslog
 
# 显示行号
grep -n "error" /var/log/syslog
 
# 上下文
grep -A 5 "error" /var/log/syslog        # 后5行
grep -B 5 "error" /var/log/syslog        # 前5行
grep -C 5 "error" /var/log/syslog        # 前后各5行

rsyslog配置

配置文件

# 主配置文件
/etc/rsyslog.conf
 
# 子配置目录
/etc/rsyslog.d/

规则语法

facility.priority    action

# facility: auth, cron, daemon, kern, mail, user, local0-7, * (所有)
# priority: debug, info, notice, warning, err, crit, alert, emerg, * (所有), none (排除)
# action: 日志文件路径、远程服务器、用户终端等

配置示例

# /etc/rsyslog.d/50-default.conf
 
# 所有info及以上级别写入syslog
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
 
# 认证日志单独存放
authpriv.*                                  /var/log/secure
 
# 邮件日志
mail.*                                      -/var/log/maillog
 
# 定时任务日志
cron.*                                      /var/log/cron
 
# 发送到远程日志服务器
*.*                                         @logserver:514    # UDP
*.*                                         @@logserver:514   # TCP

重启服务

sudo systemctl restart rsyslog
sudo systemctl status rsyslog

日志轮转 (logrotate)

配置文件

# 主配置
/etc/logrotate.conf
 
# 子配置目录
/etc/logrotate.d/

配置示例

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
    daily                    # 每天轮转
    missingok                # 日志文件不存在不报错
    rotate 14                # 保留14天
    compress                 # 压缩旧日志
    delaycompress            # 延迟压缩
    notifempty               # 空文件不轮转
    create 0640 www-data adm # 创建新文件权限
    sharedscripts            # 共享脚本
    postrotate
        [ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
    endscript
}

手动执行

# 测试配置
logrotate -d /etc/logrotate.conf
 
# 强制执行
logrotate -f /etc/logrotate.conf
 
# 查看状态
cat /var/lib/logrotate/status

日志分析技巧

查找错误

# 系统错误
journalctl -p err -b
 
# 认证失败
grep "Failed password" /var/log/auth.log | tail -20
 
# SSH登录尝试
grep "Accepted password\|Failed password" /var/log/auth.log
 
# 暴力破解IP统计
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr | head

磁盘空间监控

# 查看日志目录大小
du -sh /var/log/
 
# 大文件排序
du -h /var/log/ | sort -rh | head -10
 
# journal日志空间
journalctl --disk-usage

性能分析

# 启动时间分析
systemd-analyze
systemd-analyze blame          # 各服务启动时间
systemd-analyze critical-chain # 关键启动链
 
# 查看启动错误
journalctl -b -p err

集中式日志

发送到远程服务器

# 客户端配置 /etc/rsyslog.conf
*.*    @@logserver.example.com:514
 
# 服务端配置 /etc/rsyslog.conf
# 加载模块
module(load="imtcp")
input(type="imtcp" port="514")
 
# 按主机分开存储
$template RemoteLogs,"/var/log/%HOSTNAME%/%PROGRAMNAME%.log"
*.*    ?RemoteLogs

快速参考

命令说明
journalctl查看systemd日志
journalctl -f实时日志
journalctl -u service按服务过滤
journalctl --since "1h ago"时间过滤
journalctl -p err错误级别
tail -f /var/log/syslog实时查看文件
grep "error" /var/log/syslog搜索日志
journalctl --disk-usage日志空间
logrotate -f /etc/logrotate.conf强制轮转