Skip to main content

日志管理和分析

日志是Linux系统的重要组成部分,记录了系统运行过程中的各种事件和错误信息。有效地管理和分析日志对于系统维护和故障排除至关重要。

Linux日志系统概述

Linux系统使用rsyslog或syslog-ng等日志服务来管理系统日志。日志信息通常存储在/var/log目录下。

主要日志文件

# 系统日志
/var/log/messages # CentOS/RHEL系统日志
/var/log/syslog # Ubuntu/Debian系统日志

# 认证日志
/var/log/auth.log # 认证相关日志(Ubuntu/Debian)
/var/log/secure # 认证相关日志(CentOS/RHEL)

# 内核日志
/var/log/kern.log # 内核日志

# 引导日志
/var/log/boot.log # 系统启动日志

# 应用程序日志
/var/log/apache2/ # Apache Web服务器日志
/var/log/nginx/ # Nginx Web服务器日志
/var/log/mysql/ # MySQL数据库日志

rsyslog配置

配置文件

# 主配置文件
/etc/rsyslog.conf

# 配置片段目录
/etc/rsyslog.d/

# 重启rsyslog服务
sudo systemctl restart rsyslog

基本配置语法

# 格式:设施.优先级  动作

# 将所有认证信息记录到/var/log/auth.log
auth.* /var/log/auth.log

# 将所有日志记录到远程服务器
*.* @remote-server:514

# 将紧急消息发送到所有用户
*.emerg :omusrmsg:*

# 将邮件日志记录到特定文件
mail.* /var/log/mail.log

journalctl命令

现代Linux系统使用systemd-journald服务来管理系统日志。

基本用法

# 查看所有日志
journalctl

# 查看最近的日志
journalctl -n

# 实时查看日志
journalctl -f

# 查看特定服务的日志
journalctl -u service_name

# 查看特定时间范围的日志
journalctl --since "2023-01-01" --until "2023-01-02"

# 查看特定优先级的日志
journalctl -p err

# 查看特定进程的日志
journalctl _PID=1234

高级用法

# 以JSON格式输出
journalctl -o json

# 显示详细信息
journalctl -o verbose

# 查看启动日志
journalctl -b

# 查看上一次启动的日志
journalctl -b -1

# 查看特定用户的服务日志
journalctl _UID=1000

# 导出日志到文件
journalctl --since today --output export > log.export

日志分析工具

grep命令

grep是最基本的日志搜索工具。

# 搜索包含特定关键词的日志
grep "error" /var/log/syslog

# 忽略大小写搜索
grep -i "error" /var/log/syslog

# 显示匹配行的行号
grep -n "error" /var/log/syslog

# 反向搜索(不包含关键词的行)
grep -v "info" /var/log/syslog

# 搜索多个文件
grep "error" /var/log/*.log

# 递归搜索目录
grep -r "error" /var/log/

awk命令

awk用于处理结构化日志数据。

# 提取日志中的特定字段
awk '{print $1, $2, $3}' /var/log/syslog

# 统计日志中的错误数量
awk '/error/ {count++} END {print count}' /var/log/syslog

# 按小时统计日志条数
awk '{print $2}' /var/log/syslog | cut -d: -f1 | sort | uniq -c

# 查找最频繁出现的IP地址
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

sed命令

sed用于编辑和处理日志文件。

# 删除包含特定关键词的行
sed '/debug/d' /var/log/syslog

# 替换特定文本
sed 's/old/new/g' /var/log/syslog

# 在匹配行前插入文本
sed '/error/i\*** WARNING ***' /var/log/syslog

# 从匹配行到文件末尾删除
sed '/start_pattern/,$d' /var/log/syslog

日志轮转

日志轮转是定期归档和清理日志文件的过程,防止日志文件过大占用过多磁盘空间。

logrotate配置

# 主配置文件
/etc/logrotate.conf

# 配置片段目录
/etc/logrotate.d/

# 手动执行日志轮转
sudo logrotate -f /etc/logrotate.conf

配置示例

# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 52
compress
delaycompress
notifempty
create 640 nginx adm
sharedscripts
postrotate
[ -f /var/run/nginx.pid ] && kill -USR1 `cat /var/run/nginx.pid`
endscript
}

实时日志监控

tail命令

tail命令用于实时监控日志文件的变化。

# 实时查看日志
tail -f /var/log/syslog

# 查看多个文件
tail -f /var/log/*.log

# 显示最后100行并实时监控
tail -n 100 -f /var/log/syslog

# 监控特定关键词
tail -f /var/log/syslog | grep --line-buffered "error"

multitail命令

multitail是增强版的tail命令,可以同时监控多个日志文件。

# 安装multitail(Ubuntu/Debian)
sudo apt install multitail

# 安装multitail(CentOS/RHEL)
sudo yum install multitail

# 监控多个日志文件
multitail /var/log/syslog /var/log/auth.log

# 为不同文件设置不同颜色
multitail -c /var/log/syslog -c /var/log/auth.log

日志分析实践

Web服务器日志分析

# 统计访问IP排名
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head -10

# 统计HTTP状态码
awk '{print $9}' access.log | sort | uniq -c | sort -nr

# 统计最常访问的页面
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head -10

# 统计流量大小
awk '{sum+=$10} END {print "Total bytes:", sum}' access.log

# 查找404错误
grep " 404 " access.log | awk '{print $7}' | sort | uniq -c | sort -nr

系统安全日志分析

# 查找失败的登录尝试
grep "Failed password" /var/log/auth.log

# 统计失败登录的IP地址
grep "Failed password" /var/log/auth.log | awk '{print $(NF-3)}' | sort | uniq -c | sort -nr

# 查找成功的登录记录
grep "Accepted password" /var/log/auth.log

# 查找sudo命令使用记录
grep "sudo:" /var/log/auth.log

日志管理脚本

日志清理脚本

#!/bin/bash
# log_cleanup.sh - 日志清理脚本

# 设置保留天数
RETENTION_DAYS=30

# 清理旧的系统日志
find /var/log -name "*.log" -type f -mtime +$RETENTION_DAYS -delete

# 清理旧的压缩日志
find /var/log -name "*.log.*" -type f -mtime +$RETENTION_DAYS -delete

# 清理临时日志
find /tmp -name "*.log" -type f -mtime +7 -delete

echo "日志清理完成"

日志分析报告脚本

#!/bin/bash
# log_analysis.sh - 日志分析报告脚本

REPORT_FILE="/tmp/log_analysis_$(date +%Y%m%d).txt"

echo "=== 系统日志分析报告 ===" > $REPORT_FILE
echo "生成时间: $(date)" >> $REPORT_FILE
echo >> $REPORT_FILE

echo "=== 系统错误统计 ===" >> $REPORT_FILE
grep -i "error\|critical\|fatal" /var/log/syslog | wc -l >> $REPORT_FILE

echo "=== 认证失败统计 ===" >> $REPORT_FILE
grep "Failed password" /var/log/auth.log | wc -l >> $REPORT_FILE

echo "=== 磁盘空间警告 ===" >> $REPORT_FILE
grep -i "space" /var/log/syslog | wc -l >> $REPORT_FILE

echo "=== 网络错误统计 ===" >> $REPORT_FILE
grep -i "network\|connection" /var/log/syslog | wc -l >> $REPORT_FILE

echo "报告已生成: $REPORT_FILE"

日志安全

日志权限管理

# 设置日志文件权限
sudo chmod 640 /var/log/syslog
sudo chown root:adm /var/log/syslog

# 设置日志目录权限
sudo chmod 750 /var/log
sudo chown root:root /var/log

日志完整性保护

# 启用日志审计
sudo auditctl -w /var/log -p wa -k log_access

# 查看审计日志
sudo ausearch -k log_access

故障排除

常见日志问题

  1. 日志文件过大

    # 检查日志文件大小
    du -sh /var/log/*

    # 配置日志轮转
    sudo logrotate -f /etc/logrotate.conf
  2. 日志服务故障

    # 检查rsyslog服务状态
    sudo systemctl status rsyslog

    # 检查systemd-journald服务状态
    sudo systemctl status systemd-journald

    # 重启日志服务
    sudo systemctl restart rsyslog
  3. 日志丢失

    # 检查磁盘空间
    df -h

    # 检查日志配置
    cat /etc/rsyslog.conf

    # 检查日志轮转配置
    cat /etc/logrotate.conf

通过掌握日志管理和分析技能,你可以更好地监控系统运行状态,及时发现和解决问题,保障系统的稳定运行。