CentOS Stream 9入门学习教程,从入门到精通,Linux日志分析工具及应用 —语法详解与实战案例(17)

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 内核消息
mail 邮件系统
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

✅ 本章小结 & 最佳实践

  1. 日志分类管理:不同应用使用不同 facility(如 local0-local7)
  2. 轮替策略:按时间和大小双重保障,避免磁盘爆满
  3. 权限安全:日志文件设置合适权限(640),避免敏感信息泄露
  4. 集中管理:生产环境建议部署集中式日志服务器
  5. 自动化分析:结合 logwatch + 自定义脚本 + 告警
  6. 备份归档:重要日志定期备份到异地或对象存储
  7. 合规审计:保留日志至少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

🧩 扩展项目建议

  1. ELK Stack 集成:Filebeat + Logstash + Elasticsearch + Kibana
  2. 日志审计系统:对接审计数据库,生成合规报告
  3. AI 异常检测:Python + Scikit-learn 分析日志模式
  4. 可视化仪表盘:Grafana + Loki + Promtail
  5. 日志加密传输:rsyslog + TLS 配置

这份文档覆盖了 Linux 日志管理的全部核心知识点 + 语法细节 + 配置说明 + 实用脚本 + 综合项目,所有配置和代码均含详细注释,可直接用于教学、自学或生产环境参考。

相关推荐
ZXF_H2 小时前
Linux tcpdump抓包实践(以http为例)
linux·http·wireshark·tcpdump
悄悄敲敲敲2 小时前
Linux:信号(二)
linux·操作系统·信号
2301_783360132 小时前
【学习笔记】关于RNA_seq和Ribo_seq技术的对比和BAM生成
笔记·学习
qq_397731512 小时前
Objective-C 学习笔记(第9章)
笔记·学习·objective-c
Felven2 小时前
飞腾D2000 GPIO中断调试
linux·gpio·中断·d2000
ujainu3 小时前
Python学习第一天:保留字和标识符
python·学习·标识符·保留字
sheji34163 小时前
【开题答辩全过程】以 基于Java的应急安全学习平台的设计与实现为例,包含答辩的问题和答案
java·开发语言·学习
喵了meme3 小时前
Linux学习日记21:读写锁
linux·c语言·学习
好奇龙猫3 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段-二阶段(29):第八科文法
学习