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

📅 2026/7/27 11:16:21
云计算基础-11:Linux日志管理
博客原文链接Breeze日志是 Linux 系统的黑匣子——它默默记录着系统运行的一切信息用户登录、程序启动、错误告警、安全事件……当系统出现问题时日志是你最可靠的排查工具。但日志文件如果无限增长会占满磁盘空间。如何既保留重要日志又控制磁盘占用这就是日志管理的核心命题。本文将系统讲解rsyslog系统日志管理和logrotate日志轮转工具帮你建立完整的日志管理能力。简介日志管理的两大核心任务任务工具核心问题说明任务一日志收集与存储rsyslog哪类程序 → 产生什么日志 → 放到哪里系统专职日志程序任务二日志轮转与清理logrotate如何分割管理、删除旧日志节省空间、整理方便打个比方rsyslog就像快递员——负责把各种程序的日志收集起来送到对应的文件里logrotate就像档案管理员——负责把堆积如山的日志文件分类整理销毁过期档案任务一rsyslog 系统日志管理处理日志的进程Linux 中的日志主要由两类进程处理第一类系统专职日志程序rsyslogdrsyslogd是系统的专职日志程序负责处理绝大部分日志记录包括系统操作相关信息用户登录/登出信息程序启动/关闭信息系统错误信息查看 rsyslogd 进程[rootlocalhost ~]# ps aux | grep rsyslogdroot75230.00.42144524560? Ssl15:010:00 /usr/sbin/rsyslogd-nrsyslogd进程正常运行是系统日志记录的根本保障。第二类应用程序自身日志各类应用程序可以以自己的方式记录日志程序日志文件说明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命令注意wtmp、btmp、lastlog是二进制文件不能用cat直接查看需要使用对应的命令w、last、lastlog。实时查看日志# 动态查看日志文件尾部实时更新[rootlocalhost ~]# tail -f /var/log/messages# 或者[rootlocalhost ~]# tailf /var/log/secure-f参数的作用持续跟踪日志文件的最新内容非常适合实时监控。实战观察网站访问日志步骤 1安装并启动 Apache[rootlocalhost ~]# yum install -y httpd[rootlocalhost ~]# systemctl start httpd[rootlocalhost ~]# systemctl stop firewalld步骤 2访问服务器 IP打开浏览器输入服务器 IP 地址进行访问。步骤 3观察访问日志[rootlocalhost ~]# tailf /var/log/httpd/access_log每次有人访问网站这里都会产生一条新的记录包括访问者 IP、访问时间、访问的页面等。rsyslogd 配置安装与启动# 安装通常默认已安装[rootlocalhost ~]# yum install rsyslog logrotate# 启动服务[rootlocalhost ~]# systemctl start rsyslog.service# 设置开机自启[rootlocalhost ~]# systemctl enable rsyslog.service相关配置文件# 查看 rsyslog 的配置文件[rootlocalhost ~]# 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、Sendmailuser用户相关默认用户空间程序daemon后台进程系统守护进程ftpFTP 守护进程vsftpd、proftpdkern内核消息内核级别的错误lpr打印机子系统打印服务local0~local7用户自定义设备自定义应用程序日志local0~local7是预留给用户自定义的设备类型当某个应用程序需要将日志单独管理时可以分配一个 local 设备。查看完整的设备定义[rootlocalhost ~]# man 3 syslogLEVEL日志级别日志级别定义了日志的重要程度。从下到上级别从低到高记录的信息越来越少即高级别包含低级别的所有信息。级别英文说明示例场景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 程序的设备类型[rootlocalhost ~]# vim /etc/ssh/sshd_config# 找到这行# SyslogFacility AUTHPRIV# 修改为SyslogFacility LOCAL5将 SSH 程序的日志输出设备从AUTHPRIV改为LOCAL5用户自定义设备。步骤 2修改 rsyslog 规则[rootlocalhost ~]# vim /etc/rsyslog.conf# 在文件末尾添加local5.* /var/log/sshd_custom.log这表示LOCAL5 设备的所有级别日志都写入/var/log/sshd_custom.log。步骤 3重启服务[rootlocalhost ~]# systemctl restart rsyslog.service sshd步骤 4测试验证使用另一个终端登录服务器然后查看新的日志文件[rootlocalhost ~]# 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/*自定义配置便于管理各个服务的日志轮转查看主配置文件和子配置文件[rootlocalhost ~]# 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主配置文件详解[rootlocalhost ~]# vim /etc/logrotate.conf全局设置# 全局轮转设置weekly# 轮转周期每周轮转一次rotate4# 保留 4 份旧日志create# 轮转后创建新的空日志文件dateext# 使用日期作为文件后缀名# compress # 是否压缩旧日志文件注释掉表示不压缩# 包含子配置目录include /etc/logrotate.d全局参数说明参数说明daily每天轮转weekly每周轮转monthly每月轮转yearly每年轮转rotate N保留 N 份旧日志create轮转后创建新文件dateext使用日期作为后缀compress压缩旧日志文件gzipmissingok日志文件丢失不报错notifempty空文件不轮转minsize N最小达到指定大小才轮转maxsize N达到指定大小就轮转针对特定日志的配置# 针对 /var/log/wtmp 的轮转配置/var/log/wtmp{monthly# 一月轮转一次minsize 1M# 最小达到 1M 才轮转需同时满足 monthly 和 minsizecreate 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创建轮转规则[rootlocalhost ~]# vim /etc/logrotate.d/yum/var/log/yum.log{missingok# 日志文件丢失不报错# notifempty # 空文件不轮转注释掉# maxsize 30k # 达到 30k 就轮转# yearly # 或者一年一轮转daily# 改为每天轮转测试用缩短周期rotate3# 保留 3 份旧日志create 0777 root root# 轮转后创建新文件并设置权限}步骤 2手动轮转测试# 错误示范直接执行不会生效[rootlocalhost ~]# /usr/sbin/logrotate /etc/logrotate.conf[rootlocalhost ~]# ls /var/log/yum*/var/log/yum.log# 只有一个文件因为日期没变logrotate 认为还没到轮转时间步骤 3修改时间手动触发轮转# 把时间向未来推移格式月日时分[rootlocalhost ~]# date 052910002026年 05月29日 星期五10:00:00 CST# 强制执行轮转[rootlocalhost ~]# /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf# 查看结果[rootlocalhost ~]# ls /var/log/yum*/var/log/yum.log /var/log/yum.log-20260529日志文件已经出现多个说明轮转成功关于轮转时间记录logrotate 会记录每个日志文件最近一次轮转的时间[rootlocalhost ~]# grep yum /var/lib/logrotate/logrotate.status/var/log/yum.log2026-5-29-10:0:12如果从未轮转过第一次执行只记录时间不会立即轮转。这就是为什么第一次手动执行logrotate看不到效果的原因——logrotate 认为今天已经轮转过了。logrotate 常用参数汇总参数说明示例daily每天轮转dailyweekly每周轮转weeklymonthly每月轮转monthlyrotate N保留 N 份rotate 4保留 4 份create mode owner group轮转后创建新文件create 0644 root rootdateext使用日期后缀dateextdateformat自定义日期格式dateformat -%Y%m%dcompress压缩旧日志compressdelaycompress延迟一次压缩compressdelaycompressmissingok文件丢失不报错missingoknotifempty空文件不轮转notifemptyminsize N最小大小才轮转minsize 1Mmaxsize N达到大小就轮转maxsize 100Mcopytruncate复制并截断替代 createcopytruncatepostrotate轮转后执行的脚本postrotate ... endscriptprerotate轮转前执行的脚本prerotate ... endscript生产环境实战实战一Nginx 日志轮转[rootlocalhost ~]# 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}实战二自定义应用日志轮转[rootlocalhost ~]# vim /etc/logrotate.d/myapp/var/log/myapp/*.log{daily rotate7missingok notifempty compress size 50M# 达到 50MB 就轮转覆盖 dailycreate 0644 www www postrotate systemctl reload myapp endscript}实战三MySQL 日志轮转[rootlocalhost ~]# 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# 普通执行检查配置文件是否有误[rootlocalhost ~]# logrotate /etc/logrotate.conf# 强制执行不管是否到期都轮转[rootlocalhost ~]# logrotate -f /etc/logrotate.conf# 调试模式不实际执行只输出会做什么[rootlocalhost ~]# logrotate -d /etc/logrotate.conf# 详细模式输出详细执行过程[rootlocalhost ~]# logrotate -v /etc/logrotate.conf生产环境建议先用-d调试模式测试确认无误后再正式执行。常见问题rsyslog 服务没有运行怎么办# 检查服务状态[rootlocalhost ~]# systemctl status rsyslog# 启动并设置开机自启[rootlocalhost ~]# systemctl start rsyslog[rootlocalhost ~]# systemctl enable rsyslog日志文件太大如何快速清理# 方法一清空文件保留文件清空内容[rootlocalhost ~]# /var/log/messages# 方法二手动触发轮转[rootlocalhost ~]# logrotate -f /etc/logrotate.conf# 方法三压缩旧日志[rootlocalhost ~]# gzip /var/log/messages-20240101不要直接删除日志文件这会导致 rsyslogd 继续向已删除的文件描述符写入磁盘空间不会释放。正确做法是清空文件内容或触发轮转。如何查看谁在什么时候登录了系统# 查看当前登录的用户[rootlocalhost ~]# w# 查看最近的登录记录[rootlocalhost ~]# last# 查看所有用户的最近登录时间[rootlocalhost ~]# lastlog# 查看认证日志SSH 登录详情[rootlocalhost ~]# tail -f /var/log/securelogrotate 没有自动执行怎么办logrotate 是通过 cron 定时任务触发执行的# 检查 cron 任务[rootlocalhost ~]# cat /etc/cron.daily/logrotate# 检查 cron 服务[rootlocalhost ~]# systemctl status crond# 手动执行测试[rootlocalhost ~]# /usr/sbin/logrotate /etc/logrotate.conf最佳实践定期检查日志大小# 找出 /var/log 下最大的日志文件du-sh/var/log/*|sort-rh|head-10合理设置日志保留时间系统日志保留 4-8 周安全日志保留 3-6 个月合规要求应用日志根据磁盘空间决定启用日志压缩compress delaycompress# 延迟一次压缩最新旧日志保持未压缩方便查看集中日志管理多台服务器的日志建议集中到一台日志服务器可以使用rsyslog的远程日志功能或 ELK 栈安全日志特殊处理# /var/log/secure 需要保留更长时间# 建议设置单独的轮转规则保留 6 个月以上日志轮转后重启服务postrotate systemctl reload httpd endscript总结通过本章节的学习你应该掌握了理解 rsyslog 系统日志管理的工作原理掌握常见的日志文件及其用途messages、secure、cron 等理解 rsyslog.conf 中的 RULES 规则设备 级别 存放位置熟悉各种 FACILITY设备类型和 LEVEL日志级别能够自定义程序日志输出到指定文件理解 logrotate 日志轮转的必要性和工作原理掌握 logrotate.conf 主配置文件的编写能够为不同服务配置独立的日志轮转规则熟练使用手动轮转命令进行测试学习建议日志管理是运维排障的核心技能。建议在自己的虚拟机上修改 rsyslog 配置将特定日志输出到自定义文件配置一个服务的日志轮转规则手动触发轮转并观察结果。实际操作一遍胜过阅读十遍文档