服务起不来,你敲 systemctl status 只看到一行 failed,提示去看日志。你打开 /var/log 一翻,别人教程里说的 /var/log/secure 根本没有,journalctl -u nginx 一片空白,重启之后连上次为什么崩都查不到了。
这三个现象在麒麟上不是个例。桌面版和服务器版的日志路径是分家的,journald 默认不落盘,yum.log 还是个空壳。这篇按症状给路径,对着查就行。
一、先确认日志到底记没记上
别急着翻 /var/log,先用一条命令判断日志有没有进 systemd:
bash
journalctl -u nginx --since "10 min ago"
有输出,说明日志已经进 journald,直接跳到第三节按关键字检索。
没输出,屏幕上只有一行 -- No entries --,说明你要找的日志根本不在 journald 里,得去文件里翻。这时候先判型,路径分家就是从这儿开始的:
bash
cat /etc/.kyinfo 2>/dev/null | head -3
echo '---'
[ -f /etc/yum.repos.d/kylin.repo ] && echo '服务器版(yum 系,日志走 RHEL 路径)' || echo '桌面版(apt 系,日志走 Debian 路径)'
服务器版有 /etc/yum.repos.d/kylin.repo,桌面版没有。判完型,回第二节按症状找文件。
二、按症状找文件,别按目录背
下面这张表是解题路径,不是目录清单。左边是你遇到的现象,右边是去哪看。
| 你遇到的现象 | 去哪个文件 / 命令 | 版本差异 |
|---|---|---|
| SSH 登录失败、怀疑有人扫端口 | /var/log/secure |
桌面版这里没有,改看 /var/log/auth.log |
| 服务起不来、进程莫名退出 | journalctl -u 服务名 -b |
两版通用 |
| 机器上次为什么崩的 | /var/log/journal/(需手动开,见第四节) |
两版通用 |
| 装包装崩了、想回滚 | /var/log/dnf.log |
桌面版改看 /var/log/dpkg.log |
| 磁盘满、想查谁写的 | du -sh /var/log/* |
两版通用 |
| 等保要审计记录 | /var/log/audit/audit.log |
需 auditd 在跑 |
| 程序被麒麟安全模块拦了 | /var/log/kysec |
麒麟专属,不在 audit.log 里 |
| 开机卡住、进不了系统 | journalctl -b -1 -p err |
看上一次启动 |
| 定时任务没执行 | journalctl -u cron 或 /var/log/cron |
桌面版可能只有 journald |
| 内核报硬件错、驱动加载失败 | dmesg -T 或 journalctl -k |
两版通用 |
有坑 :/var/log/yum.log 在麒麟服务器版上是个空壳。麒麟的包管理实际是 dnf,yum 只是个软链,真正的记录写在 /var/log/dnf.log。你 cat yum.log 看到空文件,不代表没装过包。
有坑 :/var/log/messages 在部分桌面版上是空的,甚至不存在。桌面版的系统日志走 /var/log/syslog,别死磕 messages。
三、日志进了 journald 怎么检索
确认日志在 journald 里,这四条组合拳基本够用:
bash
# 只看某个服务本次启动之后的日志
journalctl -u nginx -b
# 只看错误级别往上(emerg/alert/crit/err)
journalctl -u nginx -b -p err
# 按时间段切,支持自然语言
journalctl --since "2026-09-01 09:00" --until "2026-09-01 10:00"
# 实时跟,等价于 tail -f
journalctl -u nginx -f
查上一次崩溃原因,关键在 -b -1:
bash
journalctl -b -1 -p err --no-pager | head -50
-b 是本次启动,-b -1 是上一次启动,-b -2 是上上次。机器只要重启过,查上辈子的日志就只能靠它,前提是 journald 落了盘。
按进程号或者命令名精确定位:
bash
journalctl _PID=1234
journalctl _COMM=sshd
只看内核环缓冲(等价于 dmesg,但能带时间戳和过滤):
bash
journalctl -k -p err
四、查不到历史日志?journald 默认不落盘
这是最要命的一个坑。麒麟默认配置里 Storage=auto,意思是 /var/log/journal 目录存在就落盘,不存在就只放内存,重启即焚。
先看你机器现在落没落盘:
bash
ls -ld /var/log/journal
目录不存在,就是这个坑。开持久化只要三步:
bash
sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
有坑 :只 mkdir 不重启 journald 不生效,日志还是写内存,重启照样丢。
落盘之后日志会一直涨,用这几条管住体积:
bash
journalctl --disk-usage # 看现在占多大
sudo journalctl --vacuum-size=1G # 砍到 1G 以内
sudo journalctl --vacuum-time=30d # 只留最近 30 天
有坑 :--vacuum-size 直接删落盘的日志文件。执行前确认有没有等保或者审计的留存要求,生产机器上先备份 /var/log/journal 再清。
想彻底固定策略,编辑 /etc/systemd/journald.conf:
ini
[Journal]
Storage=persistent
SystemMaxUse=1G
MaxRetentionSec=30day
改完 systemctl restart systemd-journald 生效。
五、这三个日志不能用 cat 看
/var/log 下面有三个文件是二进制的,直接 cat 出来是一堆乱码:
bash
last # 读 wtmp,谁登录过、机器什么时候重启过
lastb # 读 btmp,谁登录失败过(查暴力破解)
lastlog # 读 lastlog,所有用户最后一次登录时间
查 SSH 暴力破解,一条命令就够:
bash
lastb | awk '{print $3}' | sort | uniq -c | sort -nr | head -20
输出里次数特别高的 IP,直接拉进 /etc/hosts.deny,或者交给 firewalld 封掉。
六、验证你这套日志链路是通的
改完别拍脑袋就走,按顺序验证一遍:
bash
# 1. 确认 journald 在跑且已落盘
systemctl is-active systemd-journald
ls /var/log/journal/
# 2. 写一条测试日志
logger -t test "kylin log check 2026"
# 3. 确认能查到
journalctl -t test --since "1 min ago"
# 4. 开个新终端 ssh 本机失败一次,确认认证日志在写
sudo tail -5 /var/log/secure # 服务器版
sudo tail -5 /var/log/auth.log # 桌面版
第 3 步能查到你刚写的 test,说明 journald 链路通。第 4 步能看到失败记录,说明认证日志链路通。两条都通,下次出事你才有的查。
七、防复发:把两件事定成规矩
第一件,装机或者接手一台新机器,先把 journald 持久化打开。没有落盘日志,事后排查全靠猜。
第二件,日志轮转别全指望默认配置。麒麟上 /etc/logrotate.conf 默认按周轮转、保留 4 份,磁盘紧张的机器容易在第一轮就被撑满。对增长快的日志单独配一份:
bash
sudo vi /etc/logrotate.d/kylin-custom
text
/var/log/dnf.log /var/log/kysec/*.log {
weekly
rotate 8
compress
missingok
notifempty
}
改完用 logrotate -d /etc/logrotate.d/kylin-custom 干跑一遍校验语法,不报错就生效。
附:/var/log 路径与 journalctl 参数速查
| 路径 | 作用 | 版本 |
|---|---|---|
/var/log/secure |
认证、SSH 登录 | 服务器版 |
/var/log/auth.log |
同上 | 桌面版 |
/var/log/messages |
系统主日志 | 服务器版 |
/var/log/syslog |
同上 | 桌面版 |
/var/log/kern.log |
内核日志 | 桌面版 |
/var/log/dnf.log |
包管理记录(真实) | 服务器版 |
/var/log/yum.log |
空壳,看 dnf.log | 服务器版 |
/var/log/dpkg.log |
包管理记录 | 桌面版 |
/var/log/audit/audit.log |
审计记录 | 需 auditd |
/var/log/kysec |
麒麟安全模块拦截 | 麒麟专属 |
/var/log/journal/ |
journald 落盘目录 | 需手动开 |
/var/log/boot.log |
启动过程 | 部分版本空 |
/var/log/cron |
定时任务 | 服务器版 |
journalctl 常用参数:
text
-u 服务名 按服务过滤
-f 实时跟随
-b 本次启动;-b -1 上一次启动
--since/--until 按时间切
-p err 按级别(emerg/alert/crit/err/warning/notice/info/debug)
-k 只看内核日志
_PID= / _COMM= 按进程号 / 命令名
--disk-usage 看占用
--vacuum-size= 按体积清理
--vacuum-time= 按时间清理
--no-pager 不进分页,方便管道
日志这东西,平时没人看,一出事就是唯一的线索。核心就一句:先确认记没记上,再按症状找文件,查不到历史就把 journald 落盘打开。现在花三分钟开持久化,比出事之后抓瞎强得多。