文章目录
- (1)日志类型(Facility):日志是哪来的?
- (2)日志级别(Priority):日志有多重要?
- 四、日志轮替logrotate:防止日志把磁盘撑爆
前言
日志是Linux系统的「黑匣子」,排障、审计、调优全靠它,也是运维方向面试的高频考点。
提示:以下是本篇文章正文内容,下面案例可供参考
一、先搞懂:Linux日志到底是什么?
1.1 日志的核心作用
日志是系统用来记录所有重要事件的文件,小到用户登录、命令执行,大到服务崩溃、内核报错,都会被日志记录下来。核心用处有三个:
- 排障定位:服务启动失败、系统异常重启,翻日志基本能找到根因
- 安全审计:谁尝试登录失败、有没有人修改关键文件,都能查到痕迹
- 性能分析
1.2 日志都存在哪?
Linux绝大多数日志默认存放在 /var/log 目录下,不同类型的日志分门别类放在对应文件里。下面是最常用的核心日志文件,必须记牢:
| | |
|---|
/var/log/secure | 安全认证日志:用户登录、权限验证相关,SSH登录成败全在这 | cat / tail / grep |
/var/log/messages | 系统通用日志:绝大多数系统事件都存在这,排障万金油 | cat / tail / grep |
/var/log/cron | | cat / tail / grep |
/var/log/boot.log | | cat / tail / grep |
/var/log/dmesg | | dmesg |
/var/log/maillog | | cat / tail / grep |
/var/log/lastlog | | lastlog |
/var/log/wtmp | | last |
/var/log/btmp | | lastb |
📌 踩坑提醒:lastlog、wtmp、btmp都是二进制文件,别用vim/cat硬打开,会出现乱码,必须用对应的专用命令查看。
二、核心日志服务:rsyslogd
CentOS 7之后,系统默认的日志服务从syslogd升级为 rsyslogd,功能更强、性能更高,并且完全兼容旧版的配置规则。
2.1 工作原理
rsyslogd就像一个「日志分发员」,它按照配置文件 /etc/rsyslog.conf 里的规则,把不同来源、不同严重程度的日志,分发到不同的日志文件中。
比如SSH登录的认证信息,rsyslogd收到后匹配到认证类规则,就会自动写入/var/log/secure文件。
2.2 两个核心概念:日志类型 & 日志级别
配置文件里最核心的格式是 类型.级别,这也是最容易记混的地方,拆分开就很好理解。
(1)日志类型(Facility):日志是哪来的?
标记日志由哪个模块产生,常见类型如下:
| |
|---|
auth | 认证授权相关,authpriv更偏向隐私认证(如SSH登录) |
cron | |
kern | |
mail | |
lpr | |
user | |
local0~local7 | |
(2)日志级别(Priority):日志有多重要?
按照严重程度从低到高排序,级别越高,记录的信息越少、事件越严重。
| |
|---|
debug | |
info | |
notice | |
warning | |
err | |
crit | |
alert | |
emerg | |
none | |
💡 记忆小技巧:配置中写 mail.info 的意思是「mail类型中,级别>=info的日志全部记录」,不是只记录info级别!
2.3 配置文件格式
/etc/rsyslog.conf 中每一行规则的标准格式:
日志类型.日志级别 日志文件路径
举几个系统原生的配置例子,一看就懂:
# 所有info及以上级别日志存入messages,邮件、认证、定时任务除外(它们有单独文件)
*.info;mail.none;authpriv.none;cron.none /var/log/messages
# 所有认证相关日志,全部存入secure
authpriv.* /var/log/secure
# 定时任务日志单独存放
cron.* /var/log/cron
每条日志的标准输出格式为:事件时间 + 主机名 + 服务/程序名 + 事件详情,例如:
Sep 9 17:25:33 xq100 sshd[1682]: Accepted password for root from 192.168.10.1 port 49929 ssh2
三、实操:自定义一个日志文件
光看不练假把式,我们动手实现:把sshd服务的日志单独存到 /var/log/my_ssh.log 中。
步骤1:修改rsyslog主配置文件
vim /etc/rsyslog.conf
在文件末尾添加一行规则:
# 自定义:SSH认证日志单独存放
authpriv.* /var/log/my_ssh.log
步骤2:创建日志文件(可选)
不手动创建的话,rsyslogd写入时也会自动生成
touch /var/log/my_ssh.log
步骤3:重启服务让配置生效
systemctl restart rsyslog
步骤4:验证效果
重新用终端登录一次服务器,然后查看日志:
cat /var/log/my_ssh.log |grep sshd
如果能看到登录记录,就说明配置成功了。
📌 踩坑提醒:配置语法错误会导致rsyslog服务启动失败,可以用 systemctl status rsyslog 查看状态排查问题。
四、日志轮替logrotate:防止日志把磁盘撑爆
日志会越写越大,如果放任不管,迟早占满磁盘。Linux用 logrotate 实现日志轮替:定期切割旧日志、压缩归档、自动删除过期日志,实现生命周期循环管理。
4.1 主配置文件
全局默认配置在 /etc/logrotate.conf,几个核心参数:
| |
|---|
weekly | |
rotate 4 | |
create | |
dateext | 旧日志用日期作为后缀(如 secure-20220909) |
compress | |
include /etc/logrotate.d | |
补充:如果没有dateext参数,旧日志会用数字递增命名:secure.1、secure.2… 最新的日志永远叫原名。
4.2 自定义轮替规则
系统中各个服务的轮替规则都放在 /etc/logrotate.d/ 目录下,比如yum、bootlog都有独立的规则文件。我们也给刚才的my_ssh.log写一套轮替策略。
需求:每天轮替一次,保留7天日志,空日志不轮替,自动压缩旧文件。
步骤1:新建轮替配置文件
vim /etc/logrotate.d/my_ssh
写入以下配置:
/var/log/my_ssh.log {
missingok # 日志文件不存在也不报错
daily # 每天轮替一次
rotate 7# 保留7份旧日志
compress # 压缩旧日志
notifempty # 空文件不执行轮替
copytruncate # 先复制再清空原文件,不影响服务持续写日志
}
步骤2:手动测试轮替效果
logrotate-f /etc/logrotate.d/my_ssh
执行后查看/var/log目录,会生成压缩后的旧日志文件。
4.3 轮替是怎么自动执行的?
logrotate本身不会定时运行,它依赖系统的crontab每日定时任务触发。
在 /etc/cron.daily/ 目录下有一个logrotate可执行文件,系统每天会自动执行一次,触发所有日志轮替规则。
五、内存日志journalctl:开机失败也能查
除了写入磁盘的日志,Linux还有一部分日志存在内存中,由systemd的journald服务管理,特点非常鲜明:
- 系统启动过程中、rsyslog还未启动时的日志也能记录
常用命令
# 查看所有内存日志
journalctl
# 查看最新的3条日志
journalctl -n3
# 查看指定时间段的日志
journalctl --since"15:00"--until"15:30"
journalctl --since"2022-09-09"--until"2022-09-10"
# 只查看错误级别的日志
journalctl -p err
# 详细格式输出,展示更多字段
journalctl -o verbose
💡 实用场景:系统开不了机,进入单用户模式后,先用journalctl查启动报错,快速定位是哪个服务崩溃。
六、排障常用技巧&查看命令
最后整理几个日常学习和排障最高频的日志使用姿势,亲测好用。
1. 实时监控日志
# 实时刷新secure日志,监控登录情况
tail-f /var/log/secure
2. 过滤关键字查日志
# 查找所有登录失败的记录
grep"Failed password" /var/log/secure
# 查看指定日期的定时任务执行情况
grep"Sep 9" /var/log/cron
3. 常见问题查哪个日志?
| |
|---|
| /var/log/secure |
| /var/log/cron |
| /var/log/boot.log |
| /var/log/dmesg |
| /var/log/messages |
总结
一开始学日志管理总觉得又杂又乱,又是类型又是级别,还有一堆配置文件。真正动手配置一遍、用日志排一次错,就会发现逻辑非常清晰:
- rsyslog 负责「收日志、分日志」,按类型和级别分发到不同文件
- logrotate 负责「管日志生命周期」,定时切割删除,防止占满磁盘
- journalctl
Linux章节也进入到了尾声,感谢各位的支持,我们下期见~