文章目录
日志服务 rsyslog
rsyslog 是专门给Linux系统和其他程序转发日志的服务。默认已经安装,并且自动启用。
rsyslog是一个开源软件工具,用于在UNIX和类似UNIX的计算机系统上转发日志消息。它实现了基本的syslog协议,并通过基于内容的过滤、丰富的过滤能力、排队操作来处理离线输出。它全称为Rocket-fast system for log processing(用于日志处理的火箭快速系统)。
rsyslogd 为其守护进程:
[root@localhost conf]# ps -aux|grep rsyslogd
root 1002 0.0 0.4 216560 4472 ? Ssl 11:12 0:01 /usr/sbin/rsyslogd -n
root 5569 0.0 0.0 112828 988 pts/1 R+ 17:36 0:00 grep --color=auto rsyslogd
配置文件
/etc/rsyslog.conf
rsyslog.conf组成
-
modules,模块,配置加载的模块,如:ModLoad imudp.so配置加载UDP传输模块
-
global directives,全局配置,配置ryslog守护进程的全局属性,比如主信息队列大小(MainMessageQueueSize)
-
rules,规则(选择器+动作),每个规则行由两部分组成,selector部分和action部分,这两部分由一个或多个空格或tab分隔,selector部分指定源和日志等级,action部分指定对应的操作
-
templates,模板
-
outputs,输出
# rsyslog.conf默认规则
#### RULES ####
# 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
# The authpriv file has restricted access.
authpriv.* /var/log/secure
# Log all the mail messages in one place.
mail.* -/var/log/maillog
# Log cron stuff
cron.* /var/log/cron
# Everybody gets emergency messages
*.emerg :omusrmsg:*
# Save news errors of level crit and higher in a special file.
uucp,news.crit /var/log/spooler
# Save boot messages also to boot.log
local7.* /var/log/boot.log
规则选择器 | 规则行动 | 相关内容 | 说明 |
---|---|---|---|
kern.* | /dev/console | 内核消息 | 记录所有内核消息到console。记录其他许多内容会使屏幕杂乱。 |
*.info;mail.none;authpriv.none;cron.none | /var/log/messages | info级别以上消息 | 记录info级别或更高级别的所有内容。除mail、authpriv、cron外 |
authpriv.* | /var/log/secure | 认证和授权消息(授权认证信息) | authpriv文件访问有限制。如ssh远程登录需要用户名和密码 |
mail.* | -/var/log/maillog | 邮件消息 | 记录所有邮件消息的地方。 |
cron.* | /var/log/cron | 计划任务消息 | 记录计划任务的相关内容。 |
*.emerg | :omusrmsg:* | 紧急消息 | 每个人都会收到紧急消息。 |
uucp,news.crit | /var/log/spooler | UUCP和新闻的crit级别以上 | 将crit级别及以上的新闻错误保存在特殊文件中。 |
local7.* | /var/log/boot.log | boot相关的 |
概念
facility --设施,用来定义日志消息的来源,方便对日志进行分类
priority --日志级别,定义不同消息的级别
配置语法
符号 | 说明 |
---|---|
. | 等于后面信息等级或者更高的信息等级都会记录下来 |
.= | 只有后面这个消息等级会被记录下来 |
.! | 除了后面的消息等级,其他的都会被记录下来(注意前面需要先有其他过滤规则,否则什么不记录) |
*.info 代表任何的设施类型的info及以上级别日志都记录
authpriv.* 代表authpriv设施类型的日志所有的级别都记录
日志级别
级别值越小则优先级越高
- none:不记录日志
7——debug:调试信息,系统进行调试时产生的日志,不属于错误日志,不需要过多关注。
6——info:一般的通知信息,用来反馈系统的当前状态给当前用户。
5——notice:提醒信息,需要检查一下程序了,不理会可能会出现错误。
4——warning:警告信息,当出现警告时,你的程序可能已经出现了问题,但不影响程序正常运行,尽快进行处理以免导致服务宕掉
3——error:错误信息,出现这一项时,已经挑明服务出现了问题,服务都无法确认是否能正常运行。
2——critical:比较严重的错误信息,服务已经宕了,可能已经无法修复。
1——alert:警报信息,需要立即采取行动,不仅是服务宕了,还会影响系统的正常启动。
0——emerg:紧急信息,系统可能已经不能使用了,如果不能解决,就重新装机吧。
自定义规则
[root@web1 ~]# vim /etc/rsyslog.conf 定义一个规则 rule
local1.info /var/log/sc.log # 记录info以上级别的日志到sc.log文件中
[root@web1 ~]# service rsyslog restart
Redirecting to /bin/systemctl restart rsyslog.service
# 修改ssh服务对应的日志类别
[root@web1 ssh]# vim sshd_config
SyslogFacility local1
[root@web1 ssh]# service sshd restart
Redirecting to /bin/systemctl restart sshd.service
# tail -f /var/log/sc.log 查看效果
[root@web1 log]# tail -f sc.log
May 30 21:21:32 web1 sshd[13361]: Received signal 15; terminating.
May 30 21:21:32 web1 sshd[13402]: Server listening on 0.0.0.0 port 22.
May 30 21:21:32 web1 sshd[13402]: Server listening on :: port 22.
值得关注的日志文件
/var/log/messages --记录除了mail、authpriv、cron以外服务的info级别及以上级别的日志
/var/log/secure --记录权限相关的所有级别日志
日志轮转及其工具logrotate
日志轮转的作用:防止一个日志文件过大,需要对一个文件进行切割
切割策略:
- 根据日期,如每隔7天产生一个新的日志文件
- 根据文件大小,如文件达到100M时产生一个新文件
日志文件过大的坏处:
- 不方便网络传输,异地备份
- 读取不方便,需要消耗大量的磁盘io和内存
logrotate
系统自带,不是一个服务,没有守护进程,通过计划任务定期执行
详解:Linux日志切割工具Logrotate配置详解_logrotate配置文件详解_小师弟0104的博客-CSDN博客
logrotate默认被加入到cron的/etc/cron.daily中作为每日任务执行,配置定义在:
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最近进行了哪些日志归档:
[root@zh-ali logrotate.d]# cat /var/lib/logrotate/logrotate.status
logrotate state -- version 2
"/var/log/yum.log" 2023-4-11-21:0:0
"/var/log/firewalld" 2023-4-11-21:0:0
"/usr/local/zh99/logs/access.log" 2023-6-3-16:14:28
"/var/log/boot.log" 2023-5-4-3:36:1
"/var/log/chrony/*.log" 2023-4-11-21:0:0
"/var/log/wtmp" 2023-4-11-21:0:0
"/var/log/spooler" 2023-5-28-3:39:1
"/var/log/btmp" 2023-6-1-3:27:1
"/var/log/maillog" 2023-5-28-3:39:1
"/usr/local/zh99/logs/#.log" 2023-6-3-16:0:0
"/usr/local/zh99/logs/error.log" 2023-6-3-16:14:28
"/var/log/wpa_supplicant.log" 2023-4-11-21:0:0
"/var/log/secure" 2023-5-28-3:39:1
"/var/log/cron.log" 2023-6-3-14:0:0
"/var/log/messages" 2023-5-28-3:39:1
"/var/log/cron" 2023-6-3-14:52:30
配置文件
/etc/logrotate.conf
:主配置文件
/etc/logrotate.d/
:用于配置相关子系统,隔离每个应用配置(Nginx、PHP、Tomcat…)
[root@zh-ali cron]# cat /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 # 是否压缩,默认gzip压缩
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d # 导入/etc/logrotate.d/ 目录中的各个应用配置
# no packages own wtmp and btmp -- we'll rotate them here
/var/log/wtmp { # 针对特定日志设置参数,这个 wtmp 可记录用户登录系统及系统重启的时间
monthly
create 0664 root utmp # 指定新建的日志文件权限以及所属用户和组
minsize 1M # 文件大小超过1M后才会切割,因此不一定每个月都会执行
rotate 1 # 只保留一个备份
}
/var/log/btmp {
missingok
monthly
create 0600 root utmp
rotate 1
}
# system-specific logs may be also be configured here.
[root@zh-ali cron]# ls /etc/logrotate.d
bootlog chrony firewalld syslog wpa_supplicant yum
[root@zh-ali cron]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
missingok
sharedscripts
postrotate
/bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
endscript
}
Logrotate中其他可配置参数及其说明,具体如下:
compress //通过gzip 压缩转储以后的日志
nocompress //不做gzip压缩处理
copytruncate //用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
nocopytruncate //备份日志文件不过不截断
create mode owner group //轮转时指定创建新文件的属性,如create 0777 nobody nobody
nocreate //不建立新的日志文件
delaycompress //和compress 一起使用时,转储的日志文件到下一次转储时才压缩
nodelaycompress //覆盖 delaycompress 选项,转储同时压缩。
missingok //如果日志丢失,不报错继续滚动下一个日志
errors address //专储时的错误信息发送到指定的Email 地址
ifempty //即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
notifempty //当日志文件为空时,不进行轮转
mail address //把转储的日志文件发送到指定的E-mail 地址
nomail //转储时不发送日志文件
olddir directory //转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
noolddir //转储后的日志文件和当前日志文件放在同一个目录下
sharedscripts //重点,运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
prerotate //重点,在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行,搭配endscript结束脚本
postrotate //重点,在logrotate转储之后需要执行的指令,例如重新启动 (kill -HUP) 某个服务!必须独立成行,搭配endscript结束脚本
daily //指定转储周期为每天
weekly //指定转储周期为每周
monthly //指定转储周期为每月
rotate count //指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
dateext //使用当期日期作为命名格式
dateformat .%s //配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持 %Y %m %d %s 这四个参数
size(或minsize) log-size //当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
当日志文件 >= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
size = 5 或 size 5 (>= 5 个字节就转储)
size = 100k 或 size 100k
size = 100M 或 size 100M
NGINX日志的配置实例参考
[root@zh-ali logrotate.d]# vim /etc/logrotate.d/nginx
/usr/local/zh99/logs/*.log
{
weekly
missingok
rotate 31
dateext
compress
notifempty
minsize 100M
sharedscripts
postrotate
if [ -f /usr/local/zh99/logs/nginx.pid ];then
kill -USR1 `cat /usr/local/zh99/logs/nginx.pid`
fi
# /bin/kill -USR1 `cat /usr/local/nginx/logs/nginx.pid 2>/dev/null` 2>/dev/null || true
endscript
}
[root@zh-ali logrotate.d]# logrotate -f /etc/logrotate.d/nginx
[root@zh-ali logs]# cd /usr/local/zh99/logs
[root@zh-ali logs]# ls
access.log access.log-20230603.gz error.log error.log-20230603.gz nginx.pid
对于 Nginx 程序,kill -USR1
命令可以用来重新打开日志文件。例如,当日志文件被移动或删除后,可以使用此命令来创建新的日志文件,而不必重启 Nginx 服务。
操作命令
Logrotate可以由自动或者手动触发日志轮转:
-f 强制轮转 -d 检测日志配置
logrotate -f /etc/logrotate.d/nginx
不过正式执行前最好通过Debug选项来验证一下(-d参数)
具体logrotate命令格式如下:
logrotate [OPTION...] <configfile>
-d, --debug :debug模式,测试配置文件是否有错误。
-f, --force :强制转储文件。
-m, --mail=command :压缩日志后,发送日志到指定邮箱。
-s, --state=statefile :使用指定的状态文件。
-v, --verbose :显示转储过程。
示例
给cron单独配置一个轮转规则
[root@zh-ali logrotate.d]# cp bootlog cronlog
[root@zh-ali logrotate.d]# ls
bootlog chrony cronlog firewalld syslog wpa_supplicant yum
[root@zh-ali logrotate.d]# vim cronlog
/var/log/cron
{
missingok
dateext # 添加
weekly # 修改
copytruncate
rotate 7
compress # 添加
minsize 10M # 添加
notifempty
}
[root@zh-ali logrotate.d]# logrotate -f /etc/logrotate.d/cronlog
[root@zh-ali logrotate.d]# ls /var/log # 出现压缩文件即可
anaconda cron harbor messages-20230521 spooler-20230507
audit cron-20230507 journal messages-20230528 spooler-20230514
boot.log cron-20230514 lastlog monitor.log spooler-20230521
boot.log-20230412 cron-20230521 maillog rhsm spooler-20230528
boot.log-20230504 cron-20230528 maillog-20230507 sa tallylog
btmp cron-20230603.gz maillog-20230514 secure tuned
btmp-20230601 dmesg maillog-20230521 secure-20230507 web_server_160.log
chrony dmesg.old maillog-20230528 secure-20230514 wtmp
cloudinit-deploy.log ecs_network_optimization.log messages secure-20230521 yum.log
cloud-init.log grubby messages-20230507 secure-20230528
cloud-init-output.log grubby_prune_debug messages-20230514 spooler
logger命令
用于给rsyslog发送日志,系统自带
logger发送命令行的消息给哪个文件是通过/etc/rsyslog.conf中*.开头的行决定的,
默认情况下是任何日志都发送给/var/log/messages,也可以指定发送给其他文件里。
选项
-i:带上logger进程ID
-p:用来将命令行的消息发送给指定日志设备以及日志级别来存
-t:指定进程名
-f:指定文件里的内容发送给/var/log/messages里
-s:将日志同时显示在命令行
例如:
[root@zh-ali logrotate.d]# logger -i -p local1.info -t mytest "this is a test@@@@"
# 默认写入到messges日志文件,可以在/etc/rsyslog.conf文件中指定对应的日志文件路径
[root@zh-ali logrotate.d]# tail -f /var/log/messages
Jun 3 15:03:17 zh-ali mytest[28937]: this is a test@@@@