系统日志rsyslog
常见的日志文件
-
/var/log/boot.log: 开机启动系统内核会检测和启动硬件,然后开启各种内核支持的功能,这都会记录在这个文件中,但只会存储本次开机的信息,之前的启动信息会被覆盖。
-
/var/log/cron: 计划任务执行过程的日志。
-
/var/log/dmesg: 开机时内核引导产生的各种日志信息。
-
/var/log/lastlog: 所有账户最近一次的登录信息。
-
/var/log/maillog: 记录邮件相关日志信息,主要是STMP协议和POP3协议所产生的信息。
-
/var/log/wtmp、/var/log/btmp: 这两个日志文件主要记录用户正常登录和登录失败时的相关信息,是二进制格式文件,可以使用last和lastb命令进行查看。
-
/var/log/messages: 几乎系统发生的所有错误(重要)信息都会记录在这个文件中。
-
/var/log/secure: 涉及到需要输入账号密码的软件,只要有账户登录,都会被记录在这个文件中,包括login,ssh,sudo等等程序,应该经常查看分析。
日志文件的一般格式
日期和时间 主机名 服务名称 具体内容
[root@centos82 ~]#tail /var/log/messages
Oct 30 19:19:10 centos82 systemd[1]: Starting dnf makecache...
Oct 30 19:19:11 centos82 dnf[22438]: Metadata cache refreshed recently.
Oct 30 19:19:11 centos82 systemd[1]: Started dnf makecache.
Oct 30 19:52:06 centos82 systemd[1]: proc-sys-fs-binfmt_misc.automount: Got automount request for /proc/sys/fs/binfmt_misc, triggered by 22513 (grep)
Oct 30 19:52:06 centos82 systemd[1]: Mounting Arbitrary Executable File Formats File System...
Oct 30 19:52:06 centos82 systemd[1]: Mounted Arbitrary Executable File Formats File System.
Oct 30 19:52:06 centos82 kernel: ICMPv6: process `grep' is using deprecated sysctl (syscall) net.ipv6.neigh.default.base_reachable_time - use net.ipv6.neigh.default.base_reachable_time_ms instead
Oct 30 20:20:10 centos82 systemd[1]: Starting dnf makecache...
Oct 30 20:20:11 centos82 dnf[22536]: Metadata cache refreshed recently.
Oct 30 20:20:11 centos82 systemd[1]: Started dnf makecache.
日志类别和等级
-
facility:服务,设施,根据功能分为不同的日志
auth, authpriv, cron, daemon, ftp, kern, lpr, mail, news, security(auth), user, uucp, syslog
-
priority:日志等级,从低到高排序
debug, info, notice, warn, err, crit, alert, emerg
配置文件
/etc/rsyslog.conf:
- modules:模块设置
- global directives: 全局配置
- rules: 日志记录规则
rules配置格式
服务名称[.=!]日志等级 日志存放路径或设备或主机
facility.priority;facility.priority... target
facility.* target
facility.=priority target
facility.!priority target
facility.none target
# .*表示所有等级日志都要记录下来
# .priority表示当前等级及之后等级的日志都记录下来
# .=priority表示只记录当前等级的日志
# .!priority表示除了该等级之外的其他等级
# .none表示不记录此服务日志
服务端配置网络日志
- centos8
[root@centos82 ~]#vim /etc/rsyslog.conf
#### MODULES ####
...省略...
# Provides UDP syslog reception
# for parameters see http://www.rsyslog.com/doc/imudp.html
module(load="imudp") # needs to be done just once
input(type="imudp" port="514")
# Provides TCP syslog reception
# for parameters see http://www.rsyslog.com/doc/imtcp.html
#module(load="imtcp") # needs to be done just once
#input(type="imtcp" port="514")
- centos 7
[root@centos7 ~]#vim /etc/rsyslog.conf
#### MODULES ####
...省略...
# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
# Provides TCP syslog reception
#$ModLoad imtcp
#$InputTCPServerRun 514
客户端启用网络日志
# 在客户端指定将日志发送到远程的UDP,TCP日志服务器
[root@centos7 ~]#vim /etc/rsyslog.conf
*.info;mail.none;authpriv.none;cron.none @10.0.0.81 #UDP
*.info;mail.none;authpriv.none;cron.none @@10.0.0.81 #TCP
日志管理工具journalctl
systemd-journald是使用内存的日志记录方式,所以只能用来管理和查询本次启动之后的日志信息。
虽然systemd-journald的数据信息是基于内存的,但系统在/run/log/目录下还是以文件的方式记录了一份下来。不过只要一重启,/run/log/下的数据还是会被刷新。
journalctl使用
# 查看所有日志(本次登录)
[root@centos82 ~]#journalctl
# 按时间查看日志
[root@centos82 ~]#journalctl --since "2020-10-29 00:00:00" --until "2020-10-31 00:00:00"
[root@centos82 ~]#journalctl --since yesterday --until today
[root@centos82 ~]#journalctl --since journalctl --since "12:00" --until now
# 查看某个服务的日志
[root@centos82 ~]#journalctl -u nginx.service
# 查看指定进程的日志
[root@centos82 ~]#journalctl _PID=666
# 查看指定用户的日志
[root@centos82 ~]#journalctl _UID=77
# 查看指定日志等级的日志
[root@centos82 ~]#journalctl -p warning
日志轮循(logrotate)
logrotate可以将旧的日志修改名称存储下来,并重新建立同名的空日志文件继续存储日志。
logrotate利用cron定时任务来完成日志的轮循工作。
logrotate配置
[root@centos8 log]#rpm -ql logrotate
/etc/cron.daily
/etc/cron.daily/logrotate
/etc/logrotate.conf
/etc/logrotate.d
/etc/logrotate.d/btmp
/etc/logrotate.d/wtmp
/etc/rwtab.d/logrotate
/usr/lib/.build-id
/usr/lib/.build-id/c5
/usr/lib/.build-id/c5/48d4f89fab16e46d486dd02cccee4ec98f218f
/usr/sbin/logrotate
/usr/share/doc/logrotate
/usr/share/doc/logrotate/ChangeLog.md
/usr/share/licenses/logrotate
/usr/share/licenses/logrotate/COPYING
/usr/share/man/man5/logrotate.conf.5.gz
/usr/share/man/man8/logrotate.8.gz
/var/lib/logrotate
/var/lib/logrotate/logrotate.status
[root@centos8 log]#vim /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly <<== 每周执行一次
# keep 4 weeks worth of backlogs
rotate 4 <<== 保留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
# system-specific logs may be also be configured here.
/etc/logrotate.conf:主配置文件
/etc/logrotate.d:这个目录被主配置文件调用,里面可以放置自己配置文件,用来覆盖Logrotate的默认值
使用说明
[root@centos8 log]#cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok <<== 如果没有文件就忽略跳过
sharedscripts
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service >/dev/null 2>&1 || true
endscript
}
- 文件名:需要被处理的日志文件,多个文件以空格或者换行隔开。
- 参数:{}中间写需要进行轮循的具体操作参数,如果没写沿用主配置文件的值,主配置也没写使用默认值。
- 脚本:调用shell命令来进行额外的操作。上面/usr/bin/systemctl kill -s HUP rsyslog.service的意思是执行完毕后,发送HUP信号重启rsylogd服务
- prerotate:启动logrotate之前的命令。
- postrotate:执行完logrotate之后的命令。
- endscript:和上面两项成对出现,表面脚本的结尾。
- sharedscripts:指对所有日志文件执行脚本,如果不写,脚本只会执行一次。
自定义日志logrotate
/var/log/test.log {
daily <<== 每天执行一次
rotate 5 <<== 保留5天
compress <<== 压缩日志
delaycompress <<== 延迟压缩,当生成第二个轮循日志的时候将第一个轮循日志压缩
missingok <<== 如果没有文件就忽略跳过
size 100M <<== 文件如果大于100M就进行轮循
notifempty <<== 如果日志是空的就跳过
create 640 root root <<== 创建新日志,并修改权限和uu'v [shu'zhi]
postrotate
echo `date +%F_%T` >> /data/test.log
endscript
}