前言
⚠️有没有很多 Linux 新手和我一样? 启动服务报错、SSH 登录失败、定时任务没执行,打开终端两眼一抹黑,完全不知道去哪里找报错信息! 服务器不会说谎,所有程序崩溃、登录异常、内核报错都会完整记录在系统日志里,学会看日志 = 掌握服务器排错万能钥匙。
CentOS7 及以上系统存在两套日志服务协同工作:systemd-journald、rsyslog,很多教程只单独讲其中一个,新手越学越混乱。 本文全程小白友好,拆解两套日志分工、完整可复现实验、每行命令带详细注释、参数全拆解、3 类高频服务故障完整复盘,跟着虚拟机敲一遍就能吃透日志体系!
📌前置环境说明 实验机器:CentOS7/8/9 服务器 server, 阅读建议:一边开虚拟机,一边跟着实操,所有案例均可手动复现加深记忆
一、Linux 日志整体架构
1.1 日志核心作用文本框
💡日志能干什么?
- 故障排查:服务启动失败、登录报错、程序崩溃,日志记录完整报错原因
- 安全审计:记录谁远程 SSH 登录、何时登录、是否暴力破解密码
- 运行监控:定时任务执行记录、内核硬件异常、系统资源报错
- 追溯责任:多人操作服务器,可通过日志查看每一条执行行为
1.2 两套日志服务分工对比表
| 服务名称 | 存储格式 | 日志存放路径 | 核心职责 | 优缺点 |
|---|---|---|---|---|
| systemd-journald | 二进制文件 | 临时:/run/log/journal持久化:/var/log/journal | 日志收集总入口,收集内核、开机、所有服务原始日志 | 优点:过滤、按服务 / 时间查询方便;缺点:二进制文件不能直接 cat 读取 |
| rsyslog | 纯文本文件 | /var/log/ 下各类日志 | 接收 journald 日志,按分类存入不同文本日志,支持日志远程转发 | 优点:文本文件易读取、长期归档;缺点:查询过滤功能弱于 journalctl |
1.3 工作流程通俗讲解
- 系统内核、ssh、定时任务、httpd 等程序产生日志消息;
- 全部消息统一交给
systemd-journald收集,格式化存储; rsyslog读取 journald 收集到的日志,按照预设规则拆分、存入不同文本日志;- 运维人员可任选两套工具查看日志、定位故障。
⚠️补充知识点文本框 不是所有软件都会走 rsyslog 记录日志: sshd、crontab、内核、系统登录使用系统日志服务; httpd、nginx 等 web 服务拥有独立日志文件,不写入 /var/log 系统日志。
二、rsyslog 日志完整详解
2.1 rsyslog 配置文件路径
| 配置文件 | 作用 | 修改后生效方式 |
|---|---|---|
| /etc/rsyslog.conf | 主配置文件,定义全局日志规则 | systemctl restart rsyslog |
| /etc/rsyslog.d/*.conf | 自定义扩展配置目录,推荐新增规则放这里 | systemctl restart rsyslog |
主配置内置导入扩展目录代码:
# 读取/etc/rsyslog.d/下所有.conf配置文件,mode=optional目录不存在不报错include(file="/etc/rsyslog.d/*.conf"mode="optional")2.2 日志规则标准语法
facility+连接符号+priority 处理方式 示例:cron.info表格 1:facility 设备类型(日志来源分类)
| facility | 日志来源说明 |
|---|---|
| auth | PAM 认证模块产生日志 |
| authpriv | SSH、FTP 私密登录日志(排 SSH 登录报错必看) |
| cron | crontab 定时任务执行日志 |
| kern | 系统内核相关日志 |
| lpr | 打印机服务日志 |
| 邮件服务日志 | |
| news | 新闻组服务日志 |
| user | 用户自定义程序日志 |
| local0~local7 | 8 组自定义日志类型,实验自定义日志专用 |
表格 2:priority 日志优先级(数字越小故障越严重)
| 数字 | 级别名称 | 场景说明 |
|---|---|---|
| 0 | emerg | 系统彻底崩溃,无法使用 |
| 1 | alert | 重大故障,必须立刻处理 |
| 2 | crit | 临界严重错误 |
| 3 | err | 程序运行报错 |
| 4 | warning | 警告,不影响运行但存在隐患 |
| 5 | notice | 正常重要事件 |
| 6 | info | 普通运行信息 |
| 7 | debug | 调试打印日志,生产环境关闭 |
| none | 不记录任何日志 |
表格 3:连接符号匹配规则
| 符号 | 匹配规则 | 举例 |
|---|---|---|
| . | 大于等于该级别全部记录 | cron.info 记录 info、notice、warning 及更严重日志 |
| .= | 仅匹配当前级别 | cron.=err 只记录 err 级别日志 |
| .! | 排除当前级别,其余全部记录 | cron.!debug 不记录 debug,其他全部保存 |
处理方式 3 种
- 写入本地文件(最常用)
- 输出到服务器终端控制台
- 转发日志到远程日志服务器
2.3 系统默认日志规则解析
### RULES ##### 内核日志输出到控制台(默认注释关闭)#kern.* /dev/console# 所有info级别日志,排除邮件、认证、定时任务,存入messages*.info;mail.none;authpriv.none;cron.none /var/log/messages# 所有登录认证日志存入secure(排查SSH登录首选)authpriv.* /var/log/secure# 邮件所有级别日志存入maillogmail.* -/var/log/maillog# 定时任务全部日志存入croncron.* /var/log/cron# 系统崩溃紧急消息广播给所有在线用户*.emerg :omusrmsg:*# news、uucp服务crit及以上严重日志单独存放uucp,news.crit /var/log/spooler# 系统开机日志存入boot.loglocal7.* /var/log/boot.log2.4 /var/log 系统日志文件作用详解表
| 日志文件路径 | 存储内容 | 运维使用场景 |
|---|---|---|
| /var/log/messages | 绝大多数系统通用日志,排除认证、邮件、定时任务 | 服务启动失败、系统进程报错通用排查 |
| /var/log/secure | SSH、用户登录、权限认证日志 | SSH 免密失效、密码登录失败、暴力破解排查 |
| /var/log/cron | 定时任务执行记录 | crontab 脚本不执行、定时任务报错 |
| /var/log/maillog | 邮件收发日志 | 邮件服务故障排查 |
| /var/log/boot.log | 系统开机启动打印信息 | 开机硬件、内核启动异常 |
2.5 日志内容字段拆解(小白逐段翻译)
执行命令实时查看日志:
[root@server ~]# tail -f /var/log/messagesNov1010:23:05 centos7 systemd-logind: New session15of user jhl.逐字段拆分:
Nov 10 10:23:05:日志生成时间centos7:产生日志的服务器主机名systemd-logind:输出这条日志的进程名称New session 15 of user jhl.:日志详细描述内容
SSH 登录日志示例:
[root@server ~]# tail -f /var/log/secureNov1010:27:26 centos7 sshd[2755]: Accepted passwordforjhl from10.1.8.1 port5530ssh2解读:jhl 用户从 10.1.8.1 主机使用 5530 端口 SSH 密码登录成功
三、rsyslog 自定义日志完整实验
3.1 实验目的
- 掌握自定义日志规则编写,业务程序可单独输出专属日志,不混杂系统日志;
- 理解 facility 自定义设备 local0~7 的使用方法;
- 学会 logger 命令手动模拟生成日志,验证配置是否生效;
- 掌握修改 rsyslog 配置后重载服务的标准流程。
3.2 整体实验思路
- 在扩展配置目录新建专属日志配置文件,定义 local5 所有级别日志写入自定义文件;
- 重启 rsyslog 服务加载新规则;
- 使用 logger 命令生成local5.info测试日志;
- 查看自定义日志文件,验证日志是否正常写入。
3.3 逐行命令 + 完整注释
# 1. 在rsyslog扩展目录新建自定义日志配置文件jhl.conf# vim:文本编辑工具;/etc/rsyslog.d/ 官方推荐自定义配置存放目录[root@server ~]# vim /etc/rsyslog.d/jhl.conf# 文件内写入规则# local5.* 代表local5设备所有优先级日志;/var/log/jhl.log 日志存储路径local5.* /var/log/jhl.log# 2. 重启rsyslog服务,加载新增日志规则# systemctl restart:重启系统服务;rsyslog.service 日志服务名称[root@server ~]# systemctl restart rsyslog.service# 3. 此时查看日志文件会提示不存在,日志文件不会自动创建,需要写入第一条日志才生成[root@server ~]# ls /var/log/jhl.logls: 无法访问/var/log/jhl.log: 没有那个文件或目录# 4. logger命令手动模拟业务输出日志# logger:手动生成syslog日志工具# -p local5.info:指定日志设备local5,优先级info# "test my custom log by jhl" 自定义日志内容[jhl@server ~]$ logger-plocal5.info"test my custom log by jhl"# 5. 读取自定义日志文件,验证配置生效[root@server ~]# cat /var/log/jhl.logNov1010:32:26 centos7 jhl:testmy custom log by jhl3.4 实验现象解读
执行 logger 后自动生成/var/log/jhl.log,日志格式和系统内置日志完全统一,后续业务程序指定 local5 即可独立输出日志,方便单独排查。
四、rsyslog 三大 SSH 故障模拟 + 完整排错思路
故障 1:sshd_config 配置文件丢失,sshd 服务启动失败
故障复现代码
# 移动sshd主配置文件到当前目录,模拟文件丢失[root@server ~]# mv /etc/ssh/sshd_config .# 重启sshd服务直接启动失败[root@server ~]# systemctl restart sshd# 根据上面的提示查看sshd的详细信息[root@server ~]# systemctl status sshd.service# 通过读取日志内容,仅仅提示服务启动失败,看不到其他信息了,所以要查看系统通用日志/var/log/messages排错完整思路
- 故障现象:执行重启命令无报错提示,但服务启动失败,无法远程 SSH;
- 排查手段:实时监控系统通用日志
/var/log/messages;
# -f 实时滚动输出日志,持续监控服务启动日志[root@server ~]# tail -f /var/log/messages按G,跳到日志的最后,有详细的报错信息。
- 关键报错关键字:
/etc/ssh/sshd_config: No such file or directory - 故障根因:sshd 启动时读取指定路径配置文件,文件被移动找不到,进程直接退出;
实用技巧:
为了防止终端被占用,将tail -f /var/log/messages放到后台。
继续重启sshd服务,可以看到详细的报错信息
修复方案:将配置文件移回原目录,重启服务验证ssh 远程连接恢复正常。
[root@server ~]# mv sshd_config /etc/ssh/[root@server ~]# systemctl restart sshd注意:不要忘记将后台的进程终止
故障 2:sshd_config 写入无效参数hello world,配置语法错误
故障复现代码
# 向sshd配置文件末尾写入无效内容hello world,制造语法错误[root@server ~]# echo hello world >> /etc/ssh/sshd_config# 重启sshd服务失败[root@server ~]# systemctl restart sshdJobforsshd.service failed because the control process exited with error code. See"systemctl status sshd.service"and"journalctl -xe"fordetails.# 没有详细的错误提示排错完整思路
- 故障现象:sshd 启动失败,无直观提示;
- 监控 messages 日志抓取报错;
- 关键报错:
Bad configuration option: hello,提示存在不认识的配置参数; - 根因:sshd 读取配置时识别到非法参数,终止启动流程;
将后台进程终止
修复方法1:
提示141行有语法错误,使用:141快速定位到141行,将hello world删除,并重启服务。
修复方法2:sed 删除包含 hello 的错误行
# -i 直接修改文件;/hello/d 删除匹配hello的行[root@server ~]# sed -i '/hello/d' /etc/ssh/sshd_config[root@server ~]# systemctl restart sshd🚨通用排错模板文本框 以后任何 systemd 服务启动失败,统一流程:
- tail -f /var/log/messages 实时监控日志
- 重启异常服务,捕获报错关键字
- 根据报错修复文件 / 配置
- 重启服务验证恢复
故障 3:在root@server下执行 sudo vim /etc/ssh/sshd_config,ctrl+Z 暂停后 放到后台运行,又切换到普通用户jhl@server中执行sudo vim /etc/ssh/sshd_config,错误提示为:有个进程正在运行。报错的信息如下图:
故障复现代码
排错完整思路
1.既然有个进程正在运行,就用ps 进程ID 命令进行查看
2.查看到进程的状态为T,暂停的意思.
3.使用tty查看终端,并使用jobs 查看后台的进程,发现在普通用户下用jobs查看没有,再切换到root下用jobs查看.
4.将后台进程用fg命令放入前台,CTRL+c 终止前台进程,再用ps 命令查看
5.验证,普通用户jhl@server中执行sudo vim /etc/ssh/sshd_config,没有报错信息,可以正常进入编辑模式。
错误做法:将别人正在编辑的文件进行kill -9 强制杀死进程。
[jianghuilin@server ~]sudovim/etc/ssh/sshd_config[jianghuilin@server ~]sudokill-911138# 用ps 查看,没有进程[jianghuilin@server ~]ps-CvimPID TTY TIME CMD# 再次vim 还是出现报错信息[jianghuilin@server ~]sudovim/etc/ssh/sshd_config如何解决?将缓存文件删掉。用rm命令
补充:是否能kill,取决于什么?
应用管理员,这个程序是由谁负责的?
补充:并不是所有的日志都被存放在/var/log/messages中,/var/log/messages存放的是操作系统的日志。
- 虽然系统提供了日志服务,但并不会记录所有内容。
- 系统中的应用程序是否使用 rsyslog 服务记录日志,取决于应用程序设计。
例如:
httpd 服务使用自己的日志记录。
sshd 服务使用 rsyslog 服务记录登录和退出日志。
五、systemd-journald 二进制日志体系
systemd-journald 配置文件/etc/systemd/journald.conf
举一反三:找到其他服务的相关配置文件
5.1 journald 核心特点
- 二进制存储,不能 cat/less 直接读取,专用工具
journalctl解析; - 收集全系统日志,支持按服务、时间、日志级别精准过滤;
- 默认内存存储,服务器重启日志清空,需手动配置持久化到磁盘。
5.2 日志持久化存储配置实验
实验目的
解决默认日志重启丢失问题,配置永久保存日志到磁盘,长期追溯历史故障。
实验思路
- 修改 journald 主配置文件 Storage 参数为 persistent;
- 重启 journald 服务加载配置;
- 重启服务器验证日志是否保留。
逐行命令注释
# 编辑journald配置文件[root@server ~]# vim /etc/systemd/journald.conf[Journal]# Storage=auto 注释默认配置Storage=persistent# 重启日志服务生效[root@server ~]# systemctl restart systemd-journald# 查看持久化日志存储目录,自动生成机器唯一ID文件夹[root@server ~]# ls /var/log/journal/b8b0960cabe3452ca432f45acb1df028Storage 参数对照表
[root@sever ~18:23:18]# man journald.conf# 进入文件输入关键字,进行搜索/Storage| 参数值 | 存储路径 | 重启日志保留 | 适用场景 |
|---|---|---|---|
| volatile | /run/log/journal(内存) | 不保留,重启清空 | 临时测试机器 |
| persistent | /var/log/journal(磁盘) | 永久保存 | 生产服务器推荐 |
| auto | 自动判断目录 | 有目录则持久,否则内存 | 系统默认配置 |
六、journalctl 高频查询命令大全(每条参数详细解释)
# 1. 查看全部系统日志,分页展示[root@server ~]# journalctl# journalctl:二进制日志专用查看工具# G 跳到最后 ,g 跳到最前# 2. -f 实时动态刷新日志,等同于tail -f[root@server ~]# journalctl -f# 3. -b 0 查看本次开机所有日志;-b 1上一次开机日志[root@server ~]# journalctl -b 0# 4. -n 5 只输出最后5条日志[root@server ~]# journalctl -n 5# 5. -p err 只过滤错误级别及以上严重日志,快速定位故障[root@server ~]# journalctl -p err# 6. --since today 筛选今日全部日志;--since "-1 hour" 一小时内日志[root@server ~]# journalctl --since today[root@server ~]# journalctl --since "-1 hour"# 7. -o verbose 输出日志完整底层字段,深度排查使用[root@server ~]# journalctl -o verbose# 最常用# 8. -u sshd.service 只查看sshd服务专属日志,排查SSH故障首选[root@server ~]# journalctl -u sshd.service# 实时更新[root@server ~]# journalctl -u sshd.service -f拓展:journalctl -f 后台长期监控日志(解决占用终端痛点)
实验需求
前台执行 journalctl -f 会霸占终端,无法同时操作服务器,放到后台持续采集日志,关闭 SSH 不中断。
推荐长期后台命令(带完整注释)
# nohup忽略挂断信号,关闭ssh进程不退出;--no-pager关闭分页器(后台必加)# > /tmp/journal_monitor.log 2>&1 标准输出+错误输出全部写入日志文件;&丢后台[root@server ~]# nohup journalctl -f --no-pager > /tmp/journal_monitor.log 2>&1 &# 实时查看后台采集到的日志[root@server ~]# tail -f /tmp/journal_monitor.log# 停止后台监控[root@server ~]# ps aux | grep journalctl[root@server ~]# kill 查到的进程PID⚠️避坑提示:不加
--no-pager后台无日志输出,分页工具会卡住采集进程。
七、journalctl 三大真实故障完整排错实战
故障 1:sshd_config 文件丢失,服务启动失败
复现操作
[root@server ~]# mv /etc/ssh/sshd_config .[root@server ~]# systemctl restart sshd# 监控日志进程放后台去刷新日志[root@server ~]# journalctl -f &# 再次restart[root@server ~]# systemctl restart sshd排错思路
- 实时监控 journal 日志:
journalctl -f; - 捕获报错:
/etc/ssh/sshd_config: No such file or directory; - 根因:配置文件缺失;
- 修复:移回文件,重启 sshd。
修复代码
故障 2:sshd 配置写入非法参数
[root@server ~]# echo 'PermitRootLogin hahaha' >> /etc/ssh/sshd_config[root@server ~]# systemctl restart sshd排错思路
- journalctl -f 抓取报错:不支持的配置项 hahaha;
- 使用 sed 删除错误行;
- 重启服务恢复。
# 重启服务时,动态监控日志[root@server ~]# journalctl -f7月2414:30:03 server.laoma.cloud systemd[1]: Stopped OpenSSH server daemon.7月2414:30:03 server.laoma.cloud systemd[1]: Starting OpenSSH server daemon...7月2414:30:03 server.laoma.cloud sshd[2806]: /etc/ssh/sshd_config line141: unsupported option"hahaha".7月2414:30:03 server.laoma.cloud systemd[1]: sshd.service: main process exited,code=exited,status=257月2414:30:03 server.laoma.cloud systemd[1]: Failed to start OpenSSH server daemon.7月2414:30:03 server.laoma.cloud systemd[1]: Unit sshd.service entered failed state.# 清理对应无效记录,并重启服务[root@server ~14:33:32]# sed -i '/hahaha/d' /etc/ssh/sshd_config[root@server ~]# systemctl restart sshd故障 3:httpd 监听端口非法(80000 超出端口范围)
[root@server ~]# yum install -y httpd[root@server ~]# sed -i 's/Listen 80/Listen 80000/g' /etc/httpd/conf/httpd.conf[root@server ~]# systemctl restart httpd排错思路
- 监控 journal 日志,报错
Invalid address or port非法端口; - 还原 Listen 80 标准端口;
- 重启 httpd 服务正常启动。
处理过程:通过日志发现AH00526: Syntax error on line 42 of /etc/httpd/conf/httpd.conf
# 重启服务时,动态监控日志[root@server ~]# journalctl -f7月2414:34:49 server.laoma.cloud systemd[1]: Starting The Apache HTTP Server...7月2414:34:49 server.laoma.cloud httpd[2877]: AH00526: Syntax error on line42of /etc/httpd/conf/httpd.conf:7月2414:34:49 server.laoma.cloud httpd[2877]: Invalid address or port7月2414:34:49 server.laoma.cloud systemd[1]: httpd.service: main process exited,code=exited,status=1/FAILURE7月2414:34:49 server.laoma.cloud systemd[1]: Failed to start The Apache HTTP Server.7月2414:34:49 server.laoma.cloud systemd[1]: Unit httpd.service entered failed state.# 修改回来,并重启服务[root@server ~]# sed -i 's/Listen 80000/Listen 80/g' /etc/httpd/conf/httpd.conf[root@server ~]# systemctl restart httpd统一排错流程总结文本框
- 服务启动失败 →
journalctl -f实时监控日志 - 重启异常服务,捕获红色报错关键字
- 根据报错修改配置 / 恢复缺失文件
- 重启服务验证运行状态
八、小白终极总结
1. 两套日志工具使用场景区分
- rsyslog:文本日志,适合长期归档、简单查看,固定日志路径
/var/log/; - journalctl:二进制日志,过滤、按服务 / 时间筛选更强,故障排查首选。
2. 核心实验收获
- 掌握日志 facility、优先级、匹配符号规则,可自定义业务专属日志;
- 学会两种日志体系排查服务启动故障的标准流程;
- 实现 journalctl 后台长期监控,解放终端;
- 理解 SSH 登录、服务崩溃日志存放位置,以后遇到同类问题不用到处查资料。
3. 运维面试高频考点
- rsyslog 和 systemd-journald 的区别与分工?
- /var/log/secure、/var/log/messages 分别存放什么日志?
- journalctl 日志如何永久保存,配置参数是什么?
- 服务启动失败,怎么通过日志快速定位报错?
- 自定义 rsyslog 日志如何编写规则,logger 命令作用?