教程目录
Linux 日志管理 - rsyslog、journalctl 与日志轮转
深入学习Ubuntu 24.10 Server日志管理的核心技术,掌握rsyslog配置、systemd journalctl使用、logrotate日志轮转和日志分析技巧。通过生活化类比和渐进式实践,让初学者轻松掌握日志管理技能。
🚀 实践环境(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工作原理:
二进制存储优势
- 结构化数据:每条日志包含时间戳、优先级、来源等结构化字段
- 索引优化:内置索引机制,支持快速查询和过滤
- 完整性保护:支持数字签名和校验,防止日志篡改
- 压缩存储:自动压缩历史日志,节省存储空间
查询引擎特性
- 多维过滤:支持按时间、服务、优先级、字段等多维度过滤
- 实时流式:支持实时跟踪新产生的日志消息
- 分页显示:自动分页显示,便于浏览大量日志
- 格式化输出:支持多种输出格式,便于人工阅读和脚本处理
# 基本日志查看
journalctl # 查看所有日志(从最早开始)
journalctl -f # 实时跟踪日志(类似 tail -f)
journalctl -n 50 # 显示最近 50 条日志
journalctl -r # 逆序显示(最新的在前)
journalctl --no-pager # 不使用分页器,直接输出
# 按时间过滤(支持多种时间格式)
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" # 时间段查询
# 按优先级过滤(数字或名称)
journalctl -p err # 只显示错误级别及以上(0-3)
journalctl -p warning # 显示警告级别及以上(0-4)
journalctl -p 0..3 # 显示 0-3 级别的日志
journalctl -p debug # 显示所有级别日志(包括调试)
按服务和单元过滤
# 按服务过滤 - 查看特定服务的日志
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 配置管理
# 查看 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 维护操作
# 清理 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 配置文件详解
# 查看主配置文件
sudo cat /etc/rsyslog.conf
# 查看配置文件结构
echo "=== rsyslog配置文件结构 ==="
echo "1. 模块加载部分"
echo "2. 全局指令部分"
echo "3. 规则定义部分"
echo "4. 包含其他配置文件"
基本配置结构解析:
# 创建示例配置文件用于学习
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 规则配置实践
# 创建自定义配置文件
sudo vim /etc/rsyslog.d/50-custom.conf
# 在编辑器中输入以下内容:
自定义配置文件内容:
# === 按设施分类日志 ===
# 邮件系统日志 - 所有邮件相关的消息
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
# 验证配置文件语法
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 高级配置
# 模板定义
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 基础配置详解
# 查看主配置文件
sudo cat /etc/logrotate.conf
# 查看配置目录
ls -la /etc/logrotate.d/
# 手动测试logrotate(调试模式,不实际执行)
sudo logrotate -d /etc/logrotate.conf
全局配置解析:
# 创建示例配置文件用于学习
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
自定义日志轮转配置
# 创建应用日志轮转配置
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 管理操作
# 测试配置文件
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
📊 日志分析技巧
常用日志分析命令
# 基本文本处理
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 服务器日志分析
#!/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服务器日志综合分析
场景描述:某电商网站在促销期间出现访问缓慢问题,需要通过日志分析找出原因。
# 第一步:创建模拟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
# 第二步:分析访问日志 - 识别问题模式
# 统计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
# 第三步:分析错误日志 - 找出根本原因
# 统计错误类型
grep -o "Connection refused\|Connection timed out\|no live upstreams" error.log | sort | uniq -c
# 分析错误时间模式
awk '{print $1, $2}' error.log
演练2:系统日志故障排除
# 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 日志
🤔 思考题
- 什么情况下应该选择 systemd journal 而不是传统的 syslog?
- 如何设计一个高效的日志轮转策略?
- 在大规模环境中,如何实现日志的集中化管理?
- 如何平衡日志的详细程度和存储成本?
实践练习
通过实际操作来巩固所学知识,在真实的系统化的训练环境中练习本教程的内容。
Linux 日志管理 - rsyslog、journalctl 与日志轮转 - 实践练习
基于 Linux 日志管理 - rsyslog、journalctl 与日志轮转 教程的实践练习