前言
Linux系统中,日志文件是非常重要的资源,可以记录系统运行状态、错误信息、用户行为等各种数据。通过对日志文件的分析,我们可以更好地了解系统的运行状况,及时发现问题并作出相应的处理。(少背锅)
inode
了解日志之前 我们需要知道文件的属性和本质,便于理解之后的日志各个字段的含义。 如cp 分配一个空闲的inode号,在inode表中生成新条目 ,在目录中创建一个目录项,将名称与inode编号关联 ,拷贝数据生成新的文件。
在Linux系统中,文件由元数据和数据块组成。数据块就是多个连续性的扇区(sector),扇区是文件存储的最小单位(512字节)。块(block)的大小,最常见的是4KB,也就是连续8个sector组成,存储文件数据和目录数据。而元数据用来记录文件的创建者、创建日期、大小等,这种存储文件元数据信息的区域叫做inode,即索引节点。
inode实际是连接【目录项】和磁盘的中间物质。 indoe 表中的信息 文件的大小,时间,类型,权限等,称为文件的元数据(meta data 元信息 )
- inode number 节点号
- 文件类型
- 权限
- UID
- GID
- 链接数(指向这个文件名路径名称个数)
- 该文件的大小和不同的时间戳
- 指向磁盘上文件的数据块指针
- 有关文件的其他数据
inode 节点号 可以使用!!#ffff00 ls -i 文件名!! 查看
[root@localhost opt]# ls -i 123
67148169 123
!!#ffff00 stat!! 取得指定文件的文件属性
[root@localhost opt]# stat 123
文件:"123"
大小:29 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:68608917 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2019-04-22 23:08:29.053641221 +0800#打开文件即改变
最近更改:2019-04-22 23:08:29.053641221 +0800#更改内容即改变
最近改动:2019-04-22 23:08:29.056641221 +0800#元信息改变即改变。
创建时间:- #不记录
!!#ffff00 df -i !! 查询inode使用情况
[root@localhost opt]# df -i
文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点
/dev/mapper/centos-root 20078592 121136 19957456 1% /
devtmpfs 229401 414 228987 1% /dev
tmpfs 233381 1 233380 1% /dev/shm
tmpfs 233381 586 232795 1% /run
tmpfs 233381 16 233365 1% /sys/fs/cgroup
/dev/mapper/centos-home 9801728 31 9801697 1% /home
/dev/sda1 524288 328 523960 1% /boot
tmpfs 233381 9 233372 1% /run/user/42
tmpfs 233381 1 233380 1% /run/user/0
!!#ffff00 注:!!inode号 有限资源,如果消耗完毕 无法继续新建文件 。 inode号 在同一设备中是唯一的 不同设备是不是唯一的。
日志
概念
日志文件指的是系统或应用程序记录事件或操作的文件,可以用于排查故障、监控和审计等过程。在Linux系统下,日志文件通常存储在“/var/log”目录下,不同的系统或应用程序可能会产生不同类型的日志文件。
内核及系统日志由系统服务 rsyslog 统一管理,根据其主配置文件 /etc/rsyslog.conf
常见分类
系统日志(syslog) 系统日志文件是Linux系统最基本的日志文件,它记录了所有系统事件的发生情况。系统日志文件分为多个文件,每个文件都记录了特定类型的系统事件 如: /var/log/messages:记录了系统启动、停机、错误信息等。 /var/log/boot.log:记录了系统启动过程中的日志信息。 /var/log/dmesg:记录了内核启动过程中的系统事件。 /var/log/cron: 记录了计划任务日志 /var/log/maillog: 记录了邮件日志
应用程序日志 各种应用程序产生的日志文件,比如Apache服务器的访问日志、MySQL数据库的错误日志等。这些日志文件通常存储在应用程序所在的目录下,或者在“/var/log”目录下的特定子目录中。有些应用程序会选择由自己独立管理一份日志文件(而不是交给rsyslog服务管理),用于记录本程序运行过程中的各种事件信息。
用户日志 在 wtmp、btmp、lastlog 等日志文件中,保存了系统用户登录、退出等相关的事件消息。 但是这些文件都是二进制的数据文件,不能直接使用 tail、less 等文本查看工具进行浏览, 需要使用 who、w、users、last 和 lastb 等用户查询命令来获取日志信息 如: /var/log/lastlog : 记录了 系统中所有用户最后一次的登录时间的曰志 /var/log/secure : 记录了验证和授权方面的信息,只要涉及账户和密码的程序都会记录 /var/log/wtmp :永久记录所有用户的登陆、注销信息,同时记录系统的启动、重启、关机事件 /var/tun/ulmp: 记录了当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。
内核日志文件 内核日志文件用于记录内核发生的事件,比如内核崩溃、硬件故障等。由于内核是系统最核心的部分,因此内核日志文件对于排查系统故障非常重要。 配置文件 位置在 /etc/rsyslog.conf
日志文件管理
在 Linux 内核中,根据日志消息的重要程度不同,将其分为不同 的优先级别(数字等级越小,优先级越高,消息越重要)。 0 EMERG(紧急):会导致主机系统不可用的情况。 1 ALERT(警告):必须马上采取措施解决的问题。 2 CRIT(严重):比较严重的情况。 3 ERR(错误):运行出现错误。 4 WARNING(提醒):可能影响系统功能,需要提醒用户的重要事件。 5 NOTICE(注意):不会影响正常功能,但是需要注意的事件。 6 INFO(信息):一般信息。 7 DEBUG(调试):程序或系统调试信息等 注:一般情况下4就需要开始注意了!!
1.备份日志文件 由于日志文件的数据量通常非常大,因此需要定期备份日志文件,以便在需要的时候进行回溯或分析。 2.删除旧的日志文件 由于日志文件是按照时间顺序创建的,因此旧的日志文件很容易占用大量的磁盘空间,导致系统的性能下降。因此需要定期删除旧的日志文件,以便释放存储空间。 3.压缩归档日志文件 压缩归档日志文件同样也是为了节省磁盘空间,可以使用工具如tar、gzip等进行压缩,然后将压缩后的文件进行归档。
常用的日志查看工具
系统日志查看
1.使用tail -f /var/log/messages ,该命令会实时输出系统日志文件的内容,并且会不断更新。 使用ssh 连接另一台机器 会查看到实时系统更新日志
Apr 23 02:09:22 localhost systemd-logind: New session 73 of user root.
Apr 23 02:09:22 localhost systemd: Started Session 73 of user root.
Apr 23 02:09:22 localhost systemd: Starting Session 73 of user root.
Apr 23 02:09:22 localhost dbus[751]: [system] Activating service name='org.freedesktop.prob![image](/static/uploads/2024/4/22/6f62ff51586b416da398f95b891f2506.png)
lems' (using servicehelper)
Apr 23 02:09:22 localhost dbus-daemon: dbus[751]: [system] Activating service name='org.freedesktop.problems' (using servicehelper)
Apr 23 02:09:22 localhost dbus[751]: [system] Successfully activated service 'org.freedesktop.problems'
Apr 23 02:09:22 localhost dbus-daemon: dbus[751]: [system] Successfully activated service 'org.freedesktop.problems'
内核日志文件查看
1.使用命令!!#ffff00 “dmesg”!!可以查看内核日志文件的内容。该命令会输出内核日志文件中的所有内容。 非常多 可 持续记录硬件变化的情况
[ 12.275594] device virbr0-nic entered promiscuous mode
[ 13.120811] virbr0: port 1(virbr0-nic) entered blocking state
[ 13.120815] virbr0: port 1(virbr0-nic) entered listening state
[ 13.120971] IPv6: ADDRCONF(NETDEV_UP): virbr0: link is not ready
[ 13.364510] virbr0: port 1(virbr0-nic) entered disabled state
[29083.179295] ISO 9660 Extensions: Microsoft Joliet Level 3
[29083.190177] ISO 9660 Extensions: RRIP_1991A
2.CentOS 7 以后版,利用Systemd 统一管理所有 Unit 的启动日志,可以只用!!#ffff00 journalctl!!一个命令,查看所有日志(内核日志和应用日志)。
日志配置文件:/etc/systemd/journald.conf !!#ffff00 journalctl -k 只显示内核日志 !! !!#ffff00 journalctl -p!! 根据日志等级筛选结果 , 若设为一个单独的数字或日志等级名称, 则表示仅显示小于或等于此等级的日志
journalctl --no-pager -p 4 #筛选出日志信息等级4及以上的信息 正常标准输出 可以看全
journalctl -o json-pretty 以json 多行格式输出 便于观看
查看上一次启动的日志(需更改设置) journalctl -b -1 这里就需要配置文件了~/etc/systemd/journald.conf Storage=persistent auto:rsyslog将确定使用持久性存储(persistent)还是易失性存储(volatile),如果存在/var/log/journal目录,则rsyslog使用持久性存储,否则使用易失性存储。
若要检查上一次引导的日志,使用-b参数筛选日记。-b选项仅显示上次引导后的消息。它以负数作为参数,显示以前引导的日志。
!!#ffff00 journalctl -b -1 -p err!!
查看指定时间的日志
!!#ffff00 journalctl --since="2021-09-16 14:22:02"
journalctl --since "30 min ago" journalctl --since yesterday
journalctl --since "2021-01-01" --until "2021-09-16 13:40"
journalctl --since 07:30 --until "2 hour ago" !!
显示尾部的最新10行日志!!#ffff00 journalctl -n !!
显示尾部指定行数的日志 !!#ffff00 journalctl -n 15 !!
实时滚动显示最新日志!!#ffff00 journalctl -f!! 与tail -f类似
查看指定服务的日志 !!#ffff00 journalctl /usr/lib/systemd/systemd !!
比如查看docker服务的日志!!#ffff00 systemctl status docker !!
查看指定进程的日志!!#ffff00 journalctl _PID=665 !!
查看某个路径的脚本的日志!!#ffff00 journalctl /usr/bin/bash!!
查看指定用户的日志!!#ffff00 journalctl UID=33 --since today!!
查看某个 Unit 的日志!!#ffff00 journalctl -u nginx.service!!
!!#ffff00 journalctl -u nginx.service --since today!!
实时滚动显示某个 Unit 的最新日志 !!#ffff00 journalctl -u nginx.service -f !!
合并显示多个 Unit 的日志 !!#ffff00 $ journalctl -u nginx.service -u php-fpm.service --since today !!
日志默认分页输出,--no-pager 改为正常的标准输出!!#ffff00 journalctl --no-pager!!
以 JSON 格式(单行)输出!!#ffff00 journalctl -b -u nginx.service -o json!!
以 JSON 格式(多行)输出,可读性更好!!#ffff00 journalctl -b -u nginx.serviceqq -o json-pretty !!
显示日志占据的硬盘空间!!#ffff00 journalctl --disk-usage!!
用户日志查看
!!#ffff00 users!! 查询当前用户登录情况
[root@localhost opt]# users
root
!!#ffff00 who!!命令用于报告当前登录到系统中的每个用户的信息
[root@localhost opt]# who
root pts/0 2021-04-22 16:25 (192.168.x.x)
!!#ffff00 w!! 用于显示当前系统中的每个用户及其所运行的进程信息
[root@localhost opt]# w
02:59:20 up 10:34, 1 user, load average: 0.01, 0.03, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 192.168.x. x 16:25 0.00s 0.33s 0.00s w
!!#ffff00 last !!查询用户登录的历史记录 /var/log/wtmp (二进制文件需要借助工具查看)
[root@localhost log]# last
root pts/2 192.168.64.1 Tue Apr 23 02:46 - 02:46 (00:00)
root pts/1 192.168.64.15 Tue Apr 23 02:09 - 02:56 (00:46)
root pts/1 192.168.64.15 Tue Apr 23 02:04 - 02:08 (00:04)
root pts/1 192.168.64.1 Tue Apr 23 00:01 - 00:01 (00:00)
!!#ffff00 lastb!! 命令用于查询登录失败的用户记录 /var/log/btmp 可以直接从安全日志文件/var/log/secure 中获得相关信息 。
[root@localhost ~]# lastb
root ssh:notty 192.168.x.x Tue Apr 23 02:09 - 02:09 (00:00)
!!#ffff00 lastlog!! 最后一次登录日志
[root@localhost ~]# lastlog
用户名 端口 来自 最后登陆时间
root pts/0 192.168.64.1 一 4月 22 19:12:37 +0800 2024
应用日志查看
内嵌rsyslog 可以进行整理本机的日志信息 使用该程序 需要应用兼容
查看rsyslog 软件配置
[root@localhost ~]# rpm -qc rsyslog
/etc/logrotate.d/syslog
/etc/rsyslog.conf #配置文件
/etc/sysconfig/rsyslog
/etc/rsyslog.conf 配置文件格式:由三部分组成
- MODULES:相关模块配置
- GLOBAL DIRECTIVES:全局配置
- RULES:日志记录相关的规则配置 怎么生成日志 日志存放位置 RULES配置格式:
facility.priority;
#分类 日志的级别
*: 所有级别 local0-7 自定义使用 local7 已经被使用。
none:没有级别,即不记录
PRIORITY:指定级别(含)以上的所有级别
=PRIORITY:仅记录指定级别的日志信息
文件路径:通常在/var/log/,文件路径前的 -表示异步写入
用户:将日志事件通知给指定的用户,* 表示登录的所有用户
日志服务器:@host,把日志送往至指定的远程UDP日志服务器 @@host 将日志发送到远程TCP日志服务器
范例:将ssh服务的日志单独设置 默认ssh 日志是在/var/log/secure 。
[root@localhost ~]#vim /etc/ssh/sshd_config
#修改ssh配置文件,32下一行添加自己的自定义
32 #SyslogFacility AUTHPRIV #先注释默认项
33 SyslogFacility LOCAL6 #添加local6 自定义级别
[root@localhost ~]#vim /etc/rsyslog.conf
# 行添加自己的文件位置
local6.* /opt/ssh.log
[root@localhost log]#systemctl restart rsyslog.service sshd #重启服务
[root@localhost opt]# tail -f /opt/ssh.log #查看日志更新
Apr 22 19:45:14 localhost sshd[11132]: Server listening on 0.0.0.0 port 22.
Apr 22 19:45:14 localhost sshd[11132]: Server listening on :: port 22.
Apr 22 19:46:00 localhost sshd[11151]: Accepted password for root from 192.168.64.11 port 50480 ssh2
Apr 22 19:46:55 localhost sshd[11151]: Received disconnect from 192.168.64.11 port 50480:11: disconnected by user
Apr 22 19:46:55 localhost sshd[11151]: Disconnected from 192.168.64.11 port 50480
网络日志设置
可以实现不同设备之间的日志备份 以及故障排查 开启日志远程功能 192.168.64.15的日志 输出到192.168.64.16 机器上 1.首先关闭两台机器的防火墙
#可以使用发送键到所有会话 两台机器一起关闭
[root@localhost ~]#systemctl stop firewalld
[root@localhost ~]#setenforce 0
[root@xyy ~]#systemctl stop firewalld
[root@xyy ~]#setenforce 0
2.编辑配置文件首先配置15客户端的
注:二者的协议需要对应一致 客户端和服务端。
[root@localhost etc]# vim /etc/rsyslog.conf
#### MODULES #### 功能模块
# The imjournal module bellow is now used as a message source instead of imuxsock.
$ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
$ModLoad imjournal # provides access to the systemd journal
#$ModLoad imklog # reads kernel messages (the same are read from journald)
#$ModLoad immark # provides --MARK-- message capability
# Provides UDP syslog reception #允许使用udp协议
#$ModLoad imudp
#$UDPServerRun 514
# Provides TCP syslog reception #允许使用tcp
$ModLoad imtcp
$InputTCPServerRun 514
3.修改对应配置规则
# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.* /dev/console
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none /var/log/messages
*.info;mail.none;authpriv.none;cron.none @@192.168.64.16 #@@代表使用tcp @ 代表udp
4.systemctl restart rsyslog.service 重启服务 使用!!#ffff00 ss -ntap |grep 514!! 查看514端口是否打开
[root@localhost etc]# ss -ntap |grep 514
LISTEN 0 25 *:514 *:* users:(("rsyslogd",pid=12247,fd=3))
LISTEN 0 25 :::514 :::* users:(("rsyslogd",pid=12247,fd=4))
5 .对应16的配置文件也需要更改 vim /etc/rsyslog.conf
# Provides TCP syslog reception #这个不建议打开 容易出问题
$ModLoad imtcp
$InputTCPServerRun 514
6.验证效果
在16机器上使用 tail -f /var/log/messages
去15上使用 logger "this is test log from 192.168.64.16" 测试写日志进去。
#16
[root@xyy ~]# tail -f /var/log/messages
#15
[root@localhost etc]# logger "hello word 192.168.64.16"
接收方服务器成功记录测试日志。