目录
Linux学习——日志系统
10.1 日志管理系统
rsyslogd进程采集与记录绝大部分与系统相关的日志,包括安全、认证、计划任务等方面。
[root@localhost ~]# ps aux |grep rsyslogd
root 677 0.2 0.2 216388 5408 ? Ssl 19:11 0:00 /usr/sbin/rsyslogd
–n
root 2408 0.0 0.0 112664 968 pts/0 R+ 19:14 0:00 grep --color=auto
rsyslogd
Apache、Nginx、MySQL等服务以自己的方式记录与分析日志。本章主要介绍与系统相关的日志。日志文件可以存放在本地,也可以存放在远程服务器。
10.1.2 常见的日志文件
- /var/log目录下都是日志文件,文件名称以日期结尾表示该日志已经被切割过
[root@localhost ~]# ls /var/log
anaconda gdm qemu-ga vmware-vgauthsvc.log.0
audit glusterfs rhsm vmware-vmsvc.log
boot.log grubby_prune_debug sa vmware-vmusr.log
boot.log-20180611 lastlog samba wpa_supplicant.log
btmp libvirt secure wtmp
chrony maillog secure-20180611 Xorg.0.log
cron maillog-20180611 speech-dispatcher Xorg.0.log.old
cron-20180611 messages spooler Xorg.9.log
cups messages-20180611 spooler-20180611 yum.log
dmesg ntpstats sssd
dmesg.old pluto tallylog
firewalld ppp tuned
- /var/log/messages文件为系统的主日志文件,几乎系统发生的所有事件都会记录到此文件中
[root@qfedu-log ~]# tail /var/log/messages
- /var/log/secure文件为认证、安全相关的日志文件,涉及账号与密码输入的事件都会记录在此文件中
[root@localhost ~]# tail /var/log/secure
- 创建一个普通用户user01,并切换到该用户模式下
[root@localhost ~]# useradd ssoo
[root@localhost ~]# su ssoo
[ssoo@localhost root]$
- 在/var/log/secure文件中可以查看到新增加的两条日志信息
[root@localhost ~]# tailf /var/log/secure
Nov 27 23:33:45 localhost useradd[94614]: failed adding user 'mysql', exit code: 9
Nov 27 23:34:35 localhost polkitd[788]: Registered Authentication Agent for unix-process:119926:12864964 (system bus name :1.1239 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8)
Nov 27 23:34:44 localhost polkitd[788]: Unregistered Authentication Agent for unix-process:119926:12864964 (system bus name :1.1239, object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale zh_CN.UTF-8) (disconnected from bus)
Nov 29 13:53:53 localhost gdm-password]: gkr-pam: unlocked login keyring
Nov 29 14:02:19 localhost gdm-password]: gkr-pam: unlocked login keyring
Nov 29 22:11:31 localhost gdm-password]: gkr-pam: unlocked login keyring
Nov 29 22:11:47 localhost useradd[95849]: new group: name=ssoo, GID=1022
Nov 29 22:11:47 localhost useradd[95849]: new user: name=ssoo, UID=1022, GID=1022, home=/home/ssoo, shell=/bin/bash
Nov 29 22:11:53 localhost su: pam_unix(su:session): session opened for user ssoo by root(uid=0)
Nov 29 22:12:05 localhost su: pam_unix(su:session): session opened for user root by root(uid=1022)
- 使用ssh命令远程登录到这台主机,在/var/log/secure文件中可以看到登录用户的信息
[root@localhost ~]# ssh 主机号
[root@localhost ~]# tailf /var/log/secure
- /var/log/cron文件记录调度任务的实际情况
[root@localhost ~]# tail /var/log/cron
- /var/log/dmesg文件记录系统开机时内核检测过程产生的信息
[root@localhost ~]# less /var/log/dmesg
- /var/log/yum.log文件记录yum安装、升级软件的时间以及名称等信息
[root@localhost ~]# tail /var/log/yum.log
- 有一些文件是不能直接查看的,如/var/log/wtmp文件,它属于二进制文件,内容显示为乱码
[root@localhost ~]# cat /var/log/wtmp
~~~reboot3.10.0-1160.el7.x86_64�j�dP�5~~~runlevel3.10.0-1160.el7.x86_64�j�d[��#:0none:0kk�d=�#:0:0,l�dC
x):0root:0El�d-~~~reboot3.10.0-1160.el7.x86_64�}�d25~~~runlevel3.10.0-1160.el7.x86_64
� ~�dt�:0root:0,~�di'
pts/0/0root:0�d
:0none:0+�d��.0-1160.el7.x86_64��d5~~~runlevel3.10.0-1160.el7.x86_64�d��
�
pts/0/0none:0��d�X
pts/0/0none/�dh5
pts/0/0none:02�d"t�
pts/1ts/1root192.168.15.1��d�����
pts/1yMe��5
��pts/1/1none2ReM(tOe���pts/2ts/2root192.168.15.1�Qek�
“ w ”——命令可以查看/var/log/wtmp文件,了解当前登录到主机的用户
[root@localhost ~]# w pts/6/6root:0�Fge�
22:19:37 up 1 day, 13:09, 9 users, load average: 1.61, 1.50, 1.44
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root :0 :0 四22 ?xdm? 2:04m 1.18s /usr/libexec/gn
root pts/0 :0 四22 5days 0.77s 0.05s vim abc.txt
root pts/1 :0 五21 4days 0.58s 0.50s bash
none :1 :1 五23 ?xdm? 2:04m 0.72s /usr/libexec/gn
none pts/2 :1 五23 4days 0.09s 0.02s bash
none pts/3 :1 五23 4days 0.03s 0.03s bash
root pts/4 :0 13:48 7:08m 0.26s 0.03s vi /etc/sysconf
root pts/5 :0 15:10 7:08m 0.12s 0.12s bash
root pts/6 :0 22:11 1.00s 0.12s 0.02s w
” last “——/var/log/btmp文件记录最近登录的用户,使用last命令查看
[root@localhost ~]# last
root pts/6 :0 Wed Nov 29 22:11 still logged in
root pts/5 :0 Wed Nov 29 15:10 still logged in
root pts/4 :0 Wed Nov 29 13:48 still logged in
root pts/4 :0 Wed Nov 29 13:47 - 13:48 (00:00)
root pts/5 :0 Tue Nov 28 00:01 - 00:03 (00:02)
root pts/4 :0 Mon Nov 27 23:56 - 00:03 (00:06)
root pts/5 :0 Mon Nov 27 23:46 - 23:56 (00:10)
root pts/4 :0 Mon Nov 27 22:48 - 23:56 (01:07)
10.1.3 rsylogd子系统
- rsyslogd是默认安装的系统工具,查看其配置文件
[root@localhost ~]# rpm -qc rsyslog
/etc/logrotate.d/syslog //和日志轮转(切割)相关
/etc/rsyslog.conf //rsyslogd的主配置文件
/etc/sysconfig/rsyslog //rsyslogd相关文件
- 查看rsyslogd的主配置文件,共有91行,文件中有一些模块,可以开启或者关闭某些功能
[root@localhost ~]# vim /etc/rsyslog.conf
14 # Provides UDP syslog reception
15 #$ModLoad imudp
16 #$UDPServerRun 514
18 # Provides TCP syslog reception
19 #$ModLoad imtcp
20 #$InputTCPServerRun 514
rsyslogd可以把日志放到本地,也可以作为日志服务器接收远程发送来的日志信息。例如,允许514端口接收使用UDP协议转发过来的日志,需要打开这个模块,将14~15行“#”删除即可;允许514端口接收使用TCP协议转发过来的日志,将18~20行“#”删除即可。
- 从第46行开始为日志文件的规则,规定不同设备对不同级别的信息的处理方式,其中“*”是通配符,代表任何设备或任何级别信息,none表示不对任何级别的信息进行记录,
46 #### RULES ####
48 # Log all kernel messages to the console.
49 # Logging much else clutters up the screen.
50# kern.* /dev/console
52 # Log anything (except mail) of level info or higher.
53 # Don't log private authentication messages!
- 第54行表示把所有info级别及高于该级别的信息记录到/var/log/messages文件中,不包括mail、authpriv与cron设备的信息
54*.info;mail.none;authpriv.none;cron.none /var/log/messages
- 第57行表示将authpriv设备中的任何级别的信息记录到/var/log/secure文件中,这主要是一些与认证、权限使用相关的信息
56 # The authpriv file has restricted access.
57authpriv.* /var/log/secure
- 第59行表示将mail设备中的任何级别的信息记录到/var/log/maillog文件中,这主要是与电子邮件相关的信息,
59 # Log all the mail messages in one place.
60mail.* /var/log/maillog
- 第64行表示将cron设备中的任何级别的信息记录到/var/log/cron文件中,这主要是与系统中定期执行的任务相关的信息
63 # Log cron stuff
64cron.* /var/log/cron
- 第67行表示将任何设备的emerg级别的信息发送给所有正在系统上的用户
66 # Everybody gets emergency messages
67*.emerg :omusrmsg:*
- 第70行表示将uucp与news设备的crit级别的信息记录到/var/log/spooler文件中,
69 # Save news errors of level crit and higher in a special file.
70uucp,news.crit /var/log/spooler
- 第73行表示将与系统启动相关的信息记录到/var/log/boot.log文件中
72 # Save boot messages also to boot.log
73 local7.* /var/log/boot.log
” man “——查看日志文件规则中的设备和级别
[root@qfedu-log ~]# man 3 syslog
- 查找函数syslog()中的facility参数
acility
LOG_AUTH 安全认证
LOG_AUTHPRIV 安全认证(private)
LOG_CRON cron和at
LOG_DAEMON 后台进程
LOG_FTP ftp守护进程
LOG_KERN 内核消息
LOG_LOCAL0 through LOG_LOCAL7 用户自定义设备
LOG_LPR 行式打印系统
LOG_MAIL 邮件系统
LOG_NEWS USENET news系统
LOG_SYSLOG syslogd自身产生的日志
LOG_USER (default) 通用用户级消息
LOG_UUCP UUCP系统
- 查找函数syslog()中的level参数
level
LOG_EMERG 紧急,致命,服务无法继续运行,如配置文件丢失
LOG_ALERT 报警,需要立即处理,如磁盘空使用95%
LOG_CRIT 致命行为
LOG_ERR 错误行为
LOG_WARNING 警告信息
LOG_NOTICE 普通
LOG_INFO 标准信息
LOG_DEBUG 调试信息,排错所需,一般不建议使用
“ logger ”——可以往系统中写入日志
[root@qfedu-log ~]# logger -p authpriv.info qfedu
[root@qfedu-log ~]# tail /var/log/secure
Jun 13 16:47:46 qfedu-log root: qfedu
10.2 logrotate 日志轮转
logrotate是十分有用的工具,它可以自动对日志进行轮转(切割)、压缩以及删除旧的日志文件,主流Linux发行版都默认安装logrotate包。
- 查看每日计划任务下的logrotate文件
[root@localhost ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
EXITVALUE=$?
if [ $EXITVALUE != 0 ]; then
/usr/bin/logger -t logrotate "ALERT exited abnormally with [$EXITVALUE]"
fi
exit 0
- 打开配置文件logrotate.conf,查看细节可以使用man工具
[root@localhost ~]# cat /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly //轮转周期为一周
weekly
# keep 4 weeks worth of backlogs //保留4个日志文件
rotate 4
# create new (empty) log files after rotating old ones //日志文件被重命名,新建文件继续存储
create
# use date as a suffix of the rotated file //使用日期作为轮转日志文件的后缀名
dateext
# uncomment this if you want your log files compressed //对日志文件进行压缩
#compress
# RPM packages drop log rotation information into this directory //包含该目录下的文件
include /etc/logrotate.d
# no packages own wtmp and btmp -- we'll rotate them here
////对/var/log/wtmp设置日志轮转的方
/var/log/wtmp {
monthly //每月轮转一次
create 0664 root utmp //轮转后创建新文件,并设置权限和属组
minsize 1M //最小达到1M才轮转
rotate 1 //保留一份
}
对/var/log/btmp设置日志轮转的方法
/var/log/btmp {
missingok //丢失不提示
monthly //每月轮转一次
create 0600 root utmp //轮转后创建新文件,并设置权限和属组
rotate 1 //保留一份
}
# system-specific logs may be also be configured here.
- 轮转文件/var/log/yum.log。打开日志轮转规则文件/etc/logrotate.d/yum,其中文件/var/log/yum.log为被轮转文件
[root@localhost ~]# vim /etc/logrotate.d/yum
/var/log/yum.log {
missingok
notifempty //空文件不进行轮转,将其注释掉
size 30k //大小达到30k即进行轮转
yearly //每年进行一次轮转
create 0600 root root
}
- 为了方便演示,修改为每天轮转一次,保留3份,并设置权限为777,其余代码行全部注释掉
/var/log/yum.log {
missingok
# notifempty
# size 30k
# yearly
daliy
rotate 3
# create 0600 root root
create 0777 root root
}
- 查看当前已存在轮转日志文件
[root@localhost ~]# ll /var/log/yum*
-rw-------. 1 root root 4227 11月 27 23:34 /var/log/yum.log
- 查看上一次轮转的时间信息
[root@localhost ~]# grep 'yum' /var/lib/logrotate/logrotate.status
"/var/log/yum.log" 2023-9-10-17:0:0
- 手动进行轮转测试
[root@localhost ~]# logrotate -s /var/lib/logrotate/logrotate.status
/etc/logrotate.conf
[root@localhost ~]# ll /var/log/yum*
-rw-------. 1 root root 4227 11月 27 23:34 /var/log/yum.log
-rw-------. 1 root root 4227 11月 29 23:10 /var/log/yum.log -20231129
- 通过修改系统时间也可以进行轮转测试
[root@localhost ~]# date
2023年 11月 29日 星期三 22:51:57 CST
- 重新设置系统日期
[root@localhost ~]# date 06261843
2023年 06月 26日 星期一 18:43:00 CST
[root@localhost ~]# date
2023年 06月 26日 星期一 18:43:05 CST
- 手动轮转,并查看新的日志文件
[root@localhost ~]# logrotate -s /var/lib/logrotate/logrotate.status
/etc/logrotate.conf
[root@localhost ~]# ll /var/log/yum*
-rwxrwxrwx. 1 root root 0 Jun 26 16:43 /var/log/yum.log
-rw-------. 1 root root 4227 11月 27 23:10 /var/log/yum.log -20231129
-rw-------. 1 root root 4227 6月 26 23:29 /var/log/yum.log -20230626
- 轮转文件/etc/logrotate.d/messages。建议先将/etc/logrotate.d/syslog中的/var/log/messages删除,以免与后续操作发生冲突。给文件/var/log/messages添加a属性
[root@qfedu-log ~]# chattr +a /var/log/messages
[root@qfedu-log ~]# lsattr /var/log/messages
-----a---------- /var/log/messages
- 此时对/var/log/messages文件做轮转会发生错误,需要对其规则文件/etc/logrotate.d/messages做配置
/var/log/messages {
prerotate
chattr -a /var/log/messages
endscript
#notifempty
daily
create 0600 root root
missingok
rotate 5
postrotate
chattr +a /var/log/messages
endscript
}
10.3 本章小结
本章主要讲解了日志系统的相关知识,包括日志处理进程和日志的轮转。在实际环境中,用户需要对日志进行采集,当数据量较大时,需要进行轮转,最终还需对日志进行分析。