云计算基础-11:Linux日志管理

📌 博客原文链接:Breeze

日志是 Linux 系统的"黑匣子"——它默默记录着系统运行的一切信息:用户登录、程序启动、错误告警、安全事件……当系统出现问题时,日志是你最可靠的排查工具

但日志文件如果无限增长,会占满磁盘空间。如何既保留重要日志,又控制磁盘占用?这就是日志管理的核心命题。本文将系统讲解rsyslog系统日志管理和logrotate日志轮转工具,帮你建立完整的日志管理能力。


简介

日志管理的两大核心任务

任务工具核心问题说明
任务一:日志收集与存储rsyslog哪类程序 → 产生什么日志 → 放到哪里系统专职日志程序
任务二:日志轮转与清理logrotate如何分割管理、删除旧日志节省空间、整理方便

打个比方:


任务一:rsyslog 系统日志管理

处理日志的进程

Linux 中的日志主要由两类进程处理:

第一类:系统专职日志程序(rsyslogd)

rsyslogd是系统的专职日志程序,负责处理绝大部分日志记录,包括:

查看 rsyslogd 进程:

[root@localhost ~]# ps aux | grep rsyslogdroot75230.00.42144524560? Ssl15:010:00 /usr/sbin/rsyslogd-n

rsyslogd进程正常运行,是系统日志记录的根本保障。

第二类:应用程序自身日志

各类应用程序可以以自己的方式记录日志:

程序日志文件说明
httpd/var/log/httpd/access_logWeb 访问日志
nginx/var/log/nginx/access.logNginx 访问日志
mysql/var/log/mysqld.logMySQL 运行日志

这些应用程序的日志会在后续学习对应程序时逐步介绍。


常见的日志文件

系统、进程、应用程序产生的日志存放在/var/log/目录下。

核心日志文件

日志文件说明查看命令示例
/var/log/messages系统主日志文件(最重要)tail -10 /var/log/messages
/var/log/secure认证、安全日志(SSH 登录等)tail -f /var/log/secure
/var/log/yum.logYUM 包管理日志tail /var/log/yum.log
/var/log/maillog邮件(Postfix)相关日志tail /var/log/maillog
/var/log/cron计划任务(crond、at)日志tail /var/log/cron
/var/log/dmesg系统启动相关日志tail /var/log/dmesg

其他日志文件

日志文件说明对应命令
/var/log/audit/audit.log系统审计日志-
/var/log/mysqld.logMySQL 数据库日志-
/var/log/xferlogFTP 服务器访问日志-
/var/log/wtmp当前登录的用户w命令
/var/log/btmp最近登录的用户last命令
/var/log/lastlog所有用户的登录情况lastlog命令

注意wtmpbtmplastlog是二进制文件,不能用cat直接查看,需要使用对应的命令(wlastlastlog)。

实时查看日志

# 动态查看日志文件尾部(实时更新)[root@localhost ~]# tail -f /var/log/messages# 或者[root@localhost ~]# tailf /var/log/secure

-f参数的作用:持续跟踪日志文件的最新内容,非常适合实时监控。


实战:观察网站访问日志

步骤 1:安装并启动 Apache

[root@localhost ~]# yum install -y httpd[root@localhost ~]# systemctl start httpd[root@localhost ~]# systemctl stop firewalld

步骤 2:访问服务器 IP

打开浏览器,输入服务器 IP 地址进行访问。

步骤 3:观察访问日志

[root@localhost ~]# tailf /var/log/httpd/access_log

每次有人访问网站,这里都会产生一条新的记录,包括访问者 IP、访问时间、访问的页面等。


rsyslogd 配置

安装与启动

# 安装(通常默认已安装)[root@localhost ~]# yum install rsyslog logrotate# 启动服务[root@localhost ~]# systemctl start rsyslog.service# 设置开机自启[root@localhost ~]# systemctl enable rsyslog.service

相关配置文件

# 查看 rsyslog 的配置文件[root@localhost ~]# rpm -qc rsyslog
文件说明重要程度
/etc/rsyslog.confrsyslogd主配置文件⭐⭐⭐ 最关键
/etc/sysconfig/rsyslogrsyslogd 相关配置,定义级别等⭐ 了解即可
/etc/logrotate.d/syslog日志轮转(切割)配置任务二讲解

主配置文件详解

/etc/rsyslog.conf的核心是RULES(规则)——它告诉 rsyslogd 进程:什么日志,应该存到哪里。

规则的组成

每条规则由三部分组成:

设备(FACILITY)+ 级别(LEVEL)+ 存放位置(FILE)

示例:

authpriv.* /var/log/secure# SSH 安全信息mail.* -/var/log/maillog# 邮件日志(异步写入)cron.* /var/log/cron# 计划任务日志

-符号的含义:表示使用异步方式记录日志。因为日志一般比较大,异步写入可以提高性能。

排除规则

*.info;mail.none;authpriv.none;cron.none /var/log/messages

这条规则表示:记录所有设备 info 级别及以上的日志,但排除邮件(mail)、认证(authpriv)、计划任务(cron)的日志。因为这些日志已经有各自专门的日志文件了。


FACILITY(设备类型)

Facility(设备)是系统对某种类型应用事件的定义。程序自身会决定将日志交给哪类设备处理。比如 SSH 程序会选择安全类设备(AUTHPRIV),这一点由开发者在程序中定义。

设备说明示例场景
syslogsyslogd 自身产生的日志日志系统内部信息
authpriv安全认证SSH 登录、sudo 操作
cron调度程序crond 和 at 计划任务
mail邮件子系统Postfix、Sendmail
user用户相关(默认)用户空间程序
daemon后台进程系统守护进程
ftpFTP 守护进程vsftpd、proftpd
kern内核消息内核级别的错误
lpr打印机子系统打印服务
local0~local7用户自定义设备自定义应用程序日志

local0~local7是预留给用户自定义的设备类型,当某个应用程序需要将日志单独管理时,可以分配一个 local 设备。

查看完整的设备定义:

[root@localhost ~]# man 3 syslog

LEVEL(日志级别)

日志级别定义了日志的重要程度。从下到上,级别从低到高,记录的信息越来越少(即高级别包含低级别的所有信息)。

级别英文说明示例场景
debugLOG_DEBUG调试信息开发排错所需,生产环境不建议使用
infoLOG_INFO标准信息正常的运行信息
noticeLOG_NOTICE重要的标准信息需要关注但不紧急
warningLOG_WARNING警告信息潜在问题,需要关注
errLOG_ERR错误行为程序运行出现错误
critLOG_CRIT致命行为严重的系统问题
alertLOG_ALERT需要立即处理如磁盘使用率达到 95%
emergLOG_EMERG紧急,致命服务无法继续运行,如配置文件丢失

级别符号说明:

符号含义示例说明
*所有级别authpriv.*认证设备的所有级别
.该级别及以上mail.info邮件的 info 及更高级别
.=仅该级别mail.=info仅邮件的 info 级别
.!排除该级别mail.!info邮件的所有级别但排除 info

规则工作原理图示

┌─────────────────────────────────────────────────┐ │ 应用程序产生日志 │ │ (SSH、cron、httpd、mysql ...) │ └──────────────┬──────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────┐ │ rsyslogd 守护进程 │ │ ┌───────────────────────────────────────────┐ │ │ │ 匹配 RULES 规则 │ │ │ │ 设备(FACILITY) + 级别(LEVEL) → 文件路径 │ │ │ └───────────────────────────────────────────┘ │ └──────────────┬──────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────┐ │ 写入对应的日志文件 │ │ /var/log/secure ← authpriv.* │ │ /var/log/cron ← cron.* │ │ /var/log/messages ← *.info (排除特定设备) │ │ ... │ └─────────────────────────────────────────────────┘

实战:自定义 SSH 日志输出

场景:将 SSH 登录日志输出到自定义的日志文件中,方便单独管理。

步骤 1:修改 SSH 程序的设备类型

[root@localhost ~]# vim /etc/ssh/sshd_config# 找到这行:# SyslogFacility AUTHPRIV# 修改为:SyslogFacility LOCAL5

将 SSH 程序的日志输出设备从AUTHPRIV改为LOCAL5(用户自定义设备)。

步骤 2:修改 rsyslog 规则

[root@localhost ~]# vim /etc/rsyslog.conf# 在文件末尾添加:local5.* /var/log/sshd_custom.log

这表示:LOCAL5 设备的所有级别日志,都写入/var/log/sshd_custom.log

步骤 3:重启服务

[root@localhost ~]# systemctl restart rsyslog.service sshd

步骤 4:测试验证

使用另一个终端登录服务器,然后查看新的日志文件:

[root@localhost ~]# tailf /var/log/sshd_custom.logMay2517:26:37 localhost sshd[14441]: Accepted passwordforroot from192.168.100.1 port62925ssh2

可以看到 SSH 登录信息被成功记录到了自定义的日志文件中!


任务二:logrotate 日志轮转

简介

日志轮转(Log Rotation):将大量日志文件按时间或大小等维度分割成多份,并自动删除时间久远的旧日志。

为什么需要日志轮转?

打个比方:

日志文件就像一本记录系统行为的日记本。如果一直写下去,日记本会越来越厚,最终书架都放不下。日志轮转的做法就是:每天换一本新日记本,旧日记本保留一段时间后就扔掉。


工作原理

logrotate 按照配置文件中的规则自动进行日志轮转。

配置文件种类

配置文件路径说明
主配置文件/etc/logrotate.conf全局设置,决定每个日志文件如何轮转
子配置目录/etc/logrotate.d/*自定义配置,便于管理各个服务的日志轮转

查看主配置文件和子配置文件:

[root@localhost ~]# ls /etc/logrotate.conf /etc/logrotate.d//etc/logrotate.conf /etc/logrotate.d/: bootlog chrony cups httpd iscsiuiolog libvirtd libvirtd.qemu numad ppp psacct samba syslog wpa_supplicant yum

主配置文件详解

[root@localhost ~]# vim /etc/logrotate.conf

全局设置

# 全局轮转设置weekly# 轮转周期:每周轮转一次rotate4# 保留 4 份旧日志create# 轮转后创建新的空日志文件dateext# 使用日期作为文件后缀名# compress # 是否压缩旧日志文件(注释掉表示不压缩)# 包含子配置目录include /etc/logrotate.d

全局参数说明:

参数说明
daily每天轮转
weekly每周轮转
monthly每月轮转
yearly每年轮转
rotate N保留 N 份旧日志
create轮转后创建新文件
dateext使用日期作为后缀
compress压缩旧日志文件(gzip)
missingok日志文件丢失不报错
notifempty空文件不轮转
minsize N最小达到指定大小才轮转
maxsize N达到指定大小就轮转

针对特定日志的配置

# 针对 /var/log/wtmp 的轮转配置/var/log/wtmp{monthly# 一月轮转一次minsize 1M# 最小达到 1M 才轮转(需同时满足 monthly 和 minsize)create 0664 root utmp# 轮转后创建新文件,并设置权限rotate1# 保留 1 份}# 针对 /var/log/btmp 的轮转配置/var/log/btmp{missingok# 丢失不提示monthly# 每月轮转一次create 0600 root utmp# 轮转后创建新文件,并设置权限rotate1# 保留 1 份}

实战:配置 YUM 日志轮转

目标:对/var/log/yum.log设置自定义轮转规则。

步骤 1:创建轮转规则

[root@localhost ~]# vim /etc/logrotate.d/yum/var/log/yum.log{missingok# 日志文件丢失不报错# notifempty # 空文件不轮转(注释掉)# maxsize 30k # 达到 30k 就轮转# yearly # 或者一年一轮转daily# 改为每天轮转(测试用,缩短周期)rotate3# 保留 3 份旧日志create 0777 root root# 轮转后创建新文件,并设置权限}

步骤 2:手动轮转(测试)

# 错误示范:直接执行,不会生效[root@localhost ~]# /usr/sbin/logrotate /etc/logrotate.conf[root@localhost ~]# ls /var/log/yum*/var/log/yum.log# 只有一个文件,因为日期没变,logrotate 认为还没到轮转时间

步骤 3:修改时间,手动触发轮转

# 把时间向未来推移(格式:月日时分)[root@localhost ~]# date 052910002026年 05月29日 星期五10:00:00 CST# 强制执行轮转[root@localhost ~]# /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf# 查看结果[root@localhost ~]# ls /var/log/yum*/var/log/yum.log /var/log/yum.log-20260529

日志文件已经出现多个,说明轮转成功!


关于轮转时间记录

logrotate 会记录每个日志文件最近一次轮转的时间:

[root@localhost ~]# grep 'yum' /var/lib/logrotate/logrotate.status"/var/log/yum.log"2026-5-29-10:0:12

如果从未轮转过:第一次执行只记录时间,不会立即轮转。

这就是为什么第一次手动执行logrotate看不到效果的原因——logrotate 认为"今天已经轮转过了"。


logrotate 常用参数汇总

参数说明示例
daily每天轮转daily
weekly每周轮转weekly
monthly每月轮转monthly
rotate N保留 N 份rotate 4(保留 4 份)
create mode owner group轮转后创建新文件create 0644 root root
dateext使用日期后缀dateext
dateformat自定义日期格式dateformat -%Y%m%d
compress压缩旧日志compress
delaycompress延迟一次压缩compress+delaycompress
missingok文件丢失不报错missingok
notifempty空文件不轮转notifempty
minsize N最小大小才轮转minsize 1M
maxsize N达到大小就轮转maxsize 100M
copytruncate复制并截断(替代 create)copytruncate
postrotate轮转后执行的脚本postrotate ... endscript
prerotate轮转前执行的脚本prerotate ... endscript

生产环境实战

实战一:Nginx 日志轮转

[root@localhost ~]# vim /etc/logrotate.d/nginx/var/log/nginx/*.log{daily# 每天轮转rotate30# 保留 30 天missingok# 丢失不报错notifempty# 空文件不轮转compress# 压缩旧日志delaycompress# 延迟一次压缩(最新的旧日志不压缩,方便查看)dateext# 使用日期后缀dateformat -%Y%m%d# 日期格式sharedscripts# 所有日志轮转后只执行一次脚本postrotate# 轮转后通知 nginx 重新打开日志文件[-f/var/run/nginx.pid]&&kill-USR1$(cat/var/run/nginx.pid)endscript}

实战二:自定义应用日志轮转

[root@localhost ~]# vim /etc/logrotate.d/myapp/var/log/myapp/*.log{daily rotate7missingok notifempty compress size 50M# 达到 50MB 就轮转(覆盖 daily)create 0644 www www postrotate systemctl reload myapp endscript}

实战三:MySQL 日志轮转

[root@localhost ~]# vim /etc/logrotate.d/mysql/var/log/mysql/*.log{daily rotate14compress delaycompress missingok notifempty create 0640 mysql adm sharedscripts postrotatetest-x/usr/bin/mysqladmin&&\/usr/bin/mysqladmin flush-logs endscript}

手动执行 logrotate

# 普通执行(检查配置文件是否有误)[root@localhost ~]# logrotate /etc/logrotate.conf# 强制执行(不管是否到期都轮转)[root@localhost ~]# logrotate -f /etc/logrotate.conf# 调试模式(不实际执行,只输出会做什么)[root@localhost ~]# logrotate -d /etc/logrotate.conf# 详细模式(输出详细执行过程)[root@localhost ~]# logrotate -v /etc/logrotate.conf

生产环境建议:先用-d调试模式测试,确认无误后再正式执行。


常见问题

rsyslog 服务没有运行怎么办?

# 检查服务状态[root@localhost ~]# systemctl status rsyslog# 启动并设置开机自启[root@localhost ~]# systemctl start rsyslog[root@localhost ~]# systemctl enable rsyslog

日志文件太大,如何快速清理?

# 方法一:清空文件(保留文件,清空内容)[root@localhost ~]# > /var/log/messages# 方法二:手动触发轮转[root@localhost ~]# logrotate -f /etc/logrotate.conf# 方法三:压缩旧日志[root@localhost ~]# gzip /var/log/messages-20240101

不要直接删除日志文件!这会导致 rsyslogd 继续向已删除的文件描述符写入,磁盘空间不会释放。正确做法是清空文件内容或触发轮转。

如何查看谁在什么时候登录了系统?

# 查看当前登录的用户[root@localhost ~]# w# 查看最近的登录记录[root@localhost ~]# last# 查看所有用户的最近登录时间[root@localhost ~]# lastlog# 查看认证日志(SSH 登录详情)[root@localhost ~]# tail -f /var/log/secure

logrotate 没有自动执行怎么办?

logrotate 是通过 cron 定时任务触发执行的:

# 检查 cron 任务[root@localhost ~]# cat /etc/cron.daily/logrotate# 检查 cron 服务[root@localhost ~]# systemctl status crond# 手动执行测试[root@localhost ~]# /usr/sbin/logrotate /etc/logrotate.conf

最佳实践

  1. 定期检查日志大小

    # 找出 /var/log 下最大的日志文件du-sh/var/log/*|sort-rh|head-10
  2. 合理设置日志保留时间

  3. 启用日志压缩

    compress delaycompress# 延迟一次压缩,最新旧日志保持未压缩方便查看
  4. 集中日志管理

  5. 安全日志特殊处理

    # /var/log/secure 需要保留更长时间# 建议设置单独的轮转规则,保留 6 个月以上
  6. 日志轮转后重启服务

    postrotate systemctl reload httpd endscript

总结

通过本章节的学习,你应该掌握了:

学习建议:日志管理是运维排障的核心技能。建议在自己的虚拟机上:修改 rsyslog 配置将特定日志输出到自定义文件;配置一个服务的日志轮转规则;手动触发轮转并观察结果。实际操作一遍,胜过阅读十遍文档!