1、日志服务简介


在Centos 6.x/Redhat 6.x中日志服务已经由rsyslog取代了原先的syslog服务,rsyslog相比syslog具有一些新的特点:

  • 基于TCP网络协议传输日志信息;
  • 安全网络传输方式;
  • 有日志消息的及时分析框架;
  • 后台数据库;
  • 配置文件中可以写简单的逻辑判断;
  • 与syslog配置文件相兼容;

2、linux系统中的常见日志


系统中的日志默认存储路径为:/var/log/

[root@Redhat8 log]# pwd
/var/log
[root@Redhat8 log]# ls
anaconda                  dnf.librepo.log-20210829  libvirt            secure-20210822
audit                     dnf.librepo.log-20210905  maillog            secure-20210829
boot.log-20210821         dnf.log                   maillog-20210822   secure-20210905
boot.log-20210825         dnf.log.1                 maillog-20210829   speech-dispatcher
boot.log-20210902         dnf.rpm.log               maillog-20210905   spooler
btmp                      firewalld                 mariadb            spooler-20210822
btmp-20210901             gdm                       messages           spooler-20210829
chrony                    glusterfs                 messages-20210822  spooler-20210905
cron                      hawkey.log                messages-20210829  sssd
cron-20210822             hawkey.log-20210822       messages-20210905  swtpm
cron-20210829             hawkey.log-20210829       private            tuned
cron-20210905             hawkey.log-20210905       qemu-ga            vmware-vgauthsvc.log.0
cups                      httpd                     rhsm               wtmp
dnf.librepo.log           insights-client           samba
dnf.librepo.log-20210822  lastlog                   secure

日志文件说明:

  • /var/log/cron :记录系统定时任务相关日志;
  • /var/logcups/ :记录打印信息的日志;
  • /var/log/dmesg :记录系统在开机时内核自检的信息,可以使用dmesg命令直接查看内核自检信息;
[root@Redhat8 log]# dmesg
  • /var/log/btmp :记录错误登录日志,此文件为二进制文件(保护日志内容,防止陌生用户查看并可修改日志内容),需要使用lastb命令查看;
[root@Redhat8 log]# lastb
  • /var/log/lastlog :记录系统中所有用户最后一次的登录时间的日志,此文件为二进制文件,需要使用lastlog命令查看;
[root@Redhat8 log]# lastlog 
  • /var/log/maillog :记录邮件信息;
  • /var/log/message :记录系统重要信息的日志,这个日志文件中会记录Linux系统的绝大多数重要信息,如果系统出现问题,首先检查此日志文件;
  • /var/log/secure :记录验证和授权方面的信息,只要涉及账户和密码的程序都会被记录;
  • /var/log/wtmp :永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件,此文件为二进制文件,需要使用last命令查看;
[root@Redhat8 log]# last
  • /var/log/utmp :记录当前已经登录的用户信息,此文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息,此文件为二进制文件,需要使用w、who、users等命令查看;
[root@Redhat8 log]# w
 00:09:31 up 9 days,  5:59,  2 users,  load average: 0.00, 0.00, 0.00
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty2     tty2             01Sep21  9days  9:11   0.00s /usr/libexec/gsd-disk-utility-notify
root     pts/0    10.81.10.55      23:58    0.00s  0.03s  0.00s w
[root@Redhat8 log]# 
[root@Redhat8 log]# who
root     tty2         2021-09-01 18:12 (tty2)
root     pts/0        2021-09-10 23:58 (10.81.10.55)
[root@Redhat8 log]# users
root root

除了系统默认的日志之外,采用rpm方式安装的系统服务也会默认将日志记录在/var/log/目录下,不过这些日志不是由rsyslog服务来记录和管理的,而是各个服务使用自己的日志管理文件来记录自身日志;

/var/log/httpd/
/var/log/mail/
/var/log/samba/
/var/log/ssd/

3、日志服务Rsyslog


(1)服务对应rpm包

[root@Redhat8 log]# rpm -qa rsyslog
rsyslog-8.1911.0-3.el8.x86_64

(2)服务配置文件

[root@Redhat8 log]# rpm -qc rsyslog
/etc/logrotate.d/syslog
/etc/rsyslog.conf
/etc/sysconfig/rsyslog

(3)配置文件格式

#服务名称[连接符号]日志等级                               日志记录位置
authpriv.*                                              /var/log/secure

服务名称

  • auth (LOG_AUTH) :安全和认证相关消息,不推荐使用authpriv替代;
  • authpriv (LOG_AUTHPRIV) :安全和认证相关消息,私有;
  • cron (LOG_CRON) :系统定时任务cront与at产生的相关日志;
  • daemon (LOG_DAEMON) :各个守护进程产生的日志;
  • ftp (LOG_FTP) :ftp守护进程产生的日志;
  • kern (LOG_KERN) :内核产生的日志;
  • local0-local7 (LOG_LOCAL0-7) :为本地使用预留的服务;
  • lpr (LOG_LPR) :打印产生的日志;
  • mail (LOG_MAIL) :邮件收发日志;
  • news (LOG_NEWS) :与新闻服务器相关的日志;
  • syslog (LOG_SYSLOG) :有syslog服务产生的日志;
  • user (LOG_USER) :用户等级类别的日志;
  • uucp (LOG_UUCP) :uucp子系统的日志信息;

连接符号

  • " . " :只要比后面的等级高的(包含该等级)日志都记录下来;
  • " .= " :只记录所需等级的日志,其他等级不记录;
  • " .! " :除了该等级的日志外其他等级全部记录;

日志等级

  • debug (LOG_DEBUG) :一般的调试信息说明;
  • info (LOG_INFO) :基本的通知信息;
  • notice (LOG_NOTICE) :普通信息,有一定重要性;
  • warning (LOG_WARNING) :警告信息,不会影响到服务的运行;
  • err (LOG_ERR) :错误信息,可以影响服务或系统的运行;
  • crit (LOG_CRIT) :临界状况信息,比err等级严重;
  • alert (LOG_ALERT) :警告状态信息,比crit等级严重,需要立即采取行动;
  • emerg (LOG_EMERG) :疼痛等级信息,系统无法使用;
    • :所有等级信息;
  • none :忽略此日志服务;

日志记录位置

即当前日志输出到那个文件中进行保存,或者输出到某个远程日志服务器上(UDP 514),日志的记录位置是固定的;

  • 日志文件的绝对路径:最常见的保护方法;
  • 系统设备文件:代表打印机输出方式;
  • 转发到远程主机:使用TCP/UDP端口发送到远程主机上,若使用"@192.168.10.10:514",就会把日志内容使用UDP协议发送到192.168.10.10的UDP 514端口,若使用"@@192.168.10.10:514",就会把日志内容使用TCP协议发送到192.168.10.10的TCP 514端口;
  • 用户名:此处可以定义接受该日志用户名," * " 代表所有用户;
  • " ~ " 代表忽略此日志,不定义接收;

(4)配置文件内容

[root@Redhat8 log]# cat /etc/rsyslog.conf 
# rsyslog configuration file

# For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
# or latest version online at http://www.rsyslog.com/doc/rsyslog_conf.html 
# If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html

#### MODULES ####
#加载模块

module(load="imuxsock" 	  # provides support for local system logging (e.g. via logger command)
#加载imuxsock模块,为本地系统登录提供支持
              SysSock.Use="off") # Turn off message reception via local log socket; 
			  # local messages are retrieved through imjournal now.
module(load="imjournal" 	    # provides access to the systemd journal
       StateFile="imjournal.state") # File to store the position in the journal
#module(load="imklog") # reads kernel messages (the same are read from journald)
#加载imklog模块,为内核登录提供支持
#module(load"immark") # provides --MARK-- message capability
#加载immark模块,提供标记信息的能力

# 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")
#加载UDP模块,允许使用UDP的514端口接收采用UDP协议转发的日志

# 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")
#加载TCP模块,允许使用TCP的514端口接收采用TCP协议转发的日志

#### GLOBAL DIRECTIVES ####
#定义全局设置

# Where to place auxiliary files
global(workDirectory="/var/lib/rsyslog")
#工作目录位置

# Use default timestamp format
module(load="builtin:omfile" Template="RSYSLOG_TraditionalFileFormat")
#定义日志的时间使用默认的时间戳格式

# Include all config files in /etc/rsyslog.d/
include(file="/etc/rsyslog.d/*.conf" mode="optional")
#包含/etc/rsyslog.d/目录中的所有以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
#所有日志存放在messages文件内,除了邮件、认证、定时任务

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
#认证日志记录在secure文件内

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
#邮件日志记录在maillog文件内

# Log cron stuff
cron.*                                                  /var/log/cron
#定时任务记录在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


# ### sample forwarding rule ###
#action(type="omfwd"  
# An on-disk queue is created for this action. If the remote host is
# down, messages are spooled to disk and sent when it is up again.
#queue.filename="fwdRule1"       # unique name prefix for spool files
#queue.maxdiskspace="1g"         # 1gb space limit (use as much as possible)
#queue.saveonshutdown="on"       # save messages to disk on shutdown
#queue.type="LinkedList"         # run asynchronously
#action.resumeRetryCount="-1"    # infinite retries if host is down
# Remote Logging (we use TCP for reliable delivery)
# remote_host is: name/ip, e.g. 192.168.0.1, port optional e.g. 10514
#Target="remote_host" Port="XXX" Protocol="tcp")

4、日志轮替


日志轮替的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超过保存的范围之后,就会进行删除,那么旧日志文件改名之后,命令规范即参考下面配置文件内容;

若配置文件中有 dateext 参数,则日志文件名称不会重叠,此参数不需要日志文件改名,只需要保存指定的日志个数,删除多余的日志文件即可;

[root@Redhat8 log]# ll | grep -w secure
-rw-------. 1 root   root        1790 Sep 14 21:50 secure
-rw-------. 1 root   root       12375 Aug 21 22:59 secure-20210822
-rw-------. 1 root   root       82846 Aug 28 02:19 secure-20210829
-rw-------. 1 root   root        7135 Sep  3 21:00 secure-20210905
-rw-------. 1 root   root        6715 Sep 11 01:50 secure-20210912

若没有 dateext ,那么日志文件就需要进行改名了,第一次进行日志轮替时,当前的 secure 日志会自动改名为 secure.1 ,然后新建 secure 日志用来保存新的日志,当第二次进行轮替时, secure.1 会自动改名为 secure.2 ,当前的 secure 日志会自动改名为 secure.1 然后也会新建 secure 日志,用来保存新日志,以此类推;

(1)配置文件内容详解

[root@Redhat8 log]# cat  /etc/logrotate.conf 
# see "man logrotate" for details
# rotate log files weekly
weekly
# 每周对日志文件进行一次轮替
# keep 4 weeks worth of backlogs
rotate 4
#最多保存四次轮替文件,产生第5个文件则删除第一个备份日志文件
# 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
#包含子目录/etc/logrotate.d中的所有配置文件

# system-specific logs may be also be configured here.

[root@Redhat8 logrotate.d]# ll /etc/logrotate.d/
total 80
-rw-r--r--. 1 root root   91 Dec 11  2019 bootlog
-rw-r--r--. 1 root root  130 Feb 19  2018 btmp
-rw-r--r--. 1 root root  160 May 10  2019 chrony
-rw-r--r--. 1 root root   71 Feb 15  2020 cups
-rw-r--r--. 1 root root  212 Nov 25  2019 dnf
-rw-r--r--. 1 root root  194 Dec  2  2019 httpd
-rw-r--r--. 1 root root  172 Nov  5  2019 iscsiuiolog
-rw-r--r--. 1 root root  165 Mar 16  2020 libvirtd
-rw-r--r--. 1 root root  142 Mar 16  2020 libvirtd.qemu
-rw-r--r--. 1 root root  492 Aug 16  2019 mariadb
-rw-r-----. 1 root named 514 Feb 27  2020 named
-rw-r--r--. 1 root root  106 Jun  2  2015 numad
-rw-r--r--. 1 root root  408 Aug 13  2018 psacct
-rw-r--r--. 1 root root  155 Feb 13  2020 samba
-rw-r--r--. 1 root root  237 Mar 17  2020 sssd
-rw-r--r--. 1 root root   71 Apr  3  2020 subscription-manager
-rw-r--r--. 1 root root  226 Dec 11  2019 syslog
-rw-r--r--. 1 root root   32 Feb 19  2018 up2date
-rw-r--r--. 1 root root  100 Nov  4  2019 wpa_supplicant
-rw-r--r--. 1 root root  145 Feb 19  2018 wtmp

(2)logrotate配置文件的主要参数

  • daily :日志的轮替周期是每天;
  • weekly :日志的轮替周期是每周;
  • monthly :日志的轮替周期是每月;
  • rotate number :保留日志文件的个数,0代表无备份;
  • compress :日志轮替时旧日志文件是否进行压缩;
  • create mode owner group :创建新日志文件时是否指定日志的权限、所属者、所属组;
  • mail address :当日志轮替时,输出内容通过邮件外发到指定地址;
  • missingok :如果日志不存在,则忽略该日志的告警信息;
  • notifempty :如果日志文件为空,则不进行日志轮替;
  • minsize number :日志轮替最小值,达到该值才会进行轮替;
  • size number :设置轮替为指定大小,超过此大小则进行轮替,取消时间轮替;
  • dateext :以日期作为日志轮替的文件后缀;
  • sharedscripts :在此关键字之后的脚本只执行一次;
  • prerotate/endscript :在日志轮替之前执行脚本命令,endscript表示脚本结束;
  • posttrotate/endscript :在日志轮替之后执行脚本命令,endscript表示脚本结束;

(3)案例解析

[root@Redhat8 logrotate.d]# cat ./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
        #重启rsyslog服务,并将结果返回为空   
    endscript
    #脚本执行结束
}

prerotate与posttrotate主要用于在日志轮替的同时,执行指定的脚本文件,一般用于日志轮替之后重启服务,需要强调的是,如果日志是写入rsyslog服务的配置文件的,那么把新日志加入logrotate后,一定要重启rsyslog服务,否则你会发现虽然新日志建立了,但是数据还是写入了旧的日志当中,那是因为logrotate文件知道日志轮替了,但是rsyslog服务却不知道,因此就需要重启服务来使得rsyslog服务知道日志轮替了来满足将数据写入新日志文件内;

这里可以使用chattr给文件加入a属性,如果系统文件加入了a属性,那么这个文件就只能增加数据,不能删除和修改已有的数据(root用户也不能修改或删除),此方法可以保护日志文件不被恶意修改;

#chattr
[root@Redhat8 shell]# touch test
[root@Redhat8 shell]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 14 23:51 test
[root@Redhat8 shell]# chattr +a test 
[root@Redhat8 shell]# ll
total 0
-rw-r--r--. 1 root root 0 Sep 14 23:51 test
[root@Redhat8 shell]# echo aaa > test 
-bash: test: Operation not permitted
[root@Redhat8 shell]# rm -rf test 
rm: cannot remove 'test': Operation not permitted
[root@Redhat8 shell]# chattr -a test 
[root@Redhat8 shell]# echo aaa > test 
[root@Redhat8 shell]# cat test 
aaa
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐