Linux日志需按职责精准定位:/var/log/auth.log或secure查登录失败,kern.log或dmesg查内核报错,messages或syslog看通用事件;优先用tail -F配合grep过滤,journalctl是systemd系统的首选,支持时间筛选与权限优化。

直接看 /var/log 里的文件,但得先知道哪个文件管什么
Linux 系统日志不是全堆在一个文件里,/var/log 下每个文件职责明确,乱翻容易错过关键线索。比如你查 SSH 登录失败,/var/log/auth.log(Debian/Ubuntu)或 /var/log/secure(RHEL/CentOS)才是正主;而内核驱动报错,/var/log/kern.log 或 dmesg 输出更及时。
-
/var/log/messages:RHEL/CentOS 的通用系统日志,服务启停、网络变化、crond 任务等都在这儿 -
/var/log/syslog:Ubuntu/Debian 的等效文件,内容更全,但不含认证细节 -
/var/log/auth.log:只管登录、sudo、su、SSH 密码失败等,安全审计第一站 -
/var/log/dmesg:是开机那一刻的快照,不更新;想看实时硬件事件,得用dmesg命令
别一上来就 cat /var/log/syslog —— 文件动辄几百 MB,卡死终端。优先用 tail -n 50 或 less 分页看。
tail -f 实时盯日志,但轮转后会断,加 -F 才可靠
开发调试或排查刚发生的问题,tail -f 是最顺手的工具。但它有个隐藏陷阱:日志轮转(logrotate)后,原文件被重命名(如 syslog.1),tail -f 还傻盯着旧文件句柄,新日志就“消失”了。
- 正确做法是用
tail -F /var/log/syslog(大写 F)—— 它会检测文件是否被移走/重建,自动切换到新文件 - 配合
grep过滤更高效:tail -F /var/log/auth.log | grep "Failed password" - 如果只想看最近 100 行再持续追加:
tail -n 100 -F /var/log/messages
注意:tail -f 默认只读最后 10 行,不加 -n N 就算文件有错误,你也看不到上下文。
journalctl 不是备选,而是默认首选(systemd 系统下)
CentOS 7+、Ubuntu 16.04+、Fedora 等主流发行版早已默认启用 systemd,journalctl 不是“另一个工具”,而是日志的事实标准。它比读 /var/log 文件更准、更快、更结构化——因为很多服务(如 sshd、nginx)根本不往磁盘写日志,只发给 journald。
- 查某服务现在出啥问题:
journalctl -u sshd.service,比翻auth.log更干净,没干扰项 - 查今天有没有内核 OOM 杀进程:
journalctl --since today -p err | grep -i "killed process" - 查上次开机到现在所有报错:
journalctl -b -p err(-b= this boot)
别以为 journalctl 只能看“新”日志——它默认持久化存储(/var/log/journal),只要没禁用,历史记录全在。但注意:某些最小化安装可能关闭了持久化,重启后日志就没了。
用 grep 提取关键行,但上下文经常比关键词本身更重要
搜 “error” 或 “failed” 很快,但单靠这一行根本没法定位问题。比如 grep "Connection refused" /var/log/syslog 只告诉你连不上,却不知道是 DNS 解析失败、端口没开,还是目标服务崩了。
- 加
-C 3看上下文:grep -C 3 "Out of memory" /var/log/messages,前后三行常含内存分配栈或触发进程 - 用
-B 2 -A 5精确控制前/后行数,适合匹配段错误或崩溃日志 - 时间戳格式不统一?
grep无法按时间范围筛选,这时候该切回journalctl --since "2 hours ago"或用sed配合日期字符串(但别硬刚,优先用 journalctl)
权限问题最容易被忽略:普通用户读 /var/log/auth.log 或 /var/log/secure 会 Permission denied。journalctl 对此更友好,部分发行版允许非 root 用户查自己的服务日志;实在不行,就老老实实用 sudo,别试 cat 然后卡住再 Ctrl+C。

















