📌 这篇是「了解」级别 —— 知道日志在哪、大概怎么配就够了,真用到了再回来查细节。
一、日志存在哪
绝大部分日志文件都在 /var/log 目录下。
常见日志文件一览
| 日志文件 | 说明 |
|---|---|
/var/log/boot.log | 系统启动日志 |
/var/log/cron | 记录与系统定时任务相关的日志 |
/var/log/cups/ | 记录打印信息 |
/var/log/dmesg | 系统开机时内核自检的信息,也可以用 dmesg 命令直接看 |
/var/log/btmp | 记录错误登录的日志。⚠️ 二进制文件,不能 vi 查看,用 lastb |
/var/log/lastlog | 记录所有用户最后一次登录时间。⚠️ 二进制文件,用 lastlog |
/var/log/maillog | 记录邮件信息 |
/var/log/message | ⭐ 记录系统绝大多数重要信息。系统出问题第一个要看的就是它 |
/var/log/secure | 记录验证和授权信息。涉及账户密码的都在这:登录、ssh、su、sudo、增删用户、改密码 |
/var/log/wtmp | 永久记录所有用户的登录、注销,以及系统启动/重启/关机事件。⚠️ 二进制,用 last |
/var/run/utmp | 记录当前已登录的用户,随登录注销不断变化。⚠️ 用 w、who、users 查看 |

规律:带b或w的(btmp、wtmp、lastlog)都是二进制文件,不能直接 cat/vi,
要用专门的命令读取。
判断方法:file /var/log/btmp会告诉你它是什么类型。
二、日志服务 rsyslogd
日志由守护进程 rsyslogd 负责收集和写入。
# 查看服务是否启动(-v 是反向匹配,排除掉 grep 自己)
ps -ef | grep "rsyslog" | grep -v "grep"
# 查看是否开机自启
systemctl list-unit-files | grep "rsyslog"
💡-v的作用是"不包含"。 不加-v "grep"的话,grep自己的进程也会出现在结果里。
三、rsyslog 配置文件
配置文件是 /etc/rsyslog.conf,它决定了"什么日志写到哪个文件"。
3.1 基本格式
*.* 存放日志文件
└┬┘
├─ 第一个 * :日志类型
└─ 第二个 * :日志级别
3.2 日志类型
| 类型 | 说明 |
|---|---|
auth | pam 产生的日志 |
authpriv | ssh、ftp 等登录信息的验证信息 |
cron | 时间任务相关 |
kern | 内核 |
lpr | 打印 |
mail | 邮件 |
mark(syslog)-rsyslog | 服务内部的信息、时间标识 |
news | 新闻组 |
user | 用户程序产生的相关信息 |
uucp | unix to unix copy,主机之间相关的通信 |
local 1-7 | 自定义的日志设备 |

3.3 日志级别
| 级别 | 说明 |
|---|---|
debug | 有调试信息的,日志通信最多 |
info | 一般信息日志,最常用 |
notice | 最具重要性的普通条件的信息 |
warning | ⚠️ 警告级别 |
err | 错误级别,阻止某个功能或模块不能正常工作的信息 |
crit | 严重级别,阻止整个系统或整个软件不能正常工作的信息 |
alert | 需要立刻修改的信息 |
emerg | 内核崩溃等重要信息 |
none | 什么都不记录 |
🔑 从上到下,级别从低到高,记录的信息越来越少。

3.4 看几条真实配置
# Everybody 类型和 emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
可以看出三段结构:「类型.级别」 → 「日志写到哪」。

3.5 日志文件里的内容格式
事件时间 产生事件服务器的主机名 服务名/程序名:事件信息
四、日志轮替 logrotate
4.1 为什么要轮替
日志会不停地增长,迟早把磁盘撑满。
轮替就是:把旧日志移走改名,腾出位置记录新日志。这样既能保存历史,又能清晰地记录新内容。
4.2 两个配置文件
| 文件 | 作用 |
|---|---|
/etc/logrotate.conf | 全局轮替规则 |
/etc/logrotate.d/ | 放单个日志的轮替规则(会被 include 进主配置) |
/etc/logrotate.conf 的实际内容(带注释):
# rotate log files weekly,每周对日志文件进行一次轮替
weekly
# keep 4 weeks worth of backlogs,共保存 4 份
rotate 4
# create new (empty) log files after rotating old ones
create
# use date as a suffix of the rotated file,使用日期作为后缀
dateext
# uncomment this if you want your log files compressed,是否压缩
#compress
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
# 下面是单独配置,优先级更高
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp {
monthly
create 0664 root utmp
minsize 1M
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
💡 include /etc/logrotate.d 是关键一行:它把那个目录下的所有子配置文件都读进来。

4.3 单个日志的规则放哪
cd /etc/logrotate.d/
ls
# bootlog cups chrony glusterfs iscsiuiolog libvirt mysql ...
cat bootlog
/var/log/boot.log
{
missingok
daily
copytruncate
rotate 7
notifempty
}

4.4 把「自己的日志」加进轮替
有两种方法:
| 方法 | 做法 | 评价 |
|---|---|---|
| ① 直接写主配置 | 在 /etc/logrotate.conf 里写该日志的轮替策略 | 日志多了会很乱 |
| ② 放独立文件 | 在 /etc/logrotate.d/ 新建一个轮替文件 | ✅ 推荐 |
为什么推荐第二种: 系统里需要轮替的日志非常多,全写进主配置文件,可管理性会变得非常差,不利于维护。

4.5 dateext:决定轮替后怎么命名
| 配置 | 命名方式 |
|---|---|
有 dateext | 用日期做后缀,例如 secure-20201010。文件名不重叠,不需要改名,只要指定保存个数、删掉多余的即可 |
没有 dateext | 需要依次改名:第一次轮替时 secure → secure.1,新建 secure;第二次 secure.1 → secure.2,secure → secure.1,依此类推 |

4.6 参数速查表
| 参数 | 说明 |
|---|---|
daily / weekly / monthly | 轮替周期:每天 / 每周 / 每月 |
rotate 数字 | 保留的日志文件个数。0 指没有备份 |
compress | 轮替时,旧日志进行压缩 |
create mode owner group | 建立新日志,同时指定权限与所有者、所属组 |
mail address | 日志轮替时,输出内容通过邮件发到指定地址 |
missingok | 如果日志不存在,忽略警告 |
notifempty | 如果日志为空,则不进行轮替 |
minsize 大小 | 日志最小值。达到这个值才轮替,否则时间到了也不轮替 |
size 大小 | 只看大小轮替,不按时间 |
dateext | 使用日期作为轮替文件的后缀 |
sharedscripts | 在此关键字之后的脚本只执行一次 |
prerotate/endscript | 在日志轮替之前执行脚本命令 |
postrotate/endscript | 在日志轮替之后执行脚本命令 |

4.7 轮替是怎么被触发的
轮到 crond 出场了 —— 它每天执行一次 /etc/cron.daily/logrotate,由这个脚本来完成实际的轮替工作。
┌──────────────────────────────────────────┐
│ /etc/rsyslog.conf [重点] │
│ /etc/logrotate.conf [全局轮替策略] │
│ ↑ 也可以把单个日志的规则 │
│ 写到 /etc/logrotate.d 目录 │
└──────────────────────────────────────────┘
│
↓
╭─────────────╮
│ rsyslogd │ 后台程序(服务)
╰─────────────╯
│
↓
┌──────────────────────────────────────────┐
│ /var/log/boot.log /var/log/secure ... │
└──────────────────────────────────────────┘
↑
│ 轮替
┌──────────────────────────────────────────┐
│ crond 后台程序 │
│ ╭────────────────────────╮ │
│ │ 每天执行 logrotate │ │
│ ╰────────────────────────╯ │
└──────────────────────────────────────────┘
一句话总结:rsyslogd 负责"写日志",crond 负责"定期轮替日志"。

五、日志轮替的原理:为什么 /etc/cron.daily/ 能干这事
ls /etc/cron.daily/
# ... logrotate ...
/etc/cron.daily/ 里的脚本,会被 crond 每天自动执行一次。logrotate 就是其中之一 —— 它再根据配置文件去处理各个日志。
这就把第三章学的 cron 定时任务 和日志轮替串起来了:
定时任务不只是你能用,系统自己也在用。
六、内存日志:journalctl
除了写在磁盘上的日志文件,systemd 还会把日志收在内存里,用 journalctl 查看。
常用命令
journalctl # 查看全部
journalctl -n 3 # 查看最新 3 条
journalctl --since 19:00 --until 19:10:10 # 指定时间段(可加日期)
journalctl -p err # 只看报错日志
journalctl -o verbose # 日志详细内容
journalctl _PID=1245 _COMM=sshd # 查看包含这些参数的日志(在详细日志里看)
journalctl | grep sshd # 或者直接 grep
⚠️ 注意:journalctl看的是内存日志,重启就清空了。
想验证这点,做个小实验:用journalctl | grep sshd看看用户登录记录 →
重启系统 → 再查一次,对比有什么变化。

七、这一篇的要点
/var/log是日志大本营,message和secure最常看- 二进制日志(
btmp/wtmp/lastlog)要用lastb/last/lastlog查 rsyslogd写日志,配置格式是类型.级别 目标文件logrotate管轮替,自己的规则放/etc/logrotate.d/crond每天调用 logrotate,系统自己也在用定时任务journalctl查内存日志,重启即清空