日志管理和分析
日志是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
故障排除
常见日志问题
-
日志文件过大
# 检查日志文件大小
du -sh /var/log/*
# 配置日志轮转
sudo logrotate -f /etc/logrotate.conf -
日志服务故障
# 检查rsyslog服务状态
sudo systemctl status rsyslog
# 检查systemd-journald服务状态
sudo systemctl status systemd-journald
# 重启日志服务
sudo systemctl restart rsyslog -
日志丢失
# 检查磁盘空间
df -h
# 检查日志配置
cat /etc/rsyslog.conf
# 检查日志轮转配置
cat /etc/logrotate.conf
通过掌握日志管理和分析技能,你可以更好地监控系统运行状态,及时发现和解决问题,保障系统的稳定运行。