Linux之日志与日志服务

文章详细介绍了Linux系统中rsyslog服务的配置,包括配置文件的结构、日志级别的定义以及自定义规则。此外,还讨论了日志轮转的重要性,介绍了logrotate工具的使用,包括其配置文件、切割策略和相关参数。文章提供了一个NGINX日志配置实例,并给出了logrotate命令的操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


日志服务 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/messagesinfo级别以上消息记录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/spoolerUUCP和新闻的crit级别以上将crit级别及以上的新闻错误保存在特殊文件中。
local7.*/var/log/boot.logboot相关的

概念

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@@@@
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

只何

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值