• 【Linux系统管理】14 日志管理


    2 日志管理

    日志对运维 / 开发工程师、管理员来讲是非常重要的帮助手段和帮助的内容。当出现任何问题的时候,第一时间都要想到查看日志。一般的错误,操作在日志里都会得到显示,会帮助判断哪里出现的问题。

    日志缺点:是纯文本文件。日志文件也需要进行备份。

    2.1 日志简介

    2.1.1 日志相关服务

    在 CentOS 6.x 中日志服务已经由 rsyslogd 取代了原先的 syslogd 服务。Redhat认为 syslogd 已经不能满足在工作中的需求,rsyslogd 相比syslogd 具有一些新的特点:

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

    2.1.2 系统中常见的日志文件

    日志文件说明
    /var/log/cron(了解)记录了系统定时任务相关的日志。
    /var/log/cups/(了解)记录打印信息的日志
    /var/log/dmesg记录了系统在开机时内核自检的信息。也可以使用 dmesg 命令直接查看内核自检信息。
    /var/log/btmp记录错误登录的日志。这个文件是二进制文件,不能直接vi查看,而要使用 lastb 命令查看,命令如下:[root@localhost log]# file /var/log/btmp /var/log/btmp: empty [root@localhost log]# lastb root tty1 Tue Jun 4 22:38 - 22:38 (00 : 00) #有人在6月4日22:38使用root用户,在本地终端1登录错误 #vim打开二进制文件方法: ~ vim -b /var/log/btmp :%!xxd -g 1 #或者直接使用hexdump命令直接查看即可 ~ hexdump -C /var/log/btmp
    /var/log/lastlog记录系统中所有用户最后一次的登录时间的日志。这个文件也是二进制文件,不能直接 vi,而要使用lastlog 命令查看。[root@localhost log]# lastlog Username Port From Latest root pts/1 10.0.0.1 Mon Aug 22 17:00:16 +0800 2022
    /var/log/mailog记录邮件信息。
    /var/log/message(重要)记录系统重要信息的日志。这个日志文件中会记录Linux 系统的绝大多数重要信息,如果系统出现问题时,首先要检查的就应该是这个日志文件。tail -f /var/log/message
    /var/log/secure(重要)记录验证和授权方面的信息,只要涉及账户和密码的程序都会记录。比如说系统的登录,ssh 的登录,su切换用户,sudo授权,甚至添加用户和修改用户密码都会记录在这个日志文件中。tail -f /var/log/secure
    /var/log/wtmp永久记录所有用户的登录、注销信息,同时记录系统的启动、重启、关机事件。同样这个文件也是一个二进制文件,不能直接vi,而需要使用last命令来查看。
    /var/run/utmp记录当前已经登录的用户的信息。这个文件会随着用户的登录和注销而不断变化,只记录当前登录用户的信息。同样这个文件是一个二进制文件不能直接vi,而要使用w, who,users 等命令来查询。

    除了系统默认的日志之外,采用 RPM方式安装的系统服务也会默认把日志记录在 /var/log/ 目录中(源码包安装的服务日志是在源码包指定目录中)。不过这些日志不是由 rsyslogd 服务来记录和管理的,而是各个服务使用自己的日志管理文档来记录自身日志。

    日志文件说明
    /var/log/httpd/RPM包安装的apache服务的默认日志目录
    /var/log/mail/RPM包安装的邮件服务的额外日志目录
    /var/log/samba/RPM包安装的samba服务的日志目录
    /var/log/sssd/守护进程安全服务目录

    扩展知识:Windows 下的日志信息。计算机管理 -> 事件查看器 -> Windows日志

    img

    2.2 日志服务 rsyslogd

    2.2.1 日志文件格式

    只要是由日志服务rsyslogd记录的日志文件,他们的格式是一样的。基本日志格式包含以下四列:

    • 事件产生的时间
    • 发生事件的服务器的主机名
    • 产生事件的服务名或程序名
    • 事件的具体信息。

    2.2.2 rsyslogd 服务的配置文件

    1)、/etc/rsyslog.conf 配置文件格式

    ~ vim /etc/rsyslog.conf 
    *.info;mail.none;authpriv.none;cron.none                /var/log/messages
    authpriv.*                                              /var/log/secure
    #服务名称 [连接符号] 日志等级                             日志记录位置
    #认证相关服务.所有日志等级                                记录在/var/log/secure日志中
    
    • 1
    • 2
    • 3
    • 4
    • 5

    服务名称

    那么我们首先需要确定rsyslogd服务可以识别哪些服务的日志,也可以理解为以下这些服务委托了rsyslogd服务来代为管理日志。这些服务如表所示:

    服务名称说明
    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_LOCALO-7)为本地使用预留的服务
    lpr (LOG_LPR)打印产生的日志
    mail (LOG_MAIL)邮件收发信息
    news (LOG_NEWS)与新闻服务器相关的日志
    syslog (LOG_SYSLOG)有syslogd服务产生的日志信息(虽然服务名称已经改为rsyslogd,但是很多配置都还是沿用了syslogd 的,这里并没有修改服务名)。
    user (LOG_USER)用户等级类别的日志信息
    uucp (LOG_UUCP)uucp子系统的日志信息,uucp是早期 linux系统进行数据传递的协议,后来也常用在新闻组服务中。
    *代表所有的日志

    连接符号

    日志服务连接日志等级的格式是:

    日志服务 [连接符号] 日志等级 日志记录位置

    在这里连接符号可以识别为:

    • “.”代表只要比后面的等级高的(包含该等级)日志都记录下来。比如:“cron.info”代表cron服务产生的日志,只要日志等级大于等于info级别,就记录
    • “.=”代表只记录所需等级的日志,其他等级的都不记录。比如:“*.=emerg”代表任何日志服务产生的日志,只要等级是emerg 等级就记录。这种用法及少见,了解就好
    • “.!”代表不等于,也就是除了该等级的日志外,其他等级的日志都记录。

    日志等级

    等级名称说明
    debug (LOG_DEBUG)一般的调试信息说明(记录日志信息最低,记录的信息最多)
    info (LOG_INFO)基本的通知信息
    notice (LOG_NOTICE)普通信息,但是有一定的重要性
    warning (LOG_WARNING)警告信息,但是还不回影响到服务或系统的运行
    err (LOG_ERR)错误信息,一般达到err等级的信息以及可以影响到服务或系统的运行了。
    crit (LOG_CRIT)临界状况信息,比err 等级还要严重
    alert (LOG_ALERT)警告状态信息,比crit还要严重。必须立即采取行动
    emerg (LOG_EMERG)疼痛等级信息,系统已经无法使用了(记录日志信息最高,记录的威胁信息)
    *代表所有日志等级,比如:“authpriv.*”代表 authpriv 认证信息服务产生的日志,所有的日志等级都记录。

    日志等级这里还可以识别“none”,如果日志等级是none,就说明忽略这个日志服务,该服务的所有日志都不再记录。

    日志记录位置

    日志记录位置就是当前日志输出到哪个日志文件中保存,当然也可以把日志输出到打印机打印,或者输出到远程日志服务器上(当然日志服务器要允许接收才行)。日志的记录位置也是固定的,我们来学习下:

    • 日志文件的绝对路径。这是最常见的日志保存方法,如“/var/log/secure”就是保存素统验证和授权信息日志的。
    • 系统设备文件。如“/dev/lpO”代表第一台打印机,如果日志保存位置是打印机设备的话,当有日志时就会在打印机打印(不太符合可持续发展战略哦-_-!)。
    • 转发给远程主机。因为可以选择使用TCP协议和UDP协议传输日志信息,所以有两种发送格式。如使用“@192.168.0.210:514”,就会把日志内容使用UDP协议发送到192.168.0.210的UDP514端口上;如果使用“@0192.168.0.210:514”就会把日志内容使用TCP协议发送到192.168.0.210的TCP 514端口上,其中514是日志服务默认端口。当然只要192.168.0.210同意接收此日志,就可以把日志内容保存在日志服务器上。
    • 用户名。如“root”,就会把日志发送给root用户,当然root要在在线,否则就收不到日志信息了。发送日志给用户时,可以使用“”代表发送给所有在线用户,如“mail.”就会把mail服务产生的所有级别的日志发送给所有在线用户。如果需要把日志发送给多个在线用户,用户名之间用“ , ”分隔。

    忽略或丢弃日志。如果接受日志的对象是“”,代表这个日志不会记录,而被直接丢弃。如“local3.*”代表忽略local3服务类型所有的日志都不记录。

    2)、/etc/rsyslog.conf 配置文件的内容

    ~ vim /etc/rsyslog.conf
    #查看配置文件的内容
    # rsyslog v5 configuration file
    
    # For more information see /usr/share/doc/rsyslog-*/rsyslog_conf.html
    # If you experience problems, see http://www.rsyslog.com/doc/troubleshoot.html
    
    #### MODULES ####
    #加载的默认
    
    $ModLoad imuxsock # provides support for local system logging (e.g. via logger command)
    #加载 imuxsock 模块,为本地系统登录提供支持
    $ModLoad imklog   # provides kernel logging support (previously done by rklogd)
    #加载 imklog 模块,为内核登录提供支持
    #$ModLoad immark  # provides --MARK-- message capability
    #加载 immark 模块,提供标记信息的能力
    
    # Provides UDP syslog reception
    #$ModLoad imudp
    #$UDPServerRun 514
    #加载UPD模块,允许使用UDP的514端口接收采用UDP协议转发的日志
    
    # Provides TCP syslog reception
    #$ModLoad imtcp
    #$InputTCPServerRun 514
    #加载TCP模块,允许使用TCP 的514端口接收采用TCP 协议转发的日志
    
    #### GLOBAL DIRECTIVES ####
    #定义全局设置
    
    # Use default timestamp format
    $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat
    #定义日志的时间使用默认的时间戳格式
    
    # File syncing capability is disabled by default. This feature is usually not required,
    # not useful and an extreme performance hit
    #$ActionFileEnableSync on
    #文件同步功能。默认没有开启,是注释的。
    
    # Include all config files in /etc/rsyslog.d/
    $IncludeConfig /etc/rsyslog.d/*.conf
    #包含/etc/rsyslog.d/目录中所有的“.conf”子配置文件。也就是说这个目录中的所有
    #子配置文件也同时生效。
    
    #### RULES ####
    #日志文件保存规则
    
    # Log all kernel messages to the console.
    # Logging much else clutters up the screen.
    #kern.*                                                 /dev/console
    #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
    #所有服务.info以上级别的日志                              保存在/var/log/messages日志中。
    #mail,authpriv,cron 的日志不记录在/var/log/messages日志文件中,因为它们都有自己的日志文件。
    #所以/var/log/messages日志是最重要的系统日志文件,需要经常查看!
    
    # The authpriv file has restricted access.
    authpriv.*                                              /var/log/secure
    #用户认证服务所有级别的日志                               保存在/var/log/secure日志中
    
    # Log all the mail messages in one place.
    mail.*                                                  -/var/log/maillog
    #mail服务的所有级别的日志                                 保存在/var/log/maillog日志中。
    #“-”号的含义是日志先在内存之中保存,当日志够多之后,再向文件中保存。
    
    # Log cron stuff
    cron.*                                                  /var/log/cron
    #计划任务的所有日志                                       保存在/var/log/cron日志中
    
    # Everybody gets emergency messages
    *.emerg                                                 *
    #所有日志服务的疼痛等级日志对                             所有在线用户广播。
    
    # Save news errors of level crit and higher in a special file.
    uucp,news.crit                                          /var/log/spooler
    #ucp和news日志服务的crit 以上的日志                       保存在/var/log/sppoler日志文件中。
    
    # Save boot messages also to boot.log
    local7.*                                                /var/log/boot.log
    #loacl7日志服务的所有日志                                 写入/var/log/boot.log日志中。
    #会把开机时的检测信息在显示到屏幕的同时,写入/var/log/boot.log日志中
    
    
    # ### begin forwarding rule ###
    #定义转发规则
    # The statement between the begin ... end define a SINGLE forwarding
    # rule. They belong together, do NOT split them. If you create multiple
    # forwarding rules, duplicate the whole block!
    # Remote Logging (we use TCP for reliable delivery)
    #
    # 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.
    #$WorkDirectory /var/lib/rsyslog # where to place spool files
    #$ActionQueueFileName fwdRule1 # unique name prefix for spool files
    #$ActionQueueMaxDiskSpace 1g   # 1gb space limit (use as much as possible)
    #$ActionQueueSaveOnShutdown on # save messages to disk on shutdown
    #$ActionQueueType LinkedList   # run asynchronously
    #$ActionResumeRetryCount -1    # infinite retries if host is down
    # remote host is: name/ip:port, e.g. 192.168.0.1:514, port optional
    #*.* @@remote-host:514
    # ### end of the forwarding rule ###
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105

    3)、定义自己的日志

    ~ vim /etc/rsyslog.conf 
    #写入一下一句话
    *.crit                                                  /var/log/alert.log
    #把所有服务的"临界点"以上的错误都保存在/var/log/alert.log日志中
    
    ~ service rsyslog restart 
    Shutting down system logger:                               [  OK  ]
    Starting system logger:                                    [  OK  ]
    #重启 rsyslog 服务
    
    ~ ls -l /var/log/alert.log
    -rw------- 1 root root 0 Aug 22 17:56 /var/log/alert.log
    #/var/log/alert.log 日志生成了
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    2.3 日志轮替

    日志文件轮替要进行的操作是切割,先要按天把日志切开。

    轮替就是保留的天数,如果是设置成10天,那么日志就开始从第1天保存日志,保留到第10天,那么保留第11天的时候,会将第1天的日志删除,以此类推。Linux 系统自带的 logrotate 工具理论上将日志写在配置文件中,全部都能支持。(RPM包安装的软件会自动添加到 logrotate 配置文件中,而源码包安装的则需要手动添加到 logrotate 配置文件中)。

    logrotate 工具是可以进行切割和轮替的系统Linux 自带的工具。

    扩展:Windows 日志是只有切割的功能,并没有日志轮替的功能。Windows 也无法清除指定的日志,要清除日志则会删除所有的日志。

    2.3.1 日志文件的命名规则

    日志轮替最主要的作用就是把旧的日志文件移动并改名,同时建立新的空日志文件,当旧日志文件超出保存的范围之后,就会进行删除。那么旧的日志文件改名之后,如何命名呢?主要依靠 /etc/logrotate.conf 配置文件中“dateext”参数:

    • 如果配置文件中拥有“dateext”参数,那么日志会用日期来作为日志文件的后缀,例如“secure-20180605”。这样的话日志文件名不会重叠,所以也就不需要日志文件的改名,只需要保存指定的日志个数,删除多余的日志文件即可。
    • 如果配置文件中没有“dateext”参数,那么日志文件就需要进行改名了。当第一次进行日志轮替时,当前的“secure”日志会自动改名为“secure.1”,然后新建“secure”日志,用来保存新的日志。当第二次进行日志轮替时,“secure.1”会自动改名为“secure.2”,当前的“secure”日志会自动改名为“secure.1”,然后也会新建“secure”日志,用来保存新的日志,以此类推。

    2.3.2 logrotate 配置文件

    ~ vim /etc/logrotate.conf 
    # see "man logrotate" for details
    # rotate log files weekly
    weekly
    #每周对日志文件进行一次轮替
    
    # keep 4 weeks worth of backlogs
    rotate 4
    #保存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/目录中所有的子配置文件。也就是说会把这个目录中所有子配置文件读取进来,
    #进行日志轮替。
    
    # no packages own wtmp and btmp -- we'll rotate them here
    #以下两个轮替日志有自己的独立参数,如果和默认的参数冲突,则独立参数生效。
    
    /var/log/wtmp {
    #以下参数仅对此目录有效
        monthly
        #每月对目志文件进行一次轮替
        create 0664 root utmp
        #建立的新日志文件,权限是0664,所有者是root,所属组是utmp组
            minsize 1M
            #日志文件最小轮替大小是1MB。也就是日志一定要超过1MB才会轮替,否则就算
            #时间达到一个月,也不进行日志转储
        rotate 1
        #仅保留一个日志备份。也就是只有wtmp和 wtmp.1日志保留而已
    }
    
    /var/log/btmp {
    #以下参数只对/var/log/btmp生效
        missingok
        #如果日志不存在,则忽略该日志的警告信息
        monthly
        create 0600 root utmp
        rotate 1
    }
    
    # system-specific logs may be also be configured here.
    
    ~ vim /etc/logrotate.d/syslog 
    /var/log/cron
    /var/log/maillog
    /var/log/messages
    /var/log/secure
    /var/log/spooler
    {
        sharedscripts
        postrotate
            /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        endscript
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69

    logrotate配置文件的主要参数,我们通过表来说明下:

    参数参数说明
    daily日志的轮替周期是每天
    weekly日志的轮替周期是每周
    monthly日志的轮替周期是每月
    rotate 数字保留的日志文件的个数。0 指没有备份。
    compress日志轮替时,旧的日志进行压缩
    create mode owner group建立新目志,同时指定新日志的权限与所有者和所属组。如create 0600 root utmp
    mail address当日志轮替时,输出内容通过邮件发送到指定的邮件地址。如mail shenc@lamp. net
    missingok如果日志不存在,则忽略该日志的警告信息
    notifempty如果日志为空文件,则不进行日志轮替
    minsize 大小日志轮替的最小值。也就是目志一定要达到这个最小值才会轮替,否则就算时间达到也不轮替
    size 大小日志只有大于指定大小才进行日志轮替,而不是按照时间轮替。如size 100k
    dateext使用日期作为日志轮替文件的后缀。如secure-20180605
    sharedscripts在此关键字之后的脚本只执行一次
    prerotate/endscript在日志轮替之前执行脚本命令。endscript标示prerotate脚本结束。
    postrotate/endscript在日志轮替之后执行脚本命令。endscript标示 postrotate脚本结束

    这些参数中较为不好理解的应该就是 prerotate/endscript 和 postrotate/endscript 参数了,我们利用“man logrotate”中的列子来解释下这两个参数。例如:

    ~ man logrotate
          "/var/log/httpd/access.log" /var/log/httpd/error.log {
          #日志轮替的是 /var/log/httpd/ 中RPM包安装的 apache 正确访问日志和错误日志
               rotate 5
              #轮替5次
               mail www@my.org
              #信息发送到指定邮箱
               size 100k
              #日志大于100KB时才进行日志轮替,不再按照时间轮替
               sharedscripts
              #以下脚本只执行一次
               postrotate
              #在日志轮替结束之后,执行以下脚本
                   /usr/bin/killall -HUP httpd
                  #重启apache服务
               endscript
              #脚本结束
           }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    prerotate和 postrotate主要用于在日志轮替的同时,执行指定的脚本,一般用于日志轮替之后重启服务。这里强调,如果你的日志是写久rsyslog服务的配置文件的,那么把新日志加入logrotate后,一定要重启rsyslog服务,否则你会发现虽然新日志建立了,但是数据还是写入了旧的日志当中。那是因为虽然logrotate知道日志轮替了,但是rsyslog服务却并不知道。同理,如果你的日志不是被rsyslog 管理,如源码包安装的Apache、Nginx等服务,则需要重启Apache或Nginx服务,否则日志也不能正常轮替。

    不过这里还有个典型应用就是给予特定的日志加入chattr 的 a属性,如果系统文件加入了 a 属性,那么这个文件就只能增加数据,但是不能删除和修改已有的数据了,而且root用户也不能例外。所以我们会给重要的日志文件加入 a 属性,这样的话可以保护日志文件不被恶意修改。不过一旦加入了a属性,那么日志轮替时,这个日志文件是不能被改名的,当然也就不能进行日志轮替了。所以我们可以利用 prerotate 和 postrotate 来修改日志文件的chattr的a属性。在下一个小节,我们会具体说明下这两个参数的使用。

    2.3.3 把自己的日志加入日志轮替

    这里有两个方法:第一种方法是直接在/etc/logrotate.conf配置文件中写入该日志的轮替策略,从而把日志加入轮替;第二种方法是在/etc/logrotate.d/目录中新建立该日志的轮替文件,在该轮替文件中写入正确的轮替策略,因为该目录中的文件都会被“include”到主配置文件中,所以也可以把日志加入轮替。我们这里推荐第二种方法,因为系统中需要轮替的日志非常多,如果全都直接写入 /etc/logrotate.conf 配置文件,那么这个文件的可管理性就会非常差,不利于此文件的维护。

    说起来很复杂,我们举个例子吧,还记得我们自己生产的 /var/log/alert.log 日志吗?这个日志不是系统默认日志,而是我们通过/etc/rsyslog.conf配置文件自己生成的日志,所以默认这个日志是不会轮替的。那么我们需要把这个日志加入日志轮替的策略,该怎么实现呢﹖我们采用第二种方法,也就是在/etc/logrotate.d/目录中建立此日志的轮替文件。具体步骤如下:

    ~ chattr +a /var/log/alert.log
    #先给日志文件赋予chattr的a属性,保证日志的安全
    ~ vim /etc/logrotate.d/alter
    #创建alter轮替文件,把/var/log/alert.log加入轮替
    /var/log/alert.log {
        weekly
        #每周轮替一次
        rotate 6
        #保留6个轮替日志
        sharedscripts
        #以下命令只执行一次
        prerotate
        #在日志轮替之前执行
            /usr/bin/chattr -a /var/log/alert.log
            #在日志轮替之前取消 a 属性,以便让日志可以轮替
        endscript
        #脚本结束
    
        sharedscripts
        postrotate
        #在日志轮替之后执行
            /usr/bin/chattr +a /var/log/alert.log
            #在日志轮替之后,重新加入 a 属性
        endscript
        #脚本结束
    
        sharedscripts
        postrotate
            /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2> /dev/null) &> /dev/null
        endscript
        #重启 rsyslog 服务,保证日志轮替正常
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    再举个例子,我们如果需要把Nginx服务的日志加入日志轮替,则也需要重启Nginx服务,例如:

    #生产环境使用
    ~ vim /etc/logrotate.d/nginx
    /data/logs/nginx/access/access.log /data/logs/nginx/access/default.log {
    #假设Nginx的日志放在 /data 目录下
        daily
        rotate 15
        sharedscripts
        postrotate
            /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid) &> /dev/null
            #重启syslogd服务
            /bin/kill -HUP $(/bin/cat /usr/local/nginx/logs/nginx.pid) &> /dev/null
            #重启Nginx服务
        endscript
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    重启Nginx服务优点是平滑重启,标准重启:是将服务关闭后再将服务重新启动。如果有用户使用该服务,但是由于标准重启,那么服务与用户之间的连接就会断开。平滑重启:则是会温和的多,如果有用户使用该服务,使用平滑重启,那么就会忽略用户和服务之间的连接,当用户连接断开,再将该进程重启。

    2.3.4 logrotate 命令

    我们日志轮替之所以可以在指定的时间备份日志,其实也要依赖系统定时任务。如果大家还记得/etc/cron.daily/目录,就会发现这个目录中是有logrotate 文件,logrotate通过这个文件依赖定时任务执行的。

    不过logrotate命令的格式是什么样的呢?我们来学习下:

    [root@localhost ~]# logrotate [选项] 配置文件名
    选项:
      如果此命令没有选项,则会按照配置文件中的条件进行日志轮替
      -v:显示目志轮替过程。加了-v选项,会显示日志的轮替的过程
      -f:强制进行日志轮替。不管日志轮替的条件是否已经符合,强制配置文件中所有的日志进行轮替
    
    • 1
    • 2
    • 3
    • 4
    • 5

    我们执行logrotate命令,并查看下执行过程:

    ~ logrotate -v /etc/logrotate.d/alter 
    #查看日志轮替的流程
    ...省略部分输出...
    
    rotating pattern: /var/log/alert.log  weekly (6 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/alert.log
      log does not need rotating
      #日志轮替的时间没有到,还不能进行轮替
    not running prerotate script, since no logs will be rotated
    not running postrotate script, since no logs were rotated
    set default create context
    ~ logrotate -vf /etc/logrotate.d/alter 
    reading config file /etc/logrotate.d/alter
    reading config info for /var/log/alert.log 
    
    Handling 1 logs
    
    rotating pattern: /var/log/alert.log  forced from command line (6 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/alert.log
      log needs rotating
    rotating log /var/log/alert.log, log->rotateCount is 6
    dateext suffix '-20220825'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    renaming /var/log/alert.log.6 to /var/log/alert.log.7 (rotatecount 6, logstart 1, i 6), 
    old log /var/log/alert.log.6 does not exist
    renaming /var/log/alert.log.5 to /var/log/alert.log.6 (rotatecount 6, logstart 1, i 5), 
    old log /var/log/alert.log.5 does not exist
    renaming /var/log/alert.log.4 to /var/log/alert.log.5 (rotatecount 6, logstart 1, i 4), 
    old log /var/log/alert.log.4 does not exist
    renaming /var/log/alert.log.3 to /var/log/alert.log.4 (rotatecount 6, logstart 1, i 3), 
    old log /var/log/alert.log.3 does not exist
    renaming /var/log/alert.log.2 to /var/log/alert.log.3 (rotatecount 6, logstart 1, i 2), 
    old log /var/log/alert.log.2 does not exist
    renaming /var/log/alert.log.1 to /var/log/alert.log.2 (rotatecount 6, logstart 1, i 1), 
    old log /var/log/alert.log.1 does not exist
    renaming /var/log/alert.log.0 to /var/log/alert.log.1 (rotatecount 6, logstart 1, i 0), 
    old log /var/log/alert.log.0 does not exist
    log /var/log/alert.log.7 doesn't exist -- won't try to dispose of it
    running prerotate script
    fscreate context set to unconfined_u:object_r:var_log_t:s0
    renaming /var/log/alert.log to /var/log/alert.log.1
    running postrotate script
    set default create context
    
    ~ ls -l /var/log/alert.log*
    -rw-------. 1 root root 0 Aug 24 03:23 /var/log/alert.log.1
    ~ lsattr /var/log/alert.log*
    -------------e- /var/log/alert.log.1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50

    范例:添加 dateext 日期后缀

    cat /etc/logrotate.d/alter 
    /var/log/alert.log {
        weekly
        rotate 6
        dateext
        sharedscripts
        prerotate
            /usr/bin/chattr -a /var/log/alert.log
        endscript
    
        sharedscripts
        postrotate
            /usr/bin/chattr +a /var/log/alert.log
        endscript
    
        sharedscripts
        postrotate
            /bin/kill -HUP $(/bin/cat /var/run/syslogd.pid 2> /dev/null) &> /dev/null
        endscript
    }
    ~ service rsyslog restart
    ~ logrotate -fv /etc/logrotate.d/alter 
    reading config file /etc/logrotate.d/alter
    reading config info for /var/log/alert.log 
    
    Handling 1 logs
    
    rotating pattern: /var/log/alert.log  forced from command line (6 rotations)
    empty log files are rotated, old logs are removed
    considering log /var/log/alert.log
      log needs rotating
    rotating log /var/log/alert.log, log->rotateCount is 6
    dateext suffix '-20220825'
    glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
    glob finding old rotated logs failed
    running prerotate script
    fscreate context set to unconfined_u:object_r:var_log_t:s0
    renaming /var/log/alert.log to /var/log/alert.log-20220825
    running postrotate script
    set default create context
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
  • 相关阅读:
    IaC实战指南:DevOps的自动化基石
    跟我学c++初级篇——别名的使用
    PT_大数定律LLN
    LeetCode 1282. Group the People Given the Group Size They Belong To【哈希表】1267
    测试人生 | 突破“大专学历+半路转行”标签,从拉垮菜鸟到测试团队骨干,走到这一步很知足!
    SQL语句之SELECT INTO
    STM32 Flash
    【java并发编程】Lock & Condition 协调同步生产消费
    低代码平台AWS PaaS_安装应用商店的标准应用(安装单一应用)
    Semantic Kernel .NET SDK 的 v1.0.0 Beta1 发布
  • 原文地址:https://blog.csdn.net/weixin_40274679/article/details/126643258