目录一、引言日志运维的“监控录像”二、/var/log传统日志文件的藏宝图2.1 核心日志文件速览2.2 messages / syslog系统的“杂记本”2.3 secure / auth.log安全的“门禁记录”2.4 dmesg内核的“第一手信息”三、journalctlsystemd时代的日志利器3.1 rsyslog与journald的关系3.2 基本查询3.3 按服务过滤3.4 按时间过滤3.5 按优先级过滤3.6 高级过滤技巧四、看懂内核报错信息4.1 OOM Killer日志解读4.2 磁盘I/O错误日志解读4.3 网络相关内核日志五、综合实战日志排查的黄金流程六、本篇小结动手练习七、下篇预告一、引言日志运维的“监控录像”想象一座大楼发生了入室盗窃案。安保人员调查的第一件事是什么查监控录像。Linux系统也一样。当服务突然崩溃、磁盘莫名其妙满了、有人尝试暴力破解SSH——这些事件的“监控录像”就是日志文件。但日志和监控录像有一个共同的问题信息量巨大准确找到关键帧很难。/var/log下可能有几十上百个日志文件每个文件可能包含几十万行记录。如果不掌握过滤和搜索技巧面对海量日志会像大海捞针。今天的目标就是让你掌握从海量日志中快速定位问题线索的能力。二、/var/log传统日志文件的藏宝图2.1 核心日志文件速览/var/log是系统日志的集中存放地。不同发行版可能略有差异但以下文件是通用的bashls -l /var/log/日志文件记录内容典型排查场景/var/log/messages系统通用日志包括内核、服务启动信息CentOS/RHEL系统启动问题、服务报错/var/log/syslog同上Ubuntu/Debian的等效文件同上/var/log/secure认证和安全相关事件SSH登录、sudo提权、密码失败安全审计、暴力破解排查/var/log/auth.logUbuntu/Debian的等效文件同上/var/log/dmesg本次启动的内核环缓冲区日志硬件检测、驱动加载问题/var/log/boot.log系统启动过程日志排查开机启动失败的服务/var/log/croncron定时任务执行记录确认crontab是否正常运行/var/log/nginx/Nginx访问日志和错误日志默认路径Web服务排查/var/log/mysql/MySQL错误日志、慢查询日志数据库故障排查2.2 messages / syslog系统的“杂记本”这是最常用也最庞杂的日志文件。几乎所有系统服务都把日志发到这里。bash# 查看最近10条系统日志 tail -10 /var/log/messages # CentOS/RHEL tail -10 /var/log/syslog # Ubuntu/Debian # 实时监控排查问题时打开复现问题观察日志变化 tail -f /var/log/messages # 搜索包含error的行不区分大小写 grep -i error /var/log/messages # 搜索特定时间段例如今天10点到11点 grep Apr 26 10: /var/log/messages2.3 secure / auth.log安全的“门禁记录”这个文件记录所有与认证相关的事件谁登录了、谁退出了、谁输错了密码、谁用sudo提权了。bash# 查看最近20条认证记录 tail -20 /var/log/secure # CentOS/RHEL tail -20 /var/log/auth.log # Ubuntu/Debian典型场景一排查SSH暴力破解bashgrep Failed password /var/log/secure | tail -20输出示例textApr 26 03:15:22 myserver sshd[12345]: Failed password for root from 192.168.1.100 port 54321 ssh2 Apr 26 03:15:23 myserver sshd[12346]: Failed password for root from 192.168.1.100 port 54322 ssh2 Apr 26 03:15:24 myserver sshd[12347]: Failed password for admin from 192.168.1.100 port 54323 ssh2看到凌晨3点有大量失败尝试且来自同一个IP基本可以确定是暴力破解。应对措施封禁该IP或切换到密钥登录。bash# 统计每个IP的失败尝试次数 grep Failed password /var/log/secure | awk {print $(NF-3)} | sort | uniq -c | sort -rn典型场景二查看sudo使用记录bashgrep sudo /var/log/secure | tail -102.4 dmesg内核的“第一手信息”dmesg显示内核环缓冲区Kernel Ring Buffer的内容记录了从内核加载那一刻起的硬件检测、驱动初始化信息。bash# 查看全部内核日志 dmesg # 分页查看 dmesg | less # 只看错误和警告 dmesg --levelerr,warn # 只看内存相关 dmesg | grep -i memory # 只看磁盘相关 dmesg | grep -E sd[a-z] # 查看最新的10条内核日志 dmesg | tail -10dmesg在排查硬件故障时特别有用——比如插入U盘没反应执行dmesg | tail就能看到系统是否检测到了新设备。三、journalctlsystemd时代的日志利器3.1 rsyslog与journald的关系现代Linux有两套日志机制在协同工作机制角色特点journaldsystemd内置的日志收集组件二进制存储支持结构化查询rsyslogd传统syslog守护进程将日志写入/var/log/下的文本文件它们的协作流程是服务产生日志 → journald收集内存二进制存储→ rsyslogd读取并写入传统日志文件。journalctl的优势你可以用丰富的过滤条件精确查询日志而不需要手工grep。3.2 基本查询bash# 查看所有日志从本次启动开始 journalctl # 查看本次启动的日志 journalctl -b # 查看上一次启动的日志排查“重启后就出问题”的神器 journalctl -b -1 # 实时跟踪类似tail -f journalctl -f # 从新到旧显示最新在最前 journalctl -r # 限制输出行数 journalctl -n 503.3 按服务过滤这是journalctl最常用的功能——只看某个服务的日志bash# 查看Nginx的所有日志 journalctl -u nginx # 查看SSH服务的日志并进行实时跟踪 journalctl -u sshd -f # 查看某服务的最近100条日志 journalctl -u nginx -n 1003.4 按时间过滤bash# 查看今天以来的日志 journalctl --since today # 查看最近30分钟的日志 journalctl --since 30 min ago # 查看指定时间范围 journalctl --since 2026-04-26 09:00:00 --until 2026-04-26 10:00:00 # 组合查看某服务在指定时间段的日志 journalctl -u nginx --since 2026-04-26 08:00:00 --until 2026-04-26 09:00:003.5 按优先级过滤Linux日志有8个优先级从严重到轻微优先级编号关键词含义emerg0Emergency系统不可用alert1Alert必须立即处理crit2Critical严重错误err3Error错误warning4Warning警告notice5Notice正常但重要info6Info信息debug7Debug调试信息bash# 只看错误级别及以上 journalctl -p err # 只看警告级别及以上 journalctl -p warning # 组合过滤某服务最近一天的警告和错误 journalctl -u nginx -p warning --since yesterday3.6 高级过滤技巧bash# 按用户ID过滤查看某用户相关的日志通过id查看UID id -u nginx journalctl _UID997 # 按进程名过滤 journalctl _COMMsshd # 多条件“与”组合同时满足 journalctl -u nginx _PID12345 # 查看占用磁盘空间的日志量 journalctl --disk-usage # 清理旧日志保留最近7天 sudo journalctl --vacuum-time7d四、看懂内核报错信息前面我们学了怎么找日志但找到了还得看懂。内核报错信息通常比较晦涩但掌握几个常见模式就能应对大部分情况。4.1 OOM Killer日志解读OOMOut of MemoryKiller是内存耗尽时内核的“急救措施”——选择一个“罪魁祸首”进程杀死防止整个系统崩溃。触发场景某个程序内存泄漏吃光了所有可用内存和交换空间。典型日志通过dmesg或journalctl -k查看text[123456.789] mysqld invoked oom-killer: gfp_mask0x201da, order0, oom_score_adj0 [123456.790] mysqld cgroup... memory... memory_swap... [123456.891] [ pid ] uid tgid total_vm rss pgtables_bytes swapents oom_score_adj name [123456.892] [ 12345] 1001 12345 2048000 524288 1024000 16384 0 mysqld [123456.893] Out of memory: Killed process 12345 (mysqld) total-vm:2048000kB, anon-rss:524288kB如何解读invoked oom-killer内核说“我要开杀戒了”表格显示了所有进程的内存使用情况Killed process 12345 (mysqld)MySQL被选中杀死了排查思路OOM Killer杀了进程只是表象根因通常是某个程序内存泄漏。查看被杀进程的内存使用趋势确认是否有异常增长。4.2 磁盘I/O错误日志解读典型日志text[123456.789] sd 0:0:0:0: [sda] Unhandled sense code [123456.790] sd 0:0:0:0: [sda] Result: hostbyteDID_OK driverbyteDRIVER_SENSE [123456.791] sd 0:0:0:0: [sda] Sense Key : Medium Error [current] [123456.792] sd 0:0:0:0: [sda] Add. Sense: Unrecovered read error [123456.793] blk_update_request: critical medium error, dev sda, sector 9876543如何解读sd 0:0:0:0: [sda]出问题的设备是sda硬盘Medium ErrorUnrecovered read error磁盘介质损坏数据读不出来sector 9876543问题出在这块磁盘的哪个扇区紧急行动磁盘出现物理坏道时应立即备份还能读出的数据更换新磁盘。继续使用可能导致数据全部丢失。4.3 网络相关内核日志bash# 查看网卡相关日志 dmesg | grep -i eth0 # 查看TCP相关日志 dmesg | grep -i tcp常见网络日志网卡up/down状态变化、TCP连接队列满、防火墙丢弃数据包等。五、综合实战日志排查的黄金流程当系统出现“不明不白”的问题时按以下优先级查询日志第一步确定问题发生的时间范围bash# 用journalctl查看最近30分钟的所有错误及以上级别日志 journalctl -p err --since 30 min ago第二步根据问题类型选择目标日志问题表现首选日志来源命令示例SSH连不上secure/auth.logjournalctl -u sshd --since 10 min ago网站500错误应用日志 Nginx错误日志tail -100 /var/log/nginx/error.log磁盘空间报警无需日志df -h直接定位然后用du -sh逐层深入服务莫名重启journalctl查看该服务journalctl -u 服务名 --since yesterday内存/CPU飙升dmesg看OOMjournalctl看应用日志dmesg | grep -i oom第三步时间对齐分析bash# 假设网站10:15开始报错查看10:14-10:16的所有系统日志 journalctl --since 10:14 --until 10:16 -p warning第四步保存证据便于深入分析bash# 将关键时间段的日志导出为文本文件方便分享和深入分析 journalctl --since 10:00 --until 10:20 /tmp/incident_log.txt六、本篇小结三大日志来源来源工具最适合/var/log/文本文件tail、grep日常快速浏览journaldjournalctl精确过滤、时间范围查询内核环缓冲区dmesg硬件和驱动问题journalctl速查需求命令看某服务日志journalctl -u 服务名看最近N条journalctl -n N只看错误journalctl -p err实时跟踪journalctl -f指定时间段journalctl --since .. --until ..清理旧日志journalctl --vacuum-time7d核心排查思维确定时间段 → 2. 选择目标服务 → 3. 按优先级过滤 → 4. 时间对齐分析动手练习bash# 1. 查看最近30分钟的系统日志 journalctl --since 30 min ago | tail -50 # 2. 查看SSH服务的日志包括登录记录 journalctl -u sshd --since today # 3. 模拟一次失败的登录用错误的密码SSH本机然后立即查看日志 ssh nonexistentlocalhost journalctl -u sshd -n 5 # 4. 查看内核启动日志中关于内存的信息 dmesg | grep -i memory # 5. 检查当前日志占用磁盘空间 journalctl --disk-usage # 6. 导出最近1小时的错误日志 journalctl -p err --since 1 hour ago /tmp/recent_errors.txt cat /tmp/recent_errors.txt七、下篇预告“这个网站怎么打不开了”——这是运维被问最多的问题。下一篇我们将进入网络配置基础学习Linux网络排查的“四件套”ip addr查看网卡信息、ping测试连通性、traceroute追踪路由、ss查看端口和连接。这些命令是排查“连不上”“响应慢”等网络问题的第一道防线。延伸思考你有两台服务器A和BA可以ping通B但B无法ssh连接A。你应该按什么顺序排查提示先从最简单的开始——A的SSH服务在运行吗防火墙放行端口了吗网络策略允许吗日志里有什么下一篇我们将系统学习这种分层排查的思路。