首页  /  Linux 基础  /  正文

Linux 日志管理(了解)

Linux 基础 2026-10-01📖 12 分钟👁 —
🐧 Linux 运维基础笔记第 7 / 7 页1234567📖 完整导航 →
📌 这篇是「了解」级别 —— 知道日志在哪、大概怎么配就够了,真用到了再回来查细节。

一、日志存在哪

绝大部分日志文件都在 /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 日志类型

类型说明
authpam 产生的日志
authprivssh、ftp 等登录信息的验证信息
cron时间任务相关
kern内核
lpr打印
mail邮件
mark(syslog)-rsyslog服务内部的信息、时间标识
news新闻组
user用户程序产生的相关信息
uucpunix 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

可以看出三段结构:「类型.级别」 → 「日志写到哪」。

rsyslog.conf 实际配置示例

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 是关键一行:它把那个目录下的所有子配置文件都读进来。
logrotate 全局配置文件(含注释)

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
}
/etc/logrotate.d 目录内容与单个配置示例

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,依此类推
dateext 参数对日志命名的影响

4.6 参数速查表

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

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 看看用户登录记录 →
重启系统 → 再查一次,对比有什么变化。
journalctl 常用命令

七、这一篇的要点

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