第14章 日志管理

作者: fe8478c7ba2a | 来源:发表于2018-04-17 20:28 被阅读7次
    简介
        任务一:
            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找到日志文件进行书写,如果不重启,找寻的依旧是老的日志文件。

    相关文章

      网友评论

        本文标题:第14章 日志管理

        本文链接:https://www.haomeiwen.com/subject/twgpkftx.html