作为一个运维,如果不会看日志,就好比是冬天刚刚用热水泡完了脚,接着就立马让人把水喝掉。
目录
一、Inode介绍
1.1 什么是inode
- inode号通常用于Linux系统的存储文件和目录元数据信息的数据结构
- 每个文件和目录在文件系统中都有对应的inode,inode中存储了文件的各种元信息,如文件类型、所有者、权限、大小、创建时间、修改时间等信息,以及指向文件数据块的指针
- 删除文件时,若该文件有多个指向它的inode,则不会释放空间,需要删除所有指向它的inode才会释放存储空间。
1.2 inode表内容
每一个inode表记录对应的保存了以下信息:
inode number 节点号
文件类型
权限
UID
GID
链接数(指向这个文件名路径名称个数)
该文件的大小和不同的时间戳
指向磁盘上文件的数据块指针
有关文件的其他数据
1.3 查看inode号的方式
ls -i 文件名
stat 文件名
df -i #用于查看文件系统的inode号
注意!!!
- inode号在同一设备中是唯一的,但是在不同分区或不同硬盘中可以有相同inode号。
- 达到inode数量上限时,文件系统将无法创建新的文件或目录,无论是否还有空间。
二、日志分析
2.1 日志的用途
- 记录系统或程序在系统中的运行事件
- 通过查看日志可以帮助排查系统故障
2.2 日志的分类
- 系统日志:操作系统运行中发生的事件和故障
- 应用日志:某一程序运行中发生的事件和故障
2.3 日志级别
事件的关键程度:
级别 | 消息 | 级别 | 说明 |
---|---|---|---|
0 | EMERG | 紧急 | 会导致主机系统不可用 |
1 | ALERT | 警告 | 必须马上采取措施解决问题 |
2 | CRIT | 严重 | 比较严重的情况 |
3 | ERROR | 错误 | 运行出现错误 |
4 | WARNING | 提醒 | 可能影响系统功能,需要提醒用户的重要事件 |
5 | NOTICE | 注意 | 不会影响正常功能,但是需要注意的事件 |
6 | INFO | 信息 | 一般信息 |
7 | DEBUG | 调试 | 程序或系统调试信息等 |
2.4 关于用户登陆的日志
日志 | 作用 | 命令 |
---|---|---|
btmp | 查看登录失败的用户 | lastb |
lastlog | 查看用户最后一次登录情况 | lastlog |
wtmp | 用户成功登录的日志 | last |
last 命令用于查询成功登录到系统的用户记录
lastb 命令用于查询登录失败的用户记录
lastlog用于查看用户最后一次登录情况
三、日志管理
3.1 日志的配置文件
Linux操作系统本身和大部分服务器程序的日志文件都默认放在目录/var/log/下
内核及系统日志由系统服务rsyslog统一管理,根据其主配置文件/etc/rsyslog.conf
3.2 一些常见用户日志
/var/log/lastlog | 记录系统中所有用户最后一次的登录时间的曰志。这个文件也是二进制文件.不能直接用Vi 查看。而要使用lastlog命令查看 |
/var/log/secure | 记录验证和授权方面的倍息,只要涉及账户和密码的程序都会记录,比如系统的登录、ssh的登录、su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中 |
/var/log/wtmp | 永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件。同样,这个文件也是二进制文件.不能直接用Vi查看,而要使用last命令查看 |
/var/log/btmp | 记录当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看 |
3.3 rsyslog配置文件
/etc/rsyslog.conf 配置文件格式:由三部分组成
MODULES:相关模块配置
GLOBAL DIRECTIVES:全局配置
RULES:日志记录相关的规则配置
RULES配置格式:
通式:
服务程序.记录的日志级别 日志文件的位置(绝对路径)
facility.priority;
#分类 日志的级别
*: 所有级别
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息文件路径:通常在/var/log/,文件路径前的 ‘ - ’ 表示异步写入
异步:记录一段日志后统一存入磁盘
同步:内存中磁盘上有一条就记录一条
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器@@host 将日志发送到远程TCP日志服务器
管道: | COMMAND,转发给其它命令处理
3.4 如何为程序设置专属的独立日志
举例:
ssh服务的日志默认放在/var/log/secure下,不利于我们观察,现在将其日志独立出来
操作目的:利用rsyslog软件给ssh生成独立的日志文件
1. 修改ssh的配置文件
2. 修改rsyslog的配置文件系统提供了local0 ~ local6 供用户自定义使用
3. 重新启动rsyslog和ssh服务后,使用ssh服务,查看日志文件
配置成功!
3.5 远程日志
操作用途:用于管理10-20台服务器
操作目的:将日志传输到远程服务器
注意:本实验之前请关闭两台主机的防火墙
1. 配置两台主机的/etc/rsyslog.conf文件,打开tcp端口协议第一台:
第二台:
2. 查看514端口是否打开第一台:
第二台:
3. 配置/etc/rsyslog.conf文件,配置接收日志的主机IP
4. 测试第一台:
第二台:
成功
3.6日志管理工具——journalctl
CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志。
带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。
1. 配置文件
/etc/systemd/journald.conf
2. 命令格式
journalctl [OPTIONS...] [MATCHES...]
查看日志的重要命令:
#显示最近的提示信息
journalctl -xe
systemctl status 软件名#日志默认分页输出,--no-pager 改为正常的标准输出
journalctl --no-pager
#查看所有日志(默认情况下 ,只保存本次启动的日志)
journalctl
#查看内核日志(不显示应用日志)
journalctl -k
#查看系统本次启动的日志 实战案例!!!
journalctl -b
journalctl -b -0
#查看上一次启动的日志(需更改设置)
journalctl -b -1
#查看指定时间的日志 -S=since -U=unit
journalctl --since="2023-10-30 18:10:30"
journalctl --since "20 min ago"
journalctl --since yesterday
journalctl -S "2024-03-31 2:00" -U "2024-04-22 03:00"
journalctl --since 09:00 --until "1 hour ago"
#实时滚动显示最新日志
journalctl -f
3.7 logrotate——日志转储、分割
3.7.1 相关文件
- 计划任务:/etc/cron.daily/logrotate
- 配置文件:/etc/logrotate.conf
- 日志文件:/var/lib/logrotate/logrotate.status
配置文件/etc/logrotate.conf主要参数:
vim /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
#一周生成一个新的日志文件
# keep 4 weeks worth of backlogs
rotate 4
#只保留最近的4个文件
# use date as a suffix of the rotated file
dateext
# 添加一个日期后缀
程序还可以设置独立的配置文件在/etc/logrotate.d/下
3.7.2 配置参数及用例
配置参数 | 说明 |
---|---|
compress | 通过gzip压缩转储以后的日志 |
nocompress | 不压缩 |
copytruncate | 用于还在打开中的日志文件,把当前日志备份并截断 |
nocopytruncate | 备份日志文件但是不截断 |
create mode ownergroup | 转储文件,使用指定的权限,所有者,所属组创建新的日志文件 |
nocreate | 不建立新的日志文件 |
delaycompress | 和 compress 一起使用时,转储的日志文件到下一次转储时才压缩 |
nodelaycompress | 覆盖 delaycompress 选项,转储同时压缩 |
errors address | 专储时的错误信息发送到指定的Email地址 |
ifempty | 即使是空文件也转储,此为默认选项 |
notifempty | 如果是空文件的话,不转储 |
mail address | 把转储的日志文件发送到指定的E-mail 地址 |
nomail | 转储时不发送日志文件 |
olddir directory | 转储后的日志文件放入指定目录,必须和当前日志文件在同一个文件系统 |
noolddir | 转储后的日志文件和当前日志文件放在同一个目录下 |
prerotate/endscript | 在转储以前需要执行的命令,这两个关键字必须单独成行 |
postrotate/endscript | 在转储以后需要执行的命令,这两个关键字必须单独成行 |
daily | 指定转储周期为每天 |
weekly | 指定转储周期为每周 |
monthly | 指定转储周期为每月 |
rotate count | 指定日志文件删除之前转储的次数,0指没有备份,5指保留5个备份 |
tabooext [+] list | 让logrotate*不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和~ |
size size | 当日志文件到达指定的大小时才转储bytes(缺省)及KB或MB |
sharedscripts | 默认,对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/ var / log / news /.example)。 如果指定此项sharedscripts,则无论有多少个日志*与通配符模式匹配,脚本都只会运行一次 |
nosharedscripts | 针对每一个转储的日志文件,都执行一次prerotate和 postrotate脚本,此为默认值 |
missingok | 如果日志不存在,不提示错误,继续处理下一个 |
nomissingok | 如果日志不存在,提示错误,此为默认值 |