Linux日志分析工具及应用 ---语法详解与实战案例
系统环境:CentOS Stream 9 / RHEL 9 / Ubuntu 24.04
核心工具:rsyslog, logrotate, logwatch, Bash, Python
目标:掌握 Linux 日志管理、轮替、分析、监控全流程
一、Linux 日志文件的类型
Linux 系统日志主要分为以下几类:
| 类型 | 说明 | 默认路径 | 示例文件 |
|---|---|---|---|
| 系统日志 | 内核、系统服务、启动过程日志 | /var/log/ |
messages, dmesg, boot.log |
| 安全日志 | 登录、认证、sudo、fail2ban | /var/log/ |
secure(RHEL), auth.log(Ubuntu) |
| 应用日志 | Nginx, Apache, MySQL, Docker 等 | /var/log/ 或自定义路径 |
nginx/access.log, mysql/error.log |
| 审计日志 | 系统审计(auditd) | /var/log/audit/ |
audit.log |
| 计划任务日志 | cron 任务执行记录 | /var/log/ |
cron |
| 邮件日志 | postfix/sendmail 邮件系统 | /var/log/ |
maillog |
✅ 查看常见日志路径:
bash
# RHEL/CentOS
ls -l /var/log/messages /var/log/secure /var/log/cron /var/log/maillog
# Ubuntu/Debian
ls -l /var/log/syslog /var/log/auth.log /var/log/cron.log /var/log/mail.log
✅ 实时查看日志(tail -f):
bash
# 实时监控系统日志
tail -f /var/log/messages
# 监控安全日志(登录尝试)
tail -f /var/log/secure
# 监控 cron 任务
tail -f /var/log/cron
二、系统服务日志 ------ rsyslogd 详解
2.1 rsyslogd 简介
rsyslogd 是 Linux 默认的日志守护进程,负责接收、过滤、转发系统和应用程序日志。
支持:
- 本地日志记录
- 远程日志服务器(TCP/UDP)
- 数据库写入(MySQL, PostgreSQL)
- 模板自定义格式
- TLS 加密传输
✅ 查看 rsyslog 状态:
bash
systemctl status rsyslog
✅ 配置文件路径:
bash
/etc/rsyslog.conf # 主配置文件
/etc/rsyslog.d/*.conf # 模块化配置(推荐)
2.2 rsyslogd 配置语法详解
✅ 基础语法格式:
facility.priority action
- facility:日志来源(auth, cron, kern, mail, user, local0-7 等)
- priority:日志级别(debug, info, notice, warning, err, crit, alert, emerg)
- action:输出目标(文件、用户、远程主机、数据库等)
✅ 示例:
/etc/rsyslog.conf片段
conf
# 记录所有 mail 服务的 warning 及以上级别日志到 /var/log/mail.warn
mail.warning /var/log/mail.warn
# 记录所有 cron 服务的日志到 /var/log/mycron.log
cron.* /var/log/mycron.log
# 将所有 local0 设施的日志发送到远程日志服务器 192.168.1.100 UDP 514
local0.* @192.168.1.100:514
# 使用 TCP(更可靠)
local0.* @@192.168.1.100:514
# 发送给指定用户(需在线)
*.emerg :omusrmsg:*
# 使用模板自定义格式(见下文)
✅ 常用 facility:
| facility | 说明 |
|---|---|
| auth / authpriv | 认证相关(如 ssh, sudo) |
| cron | 定时任务 |
| daemon | 系统守护进程 |
| kern | 内核消息 |
| 邮件系统 | |
| user | 用户进程 |
| local0 - local7 | 自定义应用日志(推荐使用) |
✅ 常用 priority(从低到高):
debug < info < notice < warning < err < crit < alert < emerg
✅ 通配符:
*:所有级别none:不记录!=:不等于某级别;:分隔多个规则
2.3 rsyslogd 实战配置案例
✅ 案例1:为自定义应用(如 myapp)配置 local3 日志
bash
# 创建日志目录
sudo mkdir -p /var/log/myapp
# 创建配置文件 /etc/rsyslog.d/10-myapp.conf
sudo tee /etc/rsyslog.d/10-myapp.conf <<EOF
# 记录 local3 所有日志到 /var/log/myapp/app.log
local3.* /var/log/myapp/app.log
# 同时记录 warning 及以上到单独文件
local3.warning /var/log/myapp/app.warn
# 重启 rsyslog 生效
EOF
# 重启服务
sudo systemctl restart rsyslog
# 测试写入日志(logger 命令)
logger -p local3.info "This is an INFO message from myapp"
logger -p local3.err "This is an ERROR message from myapp"
# 查看日志
tail /var/log/myapp/app.log
tail /var/log/myapp/app.warn
✅ 案例2:配置远程日志服务器(客户端)
conf
# /etc/rsyslog.d/20-remote.conf
# 发送所有日志到远程服务器(UDP)
*.* @192.168.1.100:514
# 或使用 TCP(更可靠)
# *.* @@192.168.1.100:514
# 重启
sudo systemctl restart rsyslog
✅ 案例3:使用模板自定义日志格式
conf
# /etc/rsyslog.d/30-template.conf
# 定义模板
template(name="MyTemplate" type="string"
string="%TIMESTAMP% %HOSTNAME% %syslogtag%%msg%\n")
# 应用模板
local3.* /var/log/myapp/app.log;MyTemplate
# 重启
sudo systemctl restart rsyslog
输出示例:
2025-09-16T16:30:45+08:00 myserver myapp[1234]: This is a test message
三、日志的轮替 ------ logrotate 详解
3.1 logrotate 简介
logrotate 是 Linux 系统默认的日志轮替工具,用于:
- 防止日志文件无限增长
- 按时间/大小自动切割
- 压缩旧日志
- 删除过期日志
- 执行 postrotate 脚本(如重启服务)
✅ 默认配置目录:
bash
/etc/logrotate.conf # 主配置
/etc/logrotate.d/ # 服务专属配置(推荐)
✅ 手动执行轮替(测试用):
bash
sudo logrotate -vf /etc/logrotate.conf
参数说明:
-v:verbose,显示详细过程-f:force,强制执行(即使未到轮替时间)
3.2 logrotate 配置语法详解
✅ 基础语法结构:
conf
/path/to/logfile {
option1
option2
...
postrotate
command
endscript
}
✅ 常用选项:
| 选项 | 说明 |
|---|---|
daily / weekly / monthly |
轮替周期 |
size 100M |
按大小轮替(如 100M, 1G) |
rotate 5 |
保留最近 5 个归档 |
compress |
压缩旧日志(gzip) |
delaycompress |
延迟压缩(保留最新一个不压缩) |
missingok |
日志文件不存在时不报错 |
notifempty |
日志为空时不轮替 |
create 644 root root |
轮替后创建新文件(权限、属主) |
sharedscripts |
多个日志文件共享 postrotate 脚本 |
postrotate ... endscript |
轮替后执行的脚本 |
3.3 logrotate 实战配置案例
✅ 案例1:为自定义应用日志配置轮替
bash
# 创建配置文件 /etc/logrotate.d/myapp
sudo tee /etc/logrotate.d/myapp <<EOF
/var/log/myapp/*.log {
daily # 每天轮替
rotate 7 # 保留7份
compress # 压缩
delaycompress # 延迟压缩(最新一份不压缩)
missingok # 文件不存在不报错
notifempty # 文件为空不轮替
create 644 root root # 创建新文件,权限644,属主root
sharedscripts # 多个日志共享脚本
postrotate
/usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
EOF
# 测试配置语法
sudo logrotate -d /etc/logrotate.d/myapp
# 强制执行轮替(测试)
sudo logrotate -vf /etc/logrotate.d/myapp
# 查看结果
ls -l /var/log/myapp/
# 应出现 app.log.1, app.log.2.gz 等
✅ 案例2:按大小轮替(适合高流量应用)
conf
/var/log/nginx/access.log {
size 1G # 超过1G就轮替
rotate 10
compress
delaycompress
missingok
notifempty
create 644 nginx nginx
postrotate
/usr/bin/kill -USR1 $(cat /run/nginx.pid 2>/dev/null) 2>/dev/null || true
endscript
}
✅ 案例3:多日志文件 + 自定义脚本
conf
/var/log/myapp/app.log
/var/log/myapp/error.log {
weekly
rotate 4
compress
create 644 appuser appgroup
postrotate
echo "[$(date)] Log rotated for myapp" >> /var/log/myapp/rotate.log
/usr/local/bin/notify-admin.sh # 自定义通知脚本
endscript
}
四、日志分析脚本
4.1 Bash 脚本案例:统计失败登录次数
✅ 脚本:
/usr/local/bin/analyze-secure.sh
bash
#!/bin/bash
# 功能:分析 /var/log/secure,统计失败登录IP和次数
# 适用:RHEL/CentOS
LOG_FILE="/var/log/secure"
OUTPUT_FILE="/tmp/failed_logins_$(date +%Y%m%d).txt"
echo "=== Failed SSH Login Attempts ===" > "$OUTPUT_FILE"
echo "Generated on: $(date)" >> "$OUTPUT_FILE"
echo "=================================" >> "$OUTPUT_FILE"
# 提取包含 "Failed password" 的行,提取IP,排序统计
grep "Failed password" "$LOG_FILE" | \
awk '{for(i=1;i<=NF;i++) if($i ~ /^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/) print $i}' | \
sort | uniq -c | sort -nr >> "$OUTPUT_FILE"
echo "Analysis complete. Report saved to: $OUTPUT_FILE"
cat "$OUTPUT_FILE"
✅ 设置可执行权限并运行:
bash
sudo chmod +x /usr/local/bin/analyze-secure.sh
sudo /usr/local/bin/analyze-secure.sh
输出示例:
=== Failed SSH Login Attempts ===
Generated on: Tue Sep 16 16:45:00 CST 2025
=================================
120 192.168.1.100
45 203.0.113.5
12 198.51.100.22
4.2 Python 脚本案例:实时监控日志并告警
✅ 脚本:
/usr/local/bin/log-monitor.py
python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
功能:实时监控日志文件,发现关键词(如 ERROR, CRITICAL)时发送告警
支持:邮件、企业微信、钉钉、Slack(本例为打印到控制台 + 写入告警文件)
"""
import time
import os
import sys
# 配置
LOG_FILE = "/var/log/messages"
ALERT_FILE = "/tmp/log_alerts.txt"
KEYWORDS = ["ERROR", "CRITICAL", "FAILED", "DENIED"]
def follow(file):
"""生成器:类似 tail -f"""
file.seek(0, os.SEEK_END) # 移动到文件末尾
while True:
line = file.readline()
if not line:
time.sleep(0.1) # 无新内容,休眠
continue
yield line
def send_alert(message):
"""发送告警(此处简化为写入文件和打印)"""
alert_msg = f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] ALERT: {message}"
print(alert_msg)
with open(ALERT_FILE, "a") as f:
f.write(alert_msg + "\n")
def main():
print(f"开始监控日志文件: {LOG_FILE}")
print(f"关键词: {KEYWORDS}")
print(f"告警将写入: {ALERT_FILE}")
print("-" * 50)
try:
with open(LOG_FILE, "r") as f:
for line in follow(f):
for keyword in KEYWORDS:
if keyword in line:
send_alert(f"发现关键词 '{keyword}' => {line.strip()}")
break # 避免同一行多次触发
except KeyboardInterrupt:
print("\n监控已停止。")
except FileNotFoundError:
print(f"错误:日志文件 {LOG_FILE} 不存在!")
sys.exit(1)
if __name__ == "__main__":
main()
✅ 设置权限并后台运行:
bash
sudo chmod +x /usr/local/bin/log-monitor.py
# 后台运行(推荐使用 screen 或 systemd)
nohup /usr/local/bin/log-monitor.py > /tmp/log-monitor.log 2>&1 &
# 查看告警
tail -f /tmp/log_alerts.txt
五、logwatch 套件详解
5.1 logwatch 简介
logwatch 是一个可定制的日志分析和报告工具,每日自动分析系统日志并生成摘要报告(邮件或控制台输出)。
分析内容包括:
- SSH 登录统计
- 磁盘空间
- 安全事件
- 服务状态(httpd, nginx, mysql等)
- 系统重启/关机记录
5.2 logwatch 安装
✅ CentOS Stream 9 / RHEL 9:
bash
sudo dnf install -y logwatch
✅ Ubuntu 24.04:
bash
sudo apt update
sudo apt install -y logwatch
5.3 logwatch 配置详解
✅ 主配置文件:
bash
/usr/share/logwatch/default.conf/logwatch.conf
✅ 用户自定义配置(推荐):
bash
sudo mkdir -p /etc/logwatch/conf
sudo cp /usr/share/logwatch/default.conf/logwatch.conf /etc/logwatch/conf/
✅ 常用配置项(
/etc/logwatch/conf/logwatch.conf):
conf
# 输出格式:text, html, mail
Output = mail
# 发送给谁(默认 root,可改为 admin@example.com)
MailTo = root
# 报告详细程度:Low, Medium, High
Detail = High
# 分析哪一天的日志:Yesterday, Today, All
Range = yesterday
# 服务过滤:只分析指定服务
Service = sshd
Service = http
Service = kernel
# 排除服务
Service = "-zz-network" # 排除网络服务
5.4 logwatch 使用案例
✅ 手动生成今日报告(输出到控制台):
bash
sudo logwatch --output stdout --format text --range today
✅ 生成 HTML 报告并保存:
bash
sudo logwatch --output file --filename /tmp/report.html --format html --range today
✅ 只分析 SSH 服务:
bash
sudo logwatch --service sshd --output stdout
✅ 自定义时间范围(如过去7天):
bash
sudo logwatch --range 'between -7 days and today' --output stdout
✅ 示例输出片段:
################### Logwatch 8.0.1 (04/10/21) ####################
Processing Initiated: Tue Sep 16 17:00:00 2025
Date Range Processed: yesterday
( 2025-Sep-15 )
Period is day.
Detail Level of Output: 5
Type of Output: stdout
Logfiles for Host: myserver.example.com
##################################################################
--------------------- SSHD Begin ------------------------
Users logging in through sshd:
root:
192.168.1.5 (ssh): 5 times
203.0.113.10: 1 time
Failed logins from:
192.168.1.100: 120 times
203.0.113.5: 45 times
---------------------- SSHD End -------------------------
✅ 设置定时任务(每天早上7点发送邮件报告):
bash
# 编辑 root 的 crontab
sudo crontab -e
# 添加以下行
0 7 * * * /usr/sbin/logwatch --output mail --format html --mailto admin@example.com
六、综合性实战案例
案例1:自动化日志监控与告警系统
目标:
- 每日自动轮替应用日志
- 实时监控错误日志并发送告警
- 每日生成安全报告邮件
- 失败登录IP自动加入防火墙黑名单(可选)
✅ 步骤1:配置 logrotate(如前所述)
✅ 步骤2:部署 Python 监控脚本(如前所述)并注册为 systemd 服务
ini
# /etc/systemd/system/log-monitor.service
[Unit]
Description=Log Monitor Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/log-monitor.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
bash
sudo systemctl daemon-reload
sudo systemctl enable log-monitor.service
sudo systemctl start log-monitor.service
✅ 步骤3:配置 logwatch 每日邮件报告(如前所述)
✅ 步骤4(可选):自动封禁恶意IP(需安装 fail2ban 或自定义脚本)
bash
# 简单脚本:从分析报告中提取IP并加入防火墙
# /usr/local/bin/ban-ips.sh
#!/bin/bash
LOG="/tmp/failed_logins_$(date +%Y%m%d).txt"
if [ -f "$LOG" ]; then
grep -E '^[[:space:]]+[0-9]+' "$LOG" | while read count ip rest; do
if [ "$count" -gt 10 ]; then # 超过10次失败
echo "Blocking IP: $ip (failed $count times)"
sudo firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' reject"
fi
done
sudo firewall-cmd --reload
fi
✅ 添加到 logwatch 后执行(修改
/etc/cron.daily/0logwatch):
bash
# 在 logwatch 命令后添加
/usr/local/bin/analyze-secure.sh
/usr/local/bin/ban-ips.sh
案例2:集中式日志服务器(rsyslog + logrotate + logwatch)
架构:
Client1 (rsyslog) ----\
Client2 (rsyslog) -----> Server (rsyslog + logrotate + logwatch)
Client3 (rsyslog) ----/
✅ 服务端配置(
/etc/rsyslog.conf):
conf
# 启用 UDP/TCP 接收
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# 按主机名分类存储
$template RemoteHost,"/var/log/remote/%HOSTNAME%/%$YEAR%-%$MONTH%-%$DAY%.log"
*.* ?RemoteHost
✅ 服务端 logrotate(
/etc/logrotate.d/remote):
conf
/var/log/remote/*/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 644 root root
sharedscripts
postrotate
/usr/bin/systemctl reload rsyslog > /dev/null 2>&1 || true
endscript
}
✅ 服务端 logwatch 配置(分析所有主机):
conf
# /etc/logwatch/conf/logwatch.conf
Service = All
Detail = Medium
MailTo = noc@example.com
✅ 本章小结 & 最佳实践
- 日志分类管理:不同应用使用不同 facility(如 local0-local7)
- 轮替策略:按时间和大小双重保障,避免磁盘爆满
- 权限安全:日志文件设置合适权限(640),避免敏感信息泄露
- 集中管理:生产环境建议部署集中式日志服务器
- 自动化分析:结合 logwatch + 自定义脚本 + 告警
- 备份归档:重要日志定期备份到异地或对象存储
- 合规审计:保留日志至少6个月(根据行业法规)
📚 附录:常用命令速查表
| 功能 | 命令 |
|---|---|
| 查看系统日志 | tail -f /var/log/messages |
| 查看安全日志 | tail -f /var/log/secure |
| 手动写入日志 | logger -p local0.info "Test message" |
| 测试 logrotate | sudo logrotate -vf /etc/logrotate.d/myapp |
| 生成 logwatch 报告 | sudo logwatch --output stdout --range today |
| 实时监控日志 | sudo /usr/local/bin/log-monitor.py |
| 查看 rsyslog 状态 | systemctl status rsyslog |
| 重载 rsyslog | sudo systemctl reload rsyslog |
🧩 扩展项目建议
- ELK Stack 集成:Filebeat + Logstash + Elasticsearch + Kibana
- 日志审计系统:对接审计数据库,生成合规报告
- AI 异常检测:Python + Scikit-learn 分析日志模式
- 可视化仪表盘:Grafana + Loki + Promtail
- 日志加密传输:rsyslog + TLS 配置
这份文档覆盖了 Linux 日志管理的全部核心知识点 + 语法细节 + 配置说明 + 实用脚本 + 综合项目,所有配置和代码均含详细注释,可直接用于教学、自学或生产环境参考。