运维大世界我爱编程

第14章 日志管理

2018-04-17  本文已影响7人  fe8478c7ba2a
简介
    任务一:
        rsyslog 系统日志管理
            关心问题:哪类程序---》产生的什么日志----》放到什么地方
    任务二:
        logrotate日志轮转
            将大量的日志,分割管理,删除旧日志。
    任务三:
        系统信息可视化:
            将来采集 -----> 分析
任务一详解:
    一、处理日志的进程
        第一类:
            rsyslogd: 系统专职日志程序。将绝大部分日志记录,
              和系统操作有关,安全,认证sshd,su,计划任务at,cron...
        第二类:
            httpd/nginx/mysql: 各类应用程序,可以以自己的方式记录日志
        观察 rsyslogd程序
            [root@yangs ~]# ps aux |grep rsyslogd
              root 717 0.0 0.0 219752 3880 ? Ssl 09:05 0:00 /usr/sbin/rsyslogd -n
    二、常见的日志文件(系统、进程、应用程序)
        二、常见的日志文件(系统、进程、应用程序)
              # tail /var/log/messages      //系统主日志文件
              # tail -20 /var/log/messages
              # tail -f /var/log/messages       //动态查看日志文件的尾部
              # tailf /var/log/secure            //认证、安全
              # tail /var/log/maillog            //跟邮件postfix相关
              # tail /var/log/cron          //crond、at进程产生的日志
              # tail /var/log/dmesg          //和系统启动相关
              # tail /var/log/audit/audit.log        //系统审计日志
              # tail /var/log/yum.log            //yum
              # tail /var/log/mysqld.log        //MySQL
              # tail /var/log/xferlog           //和访问FTP服务器相关
              # w                   //当前登录的用户 /var/log/wtmp
              # last                    //最近登录的用户 /var/log/btmp
              # lastlog                 //所有用户的登录情况 /var/log/lastlog

        
            

    三、rsyslogd配置
        1.相关程序
             yum install rsyslog   logrotate
                (默认已安装)
        2.启动程序
            systemctl  start    rsyslog.service
        3.相关文件
            # rpm -qc rsyslog       //观察日志程序的配置文件
                /etc/rsyslog.conf       //rsyslogd的主配置文件(关键)
                /etc/sysconfig/rsyslog       //rsyslogd相关文件,定义级别(了解一下)
                /etc/logrotate.d/syslog     //和日志办轮转(切割)相关(任务二)
        主配置文件常见配置
            告诉rsyslogd进程 哪个设备,什么样的信息,以及存到哪里。
            # vim /etc/rsyslog.conf
                RULES
                    RULES:即规则,是一套生成日志,以及存储日志的策略。
       由设备+级别+存放位置组成。
       由FACILITY+LEVEL+FILE组成。
                    authpriv.*      /var/log/secure(SSH信息)
              mail.*            -/var/log/maillog(发邮件)
              cron.*            /var/log/cron(创建任务)
              authpriv.*         * <*代表所有终端>
              authpriv.*        @192.168.10.230     <UDP>
              authpriv.*        @@192.168.10.230    <TCP>
                        这里有一个-符号, 表示是使用异步的方式记录, 因为日志一般会比较大
                        *.info;mail.none;authpriv.none;cron.none                /var/log/messages   
              系统日志排除了邮件,认证,计划日志。
                        @@表示通过tcp协议发送    @表示通过udp进行转发
                        omprog - 发送日志给程序处理
                        案例5
                            通过邮件日志,了解日志记录。
                            终端1
                                锁定邮件日志
                                    tailf /var/log/maillog
                            终端2
                                发送电子邮件,触发生成日志。
                                    mail -s 'test1' root
              1234
              ctrl+D
                                    返回终端1,观察新生成日志。理解日志行为。
                        案例6
                            通过任务计划,了解日志记录。
                            终端1
                                tailf /var/log/cron
                            终端2
                                crontab -e
              观察终端1
                FACILITY&LEVEL
                    目的:通过man手册理解设备和级别
                    facility设备
                        # man 3 syslog
              facility:是系统对某种类型事件的定义。如AUTHPRIV是安全事件,CRON是计划任务事件。
              设备如下:

              LOG_AUTH
              LOG_AUTHPRIV       安全认证
              LOG_CRON  clock daemon (cron and at)
              LOG_DAEMON            后台进程
              LOG_FTP       ftp daemon
              LOG_KERN  kernel messages
              LOG_LOCAL0 through LOG_LOCAL7      用户自定义设备
              LOG_LPR       printer subsystem
              LOG_MAIL          邮件系统mail subsystem
              LOG_NEWS  news subsystem
              LOG_SYSLOG        syslogd自身产生的日志 
              LOG_USER (default)
                            关于程序和设备的联系问题,程序自身会决定将日志交给哪类设备。如SSH程序会选择安全类设备。这一点由开发者定义。
              vim  /etc/ssh/sshd_config 
              SyslogFacility AUTHPRIV
                    level级别
                        # man 3 syslog
              level :是指遇到何种情况(正常、错误)才会记录日志。

              LOG_EMERG         紧急,致命,服务无法继续运行,如配置文件丢失
              LOG_ALERT         报警,需要立即处理,如磁盘空使用95%
              LOG_CRIT      致命行为
              LOG_ERR       错误行为
              LOG_WARNING    警告信息
              LOG_NOTICE    普通,重要的标准信息
              LOG_INFO      标准信息
              LOG_DEBUG         调试信息,排错所需,一般不建议使用
            从下到上,级别从低到高,记录的信息越来越少
                图示
                    目的:通过绘图形式来理解日志工作机制。
                    图示
                        
                示例
                    日志命令
                        # logger "run......."   //messages日志
                        # logger -p emerg  "run......." //所有终端
                        # logger -p authpriv.info "run......."  
secure安全日志
    四、日志收集服务器
        目的
            日志可以存放在本地
              日志可以存放在远程服务器
        实战案例
            案例1:将authpriv设备日志记录到/var/log/auth.log
                步骤:
                    1.修改日志文件位置
                        vim /etc/rsyslog.conf 
              #authpriv.*                                              /var/log/secure
              authpriv.*                                              /var/log/auth.log
                    2.观察日志文件。
                        # ll /var/log/auth.log
              ls: 无法访问/var/log/auth.log: 没有那个文件或目录
                        因为没有任何日志记录生成。
                    3.重启程序,触发日志生成。
                        #systemctl restart rsyslog.service 
              # ll /var/log/auth.log
              -rw-------. 1 root root 964   /var/log/auth.log
              cat /var/log/auth.log
            案例2:改变应用程序sshd的日志设备为local5, 并定义local5设备日志记录到/var/log/local5.local
                步骤:
                    1.设置ssh程序的日志设备为自定义设备。
                        # vim /etc/ssh/sshd_config
              #SyslogFacility AUTHPRIV
              SyslogFacility LOCAL5
                    2.设置自定义设备日志文件存放位置。
                        # vim /etc/rsyslog.conf 
              local5.*       /var/log/local5.local
                    3.重启生效。
                        # systemctl restart sshd
              # systemctl restart rsyslog
                    4.尝试登录,触发日志。
                    5.观察日志。理解自定义日志设备。
                        # ll /var/log/local5.local 
              -rw-------. 1 root root 201   /var/log/local5.local
              cat /var/log/local5.local
            案例3:使用logger程序写日志到指定的设备及级别,并发送到集中日志服务器。
                步骤
                    服务器1(10.18.41.144)发送日志
                        # vim /etc/ssh/sshd_config
              #SyslogFacility AUTHPRIV
              SyslogFacility LOCAL5
                            此处修改SSH只是测试
                        vim /etc/rsyslog.conf 
              local5.*      @10.18.41.12
                            此处填写另一台设备的IP地址。
              另一台设备是集中日志服务器。
                        # systemctl restart sshd
              # systemctl restart rsyslog
              #systemctl stop firewalld
                    服务器2(10.18.41.12)接受日志
                        # vim /etc/rsyslog.conf 
              $ModLoad imudp
              $UDPServerRun 514
              local5.*       /var/log/server152.log
                        # systemctl restart rsyslog
              #systemctl stop firewalld
                        尝试ssh登录服务器1.
              并观察本地日志
              ll /var/log/server152.log
任务二详解:
    logrotate日志轮转
        简介
            日志 , 记录了程序运行时各种信息。
              通过日志可以分析用户行为,记录运行轨迹,查找程序问题。

              可惜磁盘的空间是有限的,就像飞机里的黑匣子,记录的信息再重要也只能记录最后一段时间发生的事。

              为了节省空间和整理方便,日志文件经常需要按!时间或!大小等维度分成多份,删除时间久远的日志文件。这就是通常说的日志滚动(log rotation)。

              logrotate本身不是系统守护进程,它是通过计划任务crond每天执行 
        工作原理
            1 被crond调动
                [root@yangs ~]# cat /etc/cron.daily/logrotate 
              #!/bin/sh 
              /usr/sbin/logrotate /etc/logrotate.conf   //日志轮转,按/etc/logrotate.conf 
            2 按照配置进行轮转
                配置文件种类
                    logrotate 配置文件:
              主文件:/etc/logrotate.conf (决定每个日志文件如何轮转)
              子文件夹:/etc/logrotate.d/*
                观察主文件和子文件
                    [root@tianyun ~]# ls /etc/logrotate.conf /etc/logrotate.d/
              /etc/logrotate.conf
              /etc/logrotate.d/:
              acpid cups iscsiuiolog ppp rpm subscription-manager up2date wpa_supplicant
              conman httpd mgetty psacct setroubleshoot syslog vsftpd.log yum
        主配置文件介绍
            [root@localhost ~]# vim /etc/logrotate.conf 
            =========全局设置==========
              weekly        //轮转的周期,一周轮转
              rotate 4      //保留4份
              create        //轮转后创建新文件
              dateext       //使用日期作为后缀
              #compress  //是否压缩
              include /etc/logrotate.d  //包含该目录下的子配置文件
            /var/log/wtmp {     //对某日志文件设置轮转的方法
              monthly               //一月轮转一次
              minsize 1M        //最小达到1M才轮转
              create 0664 root utmp  //轮转后创建新文件,并设置权限
              rotate 1      //保留一份
              }
            /var/log/btmp {
              missingok         //丢失不提示
              monthly           //每月轮转一次
              create 0600 root utmp     //轮转后创建新文件,并设置权限
              rotate 1      //保留一份
              }
        例1:yum日志轮转
            例1:轮转文件/var/log/yum.log
            配置轮转规则
                # vim /etc/logrotate.d/yum 
              /var/log/yum.log {
              missingok     //丢失不执行
              # notifempty      //空文件不论转
              # size 30k        //达到30k即可轮转
              # yearly      //或者一年一轮转
              daily     //缩小周期到1天
              rotate 3      //轮转保留3次
              create 0777 root root
              }
            测试1
                # /usr/sbin/logrotate /etc/logrotate.conf //手动轮转
              # ls /var/log/yum*
              /var/log/yum.log  //文件只有一个。因为日期没变

              # grep 'yum' /var/lib/logrotate/logrotate.status //记录所有日志文件最近轮转的时间
              "/var/log/yum.log" 2017-3-31-10:0:23      //如果没有轮转过,第一次只有记录

              修改时间,手动触发轮转
              # date 04011000
              # /usr/sbin/logrotate  -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf
        例2:messages日志轮转(追加属性)
            目的:
                1.设置系统日志轮转
              2.为系统日志文件增加属性。用于保护日志文件。
            准备工作:
                删除原有的 /etc/logrotate.d/syslog,关于messages的行。
              避免不同的规则互相影响。
                    示例
                        [root@localhost ~]# cat /etc/logrotate.d/syslog 
              /var/log/cron
              /var/log/maillog
              ???????删除掉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
              }

            第一步:设置轮转
                vim /etc/logrotate.d/messages
              /var/log/messages {       
              #notifempty       
              daily             
              create 0600 root root 
              missingok     
              rotate 5      
              } 
                测试:
                     /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status  /etc/logrotate.conf 
                    ll /var/log/message*
                    发现轮转成功。
            第二步设置追加属性。
                chattr +a /var/log/messages
                测试:
                    修改时间,再次手动轮转,发现轮转失败。请思考,为什么。
                     /usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status  /etc/logrotate.conf 
            第三步设置轮转脚本
                vim /etc/logrotate.d/messages
              /var/log/messages {
              prerotate
              chattr -a /var/log/messages
              endscript

              #notifempty
              daily
              create 0600 root root
              missingok
              rotate 5

              postrotate
              chattr +a /var/log/messages
              endscript
              }
                修改时间,重启rsyslog程序。进行轮转测试
            第四部总结
                 chattr的a属性只能以追加的方式打开,用vi打开是不行的。可以这样写入:ls >> file
                避免日志被误删除
        例3:理解轮转后需重启的概念
            1.通过如下轮转配置示例,理解轮转后执行脚本的语法结构。
            2.轮转配置示例
                例3:/etc/logrotate.d/syslog
              /var/log/cron
              /var/log/maillog
              /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
              }

                    注释
                        重启 `rsyslog ,`如果重启失败,输入到垃圾桶  ||  永远为真
                        1) SIGHUP 重新加载配置
                        如果左侧命令执行失败了||那么就执行右侧命令。
                            && || 示例说明
                                1.测试一个存在的IP,返回yes
              [root@localhost ~]# ping -c 1 10.18.42.74 &> /dev/null  && echo yes || echo no
              yes

              2.测试一个不存在的IP,返回NO
              [root@localhost ~]# ping -c 1 10.18.42.79 &> /dev/null  && echo yes || echo no
              no

                        强制轮转的命令:logrotate -f /etc/logrotate.conf
            3.通过实验4,理解重启程序的必要性。
        例4:access_log日志轮转
            预习HTTP和FD知识点
            第一步:安装网站(了解)
                第一步:安装网站(了解)
              [root@localhost ~]# yum -y install httpd
              [root@localhost ~]# echo "AAAAA" > /var/www/html/index.html
              [root@localhost ~]# systemctl start httpd
              [root@localhost ~]# firewall-cmd --permanent --add-service=http
              [root@localhost ~]# firewall-cmd --reload 
            第二步:访问网站地址,观察访问日志(了解)
                第二步:访问网站地址,观察访问日志(了解)
              [root@localhost ~]# wc -l /etc/httpd/logs/access_log 
              2647 /etc/httpd/logs/access_log
              [root@localhost ~]# awk '{print $1}' /etc/httpd/logs/access_log |sort |uniq -c |sort -k1 -nr
              1310 172.16.120.161
              826 172.16.120.14
              729 172.16.120.210
              638 172.16.120.107
            第三步:观察访问日志有个孪生兄弟。(了解)。
                第三步:观察访问日志有个孪生兄弟。(了解)。
              [root@localhost ~]# ll -i /etc/httpd/logs/access_log /var/log/httpd/access_log 
              37552569 -rw-r--r-- 1 root root 658886 Apr 7 10:07 /etc/httpd/logs/access_log
              37552569 -rw-r--r-- 1 root root 658886 Apr 7 10:07 /var/log/httpd/access_log
            第四步:编写轮转规则,只是注释掉重启的语句。(重点理解)
                第四步:编写轮转规则,只是注释掉重启的语句。(重点理解)
              [root@localhost ~]# vim /etc/logrotate.d/httpd
              /var/log/httpd/*log {
              missingok
              notifempty
              sharedscripts
              delaycompress
              # postrotate
              # /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
              # endscript
              }
            第五步:轮转,观察轮转后的日志。(了解)
                第五步:轮转,观察轮转后的日志。(了解)
              [root@localhost ~]# ll /var/log/httpd/access*   -i     //观察原来的日志文件和目标日志文件
              -rw-r--r-- 1 root root 664831 Apr 7 10:08 /var/log/httpd/access_log

              [root@localhost ~]# logrotate -f /etc/logrotate.conf 

              [root@localhost ~]# ll /var/log/httpd/access*
              -rw-r--r-- 1 root root 0 Apr 7 10:11 /var/log/httpd/access_log
              -rw-r--r-- 1 root root 664831 Apr 7 10:08 /var/log/httpd/access_log-20170407
              重点注意:原来的文件空了。access_log文件空了。

                              第六步:继续访问网站,观察日志文件...(重点理解)
                第六步:继续访问网站,观察日志文件...(重点理解)
              问题来了。原来的文件应该继续写入内容。但是依旧是空的。
              [root@localhost ~]# ls /etc/httpd/logs/* -l
              -rw-r--r-- 1 root root 0 Apr 7 10:11 /etc/httpd/logs/access_log
              -rw-r--r-- 1 root root 1522522 Apr 7 10:12 /etc/httpd/logs/access_log-20170407
              -rw-r--r-- 1 root root 0 Apr 7 10:11 /etc/httpd/logs/error_log
              -rw-r--r-- 1 root root 1124 Apr 7 10:03 /etc/httpd/logs/error_log-20170407
            第七步:根据FD观察程序打开了哪个日志
                第七步:根据FD观察程序打开了哪个日志。注意下面看的是父进程的FD。(了解)
              [root@localhost ~]# pgrep httpd
              6416
              7049
              7055
              7059
              7945
              7947
              7948
              7950
              7951
              7952
              7971
                            第八步:父进程打开的依旧是轮训后的新文件。(了解)
                第八步:父进程打开的依旧是轮训后的新文件。(了解)
              因为轮训是将原来的文件改名。重新创建了一个新文件。
              老的access_log改名为access_log20170407
              新的日志文件是重新创建的。access_log文件。

              [root@localhost ~]# ll /proc/6416/fd
              total 0
              lr-x------ 1 root root 64 Apr 7 10:02 0 -> /dev/null
              lrwx------ 1 root root 64 Apr 7 10:02 1 -> socket:[76246]
              l-wx------ 1 root root 64 Apr 7 10:02 2 -> /var/log/httpd/error_log-20170407
              lrwx------ 1 root root 64 Apr 7 10:02 3 -> socket:[76890]
              lrwx------ 1 root root 64 Apr 7 10:02 4 -> socket:[76891]
              lr-x------ 1 root root 64 Apr 7 10:02 5 -> pipe:[76906]
              l-wx------ 1 root root 64 Apr 7 10:02 6 -> pipe:[76906]
              l-wx------ 1 root root 64 Apr 7 10:02 7 -> /var/log/httpd/access_log-20170407

            第九步:手动重启。观察FD调用的文件是哪个?(了解)
                第九步:手动重启。观察FD调用的文件是哪个?(了解)
              [root@localhost ~]# systemctl reload httpd


              [root@localhost ~]# ll /proc/6416/fd
              total 0
              lr-x------ 1 root root 64 Apr 7 10:02 0 -> /dev/null
              lrwx------ 1 root root 64 Apr 7 10:02 1 -> socket:[76246]
              l-wx------ 1 root root 64 Apr 7 10:02 2 -> /var/log/httpd/error_log
              lrwx------ 1 root root 64 Apr 7 10:02 3 -> socket:[76890]
              lrwx------ 1 root root 64 Apr 7 10:02 4 -> socket:[76891]
              lr-x------ 1 root root 64 Apr 7 10:02 5 -> pipe:[96182]
              l-wx------ 1 root root 64 Apr 7 10:02 6 -> pipe:[96182]
              l-wx------ 1 root root 64 Apr 7 10:02 7 -> /var/log/httpd/access_log

            第十步:继续访问网站,观察日志文件...(了解)
                第十步:继续访问网站,观察日志文件...(了解)
              [root@localhost ~]# ll /etc/httpd/logs/access_log*
              -rw-r--r-- 1 root root 1076521 Apr 7 10:17 /etc/httpd/logs/access_log
              -rw-r--r-- 1 root root 1797243 Apr 7 10:15 /etc/httpd/logs/access_log-20170407
            第十一步:启用轮转日志中的重启语句。理解该语句含义(重点理解)
                第十一步:启用轮转日志中的重启语句。理解该语句含义(重点理解)
              [root@localhost ~]# vim /etc/logrotate.d/httpd
              /var/log/httpd/*log {
              missingok
              notifempty
              sharedscripts
              delaycompress
              postrotate
              /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
              endscript
              }

            第十二步:修改时间,手动轮转。访问网站并观察日志大小。
                第十二步:修改时间,手动轮转。访问网站并观察日志大小。
              [root@localhost ~]# date 04101000
              Mon Apr 10 10:00:00 CST 2017
              [root@localhost ~]# logrotate -f /etc/logrotate.conf 
              [root@localhost~]# ll /etc/httpd/logs/access_log*
              -rw-r--r-- 1 root root 39910 Apr 10 10:00 /etc/httpd/logs/access_log
              -rw-r--r-- 1 root root 1797243 Apr 7 10:15 /etc/httpd/logs/access_log-20170407
              -rw-r--r-- 1 root root 5131350 Apr 10 10:00 /etc/httpd/logs/access_log-20170410

说明:
轮转后 原日志文件 被改名,新日志 文件是创建的。
应用程序根据inode找到日志文件进行书写,如果不重启,找寻的依旧是老的日志文件。

上一篇 下一篇

猜你喜欢

热点阅读