🎉 限时公测|限量体验29元4核8G39元8核16G云开发环境一个月,助力Vibe Coding新时代!

Linux 日志管理 - rsyslog、journalctl 与日志轮转

初级

深入学习Ubuntu 24.10 Server日志管理的核心技术,掌握rsyslog配置、systemd journalctl使用、logrotate日志轮转和日志分析技巧。通过生活化类比和渐进式实践,让初学者轻松掌握日志管理技能。

未知
easylearning团队
更新于 2025-01-23

🚀 实践环境(SSH)

欢迎使用Easylearning为您专属打磨的自由学习实践环境, 登录后马上开始边学边练吧!

StudyBoard

创建StudyBoard练习实例,系统自动连接到实例后,可以在教程中直接发送远程命令到实例中执行并能查看结果,享受更好的学习体验。

Linux 日志管理 - rsyslog、journalctl 与日志轮转

日志管理是Linux系统运维的核心技能,就像医院的病历记录系统一样重要。在掌握了系统监控的基础上,我们现在要学习如何管理系统的"记录档案",通过日志来追踪系统行为、诊断问题和保障安全。本教程将通过生活化类比和实践操作,帮助您掌握日志管理的核心技能。

🎯 学习目标

完成本章学习后,您将能够:

  • 日志概念理解: 深入理解Linux日志系统的架构和在运维中的核心作用
  • journalctl掌握: 熟练使用systemd journalctl查看和分析二进制日志
  • rsyslog配置: 掌握传统rsyslog的配置、过滤和转发技术
  • 日志轮转管理: 学会使用logrotate进行日志轮转和存储优化
  • 分析诊断技能: 掌握日志分析技巧和基于日志的故障排除方法

🏗️ Linux 日志系统核心概念

日志管理是什么?

官方定义: 根据Linux官方文档,日志管理是一种系统化收集、存储、分析和维护计算机系统运行记录的技术和过程,通过记录系统事件、用户活动、应用程序行为和安全事件,为系统管理员提供故障诊断、性能分析、安全审计和合规性检查的科学依据

生活化类比: 日志管理就像现代化的智能医院病历系统

  • 病历记录 = 系统日志,记录每个"患者"(进程)的"病史"
  • 医生查房记录 = 系统事件日志,记录"医生"(管理员)的操作
  • 化验报告 = 性能日志,记录系统"体检"数据
  • 护理记录 = 应用日志,记录日常"护理"(服务运行)情况
  • 病历归档 = 日志轮转,定期整理和存储历史记录
  • 病历检索 = 日志查询,快速找到相关"病史"信息
  • 会诊记录 = 集中日志,多个"科室"(服务器)的信息汇总

为什么日志管理如此重要?

在上一节系统监控中,我们学会了如何实时观察系统状态。但是,仅仅实时监控是不够的,我们还需要历史记录来分析问题的根本原因,就像医生需要病历来了解病情发展过程一样。

日志管理的核心价值

🔍 故障诊断价值

  • 问题追溯:当Web服务器出现500错误时,通过日志追踪错误发生的具体时间和原因
  • 根因分析:分析系统崩溃前的日志记录,找到导致问题的根本原因
  • 影响评估:通过日志分析了解故障影响的范围和持续时间

🛡️ 安全审计价值

  • 入侵检测:监控登录日志,发现异常的登录尝试和可疑活动
  • 权限审计:记录sudo使用情况,确保权限使用的合规性
  • 数据保护:通过访问日志监控敏感数据的访问情况

📊 性能优化价值

  • 趋势分析:通过历史日志分析系统性能变化趋势
  • 容量规划:基于日志数据预测资源需求和扩容时机
  • 优化指导:识别性能瓶颈和优化机会

日志系统架构详解

Linux日志系统经历了从传统syslog到现代systemd journal的演进,形成了多层次、多格式的日志管理体系。理解这个架构对于有效的日志管理至关重要。

日志系统演进历程:

  • 传统阶段:基于syslog协议的文本日志,简单但功能有限
  • 现代阶段:systemd引入二进制日志,提供更丰富的元数据和查询能力
  • 混合阶段:当前系统同时支持两种方式,实现兼容性和功能性的平衡

各层详细说明:

日志生成层

  • 内核日志:通过printk()函数生成,记录硬件初始化、驱动加载、系统调用等信息
  • 系统服务:systemd管理的服务通过标准输出/错误输出生成日志
  • 用户程序:应用程序通过syslog()系统调用或直接写文件生成日志

日志收集层

  • systemd-journald:现代日志守护进程,收集所有系统日志并以二进制格式存储
  • rsyslog:传统syslog守护进程,处理文本格式日志,支持网络传输
  • syslog API:标准接口,应用程序通过此接口发送日志消息

日志存储层

  • Journal文件:二进制格式,存储在/var/log/journal/,支持索引和快速查询
  • 文本日志:传统格式,存储在/var/log/目录下,便于人工阅读和脚本处理
  • 远程日志:通过网络发送到集中式日志服务器,实现统一管理

日志级别和设施详解

Syslog协议定义了标准化的日志分类体系,通过优先级(Priority)和设施(Facility)两个维度对日志进行分类管理。

优先级系统详解:

优先级采用数字编码,数字越小表示越紧急,这种设计便于程序处理和过滤:

紧急级别(0-3)

  • emerg(0):系统完全不可用,如内核崩溃、硬件故障
  • alert(1):必须立即采取行动,如文件系统损坏、安全入侵
  • crit(2):严重错误条件,如硬件错误、重要服务失败
  • err(3):一般错误条件,如配置错误、网络连接失败

警告级别(4-7)

  • warning(4):警告信息,如磁盘空间不足、性能下降
  • notice(5):正常但重要的信息,如服务启动、用户登录
  • info(6):一般信息性消息,如操作记录、状态更新
  • debug(7):调试信息,如详细的程序执行流程

设施系统详解:

设施用于标识日志消息的来源类型,便于分类存储和处理:

  • kern:内核消息,系统核心组件产生的日志
  • user:用户级程序,普通用户程序产生的日志
  • mail:邮件系统,邮件服务器和客户端日志
  • daemon:系统守护进程,后台服务程序日志
  • auth/authpriv:认证和授权,登录、sudo等安全相关日志
  • syslog:syslog守护进程本身的日志
  • local0-7:本地使用设施,可自定义用途

日志级别和设施详解

Syslog协议定义了标准化的日志分类体系,通过优先级(Priority)和设施(Facility)两个维度对日志进行分类管理。

优先级系统详解:

优先级采用数字编码,数字越小表示越紧急,这种设计便于程序处理和过滤:

紧急级别(0-3)

  • emerg(0):系统完全不可用,如内核崩溃、硬件故障
  • alert(1):必须立即采取行动,如文件系统损坏、安全入侵
  • crit(2):严重错误条件,如硬件错误、重要服务失败
  • err(3):一般错误条件,如配置错误、网络连接失败

警告级别(4-7)

  • warning(4):警告信息,如磁盘空间不足、性能下降
  • notice(5):正常但重要的信息,如服务启动、用户登录
  • info(6):一般信息性消息,如操作记录、状态更新
  • debug(7):调试信息,如详细的程序执行流程

设施系统详解:

设施用于标识日志消息的来源类型,便于分类存储和处理:

  • kern:内核消息,系统核心组件产生的日志
  • user:用户级程序,普通用户程序产生的日志
  • mail:邮件系统,邮件服务器和客户端日志
  • daemon:系统守护进程,后台服务程序日志
  • auth/authpriv:认证和授权,登录、sudo等安全相关日志
  • syslog:syslog守护进程本身的日志
  • local0-7:本地使用设施,可自定义用途

📋 systemd Journal 日志管理

journalctl 是什么?

官方定义: 根据systemd官方文档,journalctl是一个用于查询和显示systemd journal日志的命令行工具,它提供了强大的过滤、搜索和格式化功能,能够高效地处理二进制格式的结构化日志数据,支持实时跟踪、时间范围查询、服务过滤等多种查询方式

生活化类比: journalctl就像现代化的智能图书馆检索系统

  • 图书馆 = journal日志数据库,存储所有"书籍"(日志记录)
  • 检索终端 = journalctl命令,提供多种查询方式
  • 分类标签 = 日志字段(时间、服务、优先级),便于快速定位
  • 智能搜索 = 过滤功能,根据关键词快速找到相关"书籍"
  • 阅读模式 = 输出格式,可以选择详细或简洁的显示方式
  • 实时更新 = -f参数,像"新书到馆提醒"一样实时显示新日志

journalctl 基础使用详解

systemd journal是现代Linux系统的核心日志组件,它采用二进制格式存储日志,提供了强大的查询和过滤功能。与传统文本日志相比,journal具有更丰富的元数据和更高的查询效率。

journalctl工作原理:

二进制存储优势

  • 结构化数据:每条日志包含时间戳、优先级、来源等结构化字段
  • 索引优化:内置索引机制,支持快速查询和过滤
  • 完整性保护:支持数字签名和校验,防止日志篡改
  • 压缩存储:自动压缩历史日志,节省存储空间

查询引擎特性

  • 多维过滤:支持按时间、服务、优先级、字段等多维度过滤
  • 实时流式:支持实时跟踪新产生的日志消息
  • 分页显示:自动分页显示,便于浏览大量日志
  • 格式化输出:支持多种输出格式,便于人工阅读和脚本处理
BASH
# 基本日志查看
journalctl                    # 查看所有日志(从最早开始)
journalctl -f                 # 实时跟踪日志(类似 tail -f)
journalctl -n 50              # 显示最近 50 条日志
journalctl -r                 # 逆序显示(最新的在前)
journalctl --no-pager         # 不使用分页器,直接输出
BASH
# 按时间过滤(支持多种时间格式)
journalctl --since "2024-01-01"                    # 从指定日期开始
journalctl --since "2024-01-01 10:00:00"          # 精确到时分秒
journalctl --since yesterday                       # 从昨天开始
journalctl --since "1 hour ago"                   # 最近1小时
journalctl --since "10 minutes ago"               # 最近10分钟
journalctl --until "2024-01-02"                   # 到指定日期结束
journalctl --since "10:00" --until "11:00"        # 时间段查询
BASH
# 按优先级过滤(数字或名称)
journalctl -p err             # 只显示错误级别及以上(0-3)
journalctl -p warning         # 显示警告级别及以上(0-4)
journalctl -p 0..3            # 显示 0-3 级别的日志
journalctl -p debug           # 显示所有级别日志(包括调试)

按服务和单元过滤

BASH
# 按服务过滤 - 查看特定服务的日志
journalctl -u nginx           # 查看 nginx 服务日志
journalctl -u ssh             # 查看 SSH 服务日志
journalctl -u mysql --since today  # 查看今天的 MySQL 日志
 
# 按进程 ID 过滤 - 追踪特定进程
journalctl _PID=1234          # 查看特定进程的日志
journalctl _COMM=nginx        # 按命令名过滤
 
# 按用户过滤 - 查看用户相关活动
journalctl _UID=1000          # 查看特定用户的日志
journalctl _GID=100           # 按组 ID 过滤
 
# 内核日志 - 系统底层信息
journalctl -k                 # 只显示内核日志
journalctl -k --since "1 hour ago"  # 最近一小时的内核日志

Journal 配置管理

BASH
# 查看 Journal 配置
sudo journalctl --header      # 显示 journal 文件头信息
journalctl --disk-usage       # 显示磁盘使用情况
journalctl --list-boots       # 列出所有启动记录
 
# Journal 配置文件
sudo vim /etc/systemd/journald.conf
 
# 主要配置选项:
[Journal]
# 存储方式:persistent(持久化)、volatile(内存)、auto(自动)
Storage=persistent
 
# 最大磁盘使用量
SystemMaxUse=1G
SystemKeepFree=500M
SystemMaxFileSize=100M
 
# 日志保留时间
MaxRetentionSec=1month
MaxFileSec=1week
 
# 日志级别
MaxLevelStore=info
MaxLevelSyslog=info

Journal 维护操作

BASH
# 清理 Journal 日志
sudo journalctl --vacuum-time=30d    # 删除 30 天前的日志
sudo journalctl --vacuum-size=1G     # 保留最近 1GB 的日志
sudo journalctl --vacuum-files=10    # 只保留 10 个日志文件
 
# 验证 Journal 完整性
sudo journalctl --verify             # 验证所有日志文件
sudo journalctl --verify --file=/var/log/journal/*/system.journal
 
# 重启 journald 服务
sudo systemctl restart systemd-journald
sudo systemctl status systemd-journald

📝 rsyslog 传统日志管理

rsyslog 是什么?

官方定义: 根据rsyslog官方文档,rsyslog是一个高性能、模块化的系统日志处理守护进程,实现了标准syslog协议,提供了强大的日志收集、过滤、转换和转发功能,支持多种输入输出模块,能够处理大量日志数据并将其路由到不同的目标位置

生活化类比: rsyslog就像现代化的智能邮政分拣中心

  • 邮政中心 = rsyslog守护进程,处理所有"邮件"(日志消息)
  • 分拣规则 = 配置文件规则,决定"邮件"发送到哪里
  • 邮件分类 = 设施和优先级,按类型和紧急程度分类
  • 投递路线 = 输出目标,可以是本地文件、远程服务器或其他程序
  • 邮件过滤 = 过滤规则,决定哪些"邮件"需要特殊处理
  • 批量处理 = 缓冲机制,提高处理效率

rsyslog 配置文件详解

BASH
# 查看主配置文件
sudo cat /etc/rsyslog.conf
 
# 查看配置文件结构
echo "=== rsyslog配置文件结构 ==="
echo "1. 模块加载部分"
echo "2. 全局指令部分"
echo "3. 规则定义部分"
echo "4. 包含其他配置文件"

基本配置结构解析:

BASH
# 创建示例配置文件用于学习
sudo tee /tmp/rsyslog-example.conf << 'EOF'
# === 模块加载部分 ===
module(load="imuxsock")    # Unix socket 支持,接收本地程序日志
module(load="imklog")      # 内核日志支持,接收内核消息
 
# === 全局指令部分 ===
$WorkDirectory /var/spool/rsyslog    # 工作目录,存储队列文件
$IncludeConfig /etc/rsyslog.d/*.conf # 包含其他配置文件
 
# === 规则定义部分 ===
# 格式:facility.priority    action
# 示例:将info级别及以上的日志写入messages文件,但排除邮件、认证和定时任务日志
*.info;mail.none;authpriv.none;cron.none    /var/log/messages
 
# 认证相关日志单独存储
authpriv.*                                  /var/log/secure
 
# 邮件系统日志
mail.*                                      /var/log/maillog
 
# 定时任务日志
cron.*                                      /var/log/cron
 
# 紧急消息发送给所有登录用户
*.emerg                                     :omusrmsg:*
EOF
 
# 查看示例配置
cat /tmp/rsyslog-example.conf

rsyslog 规则配置实践

BASH
# 创建自定义配置文件
sudo vim /etc/rsyslog.d/50-custom.conf
 
# 在编辑器中输入以下内容:

自定义配置文件内容:

BASH
# === 按设施分类日志 ===
# 邮件系统日志 - 所有邮件相关的消息
mail.*                          /var/log/mail.log
 
# 认证和授权日志 - 登录、sudo等安全相关
auth,authpriv.*                 /var/log/auth.log
 
# 内核日志 - 硬件、驱动相关消息
kern.*                          /var/log/kern.log
 
# === 按优先级过滤 ===
# 只记录错误和更严重的日志(err、crit、alert、emerg)
*.err                           /var/log/error.log
 
# 一般信息日志,但排除邮件和认证日志(避免重复)
*.info;mail.none;authpriv.none  /var/log/messages
 
# === 远程日志转发 ===
# 发送所有日志到远程服务器(TCP方式,更可靠)
*.* @@log-server.example.com:514
 
# === 自动化响应 ===
# 严重错误时执行告警脚本
*.crit ^/usr/local/bin/alert-script.sh
 
# === 日志过滤 ===
# 丢弃包含特定内容的垃圾日志
:msg, contains, "spam message" stop
BASH
# 验证配置文件语法
sudo rsyslogd -N1
 
# 重启rsyslog服务使配置生效
sudo systemctl restart rsyslog
 
# 检查服务状态
sudo systemctl status rsyslog
 
# 测试日志记录
logger -p mail.info "Test mail log message"
logger -p auth.warning "Test auth warning message"
 
# 验证日志是否正确分类
echo "=== 检查邮件日志 ==="
sudo tail -5 /var/log/mail.log
 
echo "=== 检查认证日志 ==="
sudo tail -5 /var/log/auth.log

rsyslog 高级配置

BASH
# 模板定义
sudo vim /etc/rsyslog.d/60-templates.conf
 
# 自定义日志格式模板
template(name="CustomFormat" type="string"
    string="%timestamp:::date-rfc3339% %hostname% %syslogtag% %msg%\n")
 
# 动态文件名模板
template(name="DynamicFile" type="string"
    string="/var/log/%hostname%/%programname%.log")
 
# 使用模板
*.info;mail.none;authpriv.none /var/log/messages;CustomFormat
*.* ?DynamicFile
 
# 过滤器配置
# 基于属性的过滤
:hostname, isequal, "webserver" /var/log/webserver.log
:programname, startswith, "nginx" /var/log/nginx/custom.log
:msg, regex, "ERROR.*database" /var/log/db-errors.log
 
# 基于表达式的过滤
if $hostname == 'webserver' and $programname == 'nginx' then {
    action(type="omfile" file="/var/log/nginx-web.log")
    stop
}

🔄 logrotate 日志轮转

logrotate 是什么?

官方定义: 根据logrotate官方文档,logrotate是一个自动化日志文件管理工具,用于定期轮转、压缩、删除和邮寄日志文件,防止日志文件无限增长占用磁盘空间,通过配置文件定义轮转策略,支持按时间、大小或其他条件触发轮转操作

生活化类比: logrotate就像现代化的智能档案管理系统

  • 档案室 = 日志存储目录,存放各种"文件"(日志)
  • 档案管理员 = logrotate程序,定期整理"档案"
  • 整理规则 = 配置文件,定义何时整理、如何分类
  • 归档操作 = 轮转过程,将"旧档案"打包存储
  • 压缩存储 = 压缩功能,节省"档案室"空间
  • 定期清理 = 删除策略,清理过期"档案"
  • 备份通知 = 邮件功能,重要"档案"变更时通知管理员

logrotate 基础配置详解

BASH
# 查看主配置文件
sudo cat /etc/logrotate.conf
 
# 查看配置目录
ls -la /etc/logrotate.d/
 
# 手动测试logrotate(调试模式,不实际执行)
sudo logrotate -d /etc/logrotate.conf

全局配置解析:

BASH
# 创建示例配置文件用于学习
sudo tee /tmp/logrotate-example.conf << 'EOF'
# === 全局默认配置 ===
weekly          # 每周轮转一次
rotate 4        # 保留4个轮转后的文件
create          # 轮转后创建新的空日志文件
dateext         # 使用日期作为后缀(如.20240123)
compress        # 压缩轮转后的日志文件
delaycompress   # 延迟压缩(下次轮转时才压缩)
 
# 包含其他配置文件
include /etc/logrotate.d
 
# === 系统日志特殊配置示例 ===
/var/log/wtmp {
    monthly         # 每月轮转
    create 0664 root utmp  # 创建新文件的权限和所有者
    minsize 1M      # 文件至少1MB才轮转
    rotate 1        # 只保留1个轮转文件
}
 
/var/log/btmp {
    missingok       # 文件不存在时不报错
    monthly
    create 0600 root utmp
    rotate 1
}
EOF
 
# 查看示例配置
cat /tmp/logrotate-example.conf

自定义日志轮转配置

BASH
# 创建应用日志轮转配置
sudo vim /etc/logrotate.d/nginx
 
# Nginx 日志轮转配置
/var/log/nginx/*.log {
    daily                    # 每天轮转
    missingok               # 日志文件不存在时不报错
    rotate 52               # 保留 52 个文件
    compress                # 压缩旧日志
    delaycompress          # 延迟压缩(下次轮转时压缩)
    notifempty             # 空文件不轮转
    create 0644 www-data adm  # 创建新文件的权限和所有者
    sharedscripts          # 多个文件共享脚本
    prerotate
        if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
            run-parts /etc/logrotate.d/httpd-prerotate; \
        fi \
    endscript
    postrotate
        invoke-rc.d nginx reload >/dev/null 2>&1
    endscript
}

logrotate 管理操作

BASH
# 测试配置文件
sudo logrotate -d /etc/logrotate.conf        # 调试模式,不实际执行
sudo logrotate -d /etc/logrotate.d/nginx     # 测试特定配置
 
# 强制执行轮转
sudo logrotate -f /etc/logrotate.conf        # 强制轮转所有日志
sudo logrotate -f /etc/logrotate.d/nginx     # 强制轮转特定日志
 
# 查看轮转状态
sudo cat /var/lib/logrotate/status           # 查看轮转状态文件
 
# 手动轮转示例脚本
#!/bin/bash
# 手动日志轮转脚本
 
LOG_FILE="/var/log/myapp/app.log"
BACKUP_DIR="/var/log/myapp/backup"
DATE=$(date +%Y%m%d_%H%M%S)
 
# 创建备份目录
mkdir -p $BACKUP_DIR
 
# 轮转日志
if [ -f "$LOG_FILE" ]; then
    mv "$LOG_FILE" "$BACKUP_DIR/app.log.$DATE"
    touch "$LOG_FILE"
    chmod 644 "$LOG_FILE"
    
    # 压缩旧日志
    gzip "$BACKUP_DIR/app.log.$DATE"
    
    # 删除 30 天前的日志
    find $BACKUP_DIR -name "*.gz" -mtime +30 -delete
    
    echo "Log rotated: $LOG_FILE -> $BACKUP_DIR/app.log.$DATE.gz"
fi

📊 日志分析技巧

常用日志分析命令

BASH
# 基本文本处理
tail -f /var/log/syslog                    # 实时查看日志
head -n 100 /var/log/auth.log              # 查看前 100 行
grep "ERROR" /var/log/apache2/error.log    # 搜索错误信息
grep -i "failed" /var/log/auth.log         # 不区分大小写搜索
 
# 统计分析
grep "Failed password" /var/log/auth.log | wc -l    # 统计失败登录次数
awk '{print $1}' /var/log/access.log | sort | uniq -c | sort -nr  # 统计 IP 访问次数
 
# 时间范围过滤
sed -n '/Jan 15 10:00/,/Jan 15 11:00/p' /var/log/syslog  # 提取时间段日志
awk '/2024-01-15 10:00/,/2024-01-15 11:00/' /var/log/app.log
 
# 多文件搜索
grep -r "error" /var/log/                  # 递归搜索所有日志文件
find /var/log -name "*.log" -exec grep -l "ERROR" {} \;  # 找到包含错误的日志文件

Web 服务器日志分析

BASH
#!/bin/bash
# Web 服务器访问日志分析
 
ACCESS_LOG="/var/log/nginx/access.log"
ERROR_LOG="/var/log/nginx/error.log"
 
echo "=== Nginx Access Log Analysis ==="
 
# 统计状态码
echo "HTTP Status Code Distribution:"
awk '{print $9}' $ACCESS_LOG | sort | uniq -c | sort -nr
 
echo -e "\nTop 10 Requested URLs:"
awk '{print $7}' $ACCESS_LOG | sort | uniq -c | sort -nr | head -10
 
echo -e "\nTop 10 Client IPs:"
awk '{print $1}' $ACCESS_LOG | sort | uniq -c | sort -nr | head -10
 
echo -e "\nTop 10 User Agents:"
awk -F'"' '{print $6}' $ACCESS_LOG | sort | uniq -c | sort -nr | head -10
 
# 分析错误日志
echo -e "\n=== Nginx Error Log Analysis ==="
echo "Error Level Distribution:"
awk '{print $4}' $ERROR_LOG | sed 's/\[//g' | sort | uniq -c | sort -nr
 
echo -e "\nRecent Errors:"
tail -20 $ERROR_LOG

🎯 实战演练

演练1:Web服务器日志综合分析

场景描述:某电商网站在促销期间出现访问缓慢问题,需要通过日志分析找出原因。

BASH
# 第一步:创建模拟Web服务器日志环境
mkdir -p ~/web-log-analysis
cd ~/web-log-analysis
 
# 创建模拟的nginx访问日志
cat << 'EOF' > access.log
192.168.1.100 - - [23/Jan/2024:10:15:23 +0800] "GET /index.html HTTP/1.1" 200 1234 "-" "Mozilla/5.0"
192.168.1.101 - - [23/Jan/2024:10:15:24 +0800] "GET /products.html HTTP/1.1" 200 5678 "-" "Mozilla/5.0"
192.168.1.102 - - [23/Jan/2024:10:15:25 +0800] "POST /login HTTP/1.1" 500 0 "-" "Mozilla/5.0"
192.168.1.100 - - [23/Jan/2024:10:15:26 +0800] "GET /api/products HTTP/1.1" 504 0 "-" "curl/7.68.0"
192.168.1.103 - - [23/Jan/2024:10:15:27 +0800] "GET /images/logo.png HTTP/1.1" 200 2048 "-" "Mozilla/5.0"
192.168.1.101 - - [23/Jan/2024:10:15:28 +0800] "GET /checkout HTTP/1.1" 503 0 "-" "Mozilla/5.0"
EOF
 
# 创建模拟的nginx错误日志
cat << 'EOF' > error.log
2024/01/23 10:15:25 [error] 1234#0: *1 connect() failed (111: Connection refused) while connecting to upstream
2024/01/23 10:15:26 [error] 1234#0: *2 upstream timed out (110: Connection timed out) while reading response header from upstream
2024/01/23 10:15:28 [error] 1234#0: *3 no live upstreams while connecting to upstream
EOF
BASH
# 第二步:分析访问日志 - 识别问题模式
# 统计HTTP状态码分布
awk '{print $9}' access.log | sort | uniq -c | sort -nr
 
# 识别错误请求
awk '$9 >= 400 {print $0}' access.log
 
# 分析访问频率最高的IP
awk '{print $1}' access.log | sort | uniq -c | sort -nr
 
# 分析最耗时的请求(通过状态码推断)
awk '$9 == 504 || $9 == 503 {print "超时/服务不可用: " $0}' access.log
BASH
# 第三步:分析错误日志 - 找出根本原因
# 统计错误类型
grep -o "Connection refused\|Connection timed out\|no live upstreams" error.log | sort | uniq -c
 
# 分析错误时间模式
awk '{print $1, $2}' error.log

演练2:系统日志故障排除

BASH
# 1. 系统启动问题诊断
# 查看启动日志
journalctl -b                    # 当前启动的日志
journalctl --list-boots          # 列出所有启动记录
journalctl -b -1                 # 上次启动的日志
 
# 查看启动失败的服务
systemctl --failed               # 显示失败的服务
journalctl -u service-name       # 查看特定服务日志
 
# 查看内核消息
dmesg | grep -i error            # 内核错误消息
journalctl -k --since "1 hour ago"  # 最近一小时的内核日志
 
# 2. 网络连接问题诊断
# 查看网络相关日志
journalctl -u NetworkManager     # NetworkManager 日志
journalctl -u systemd-networkd   # systemd-networkd 日志
grep -i "network\|dhcp" /var/log/syslog  # 网络和 DHCP 相关日志
 
# 3. 认证问题诊断
# SSH 登录问题
journalctl -u ssh                # SSH 服务日志
grep "sshd" /var/log/auth.log    # SSH 认证日志
grep "Failed password" /var/log/auth.log  # 失败的登录尝试
 
# sudo 权限问题
grep "sudo" /var/log/auth.log    # sudo 使用记录
journalctl _COMM=sudo            # sudo 相关的 journal 日志

🤔 思考题

  1. 什么情况下应该选择 systemd journal 而不是传统的 syslog?
  2. 如何设计一个高效的日志轮转策略?
  3. 在大规模环境中,如何实现日志的集中化管理?
  4. 如何平衡日志的详细程度和存储成本?

实践练习

通过实际操作来巩固所学知识,在真实的系统化的训练环境中练习本教程的内容。

Linux 日志管理 - rsyslog、journalctl 与日志轮转 - 实践练习

待学习
ID: LINUX_05_LOG_MANAGEMENT
未登录
训练服务器:
训练内容:

基于 Linux 日志管理 - rsyslog、journalctl 与日志轮转 教程的实践练习