日志管理详解

1.系统日志介绍:

  所谓系统日志,记录的要素不外乎时间(系统日志记录的时间),地点(在那台主机上),人物(谁执行的操作或是某进程),事件(具体的任务或具体的操作)等;但是我们可以自定义系统日志记录的关键程度。这种记录在系统日志上成为记录级别(loglevel)。

2. 日志存储的方式:  

  系统日志记录有可能是本机上的日志(默认在/var/log/),也有可能是其他主机上的日志(可以基于udp514或tcp514端口或借助于其他程序发送自己主机上的日志[mysql])

3. ELK 简介

  ELK:由三个软件组成elasticsearch,logstash,kibana 。非关系型分布式数据库

    elasticsearch:是一个开源分布式的搜索引擎们可以处理大规模数据,如nginx,apache,系统日志等

    logstash:对日志进行收集,分析,过滤,并将其存储后供以后使用

    kibana :提供一个便于日志分析的wbe页面

4. sysklog和rsyslog系统日志服务

  sysklog是cnetos5之前版本采用的日志管理系统服务。它主要包含两大块

    syslogd(system application):记录应用日志

    klogd(linux kernel log):记录内核日志

  rsyslog是centos6之后版本的日志系统管理服务,相比sysklog,它提供了更高的性能,安全,以及模块化设计(动态装卸载)。而且他能接受各种来源的输入,并将其转换,然后输出到不同的目的地(如数据库)。这里主要将rsyslog。

  

  rsyslog特性:

    多线程

    UDP,TCP,SSL,TLS

    数据库实现存储

    可以过滤记录日志信息中的任意部分

    自定义输出格式

4 rsyslog管理

  4.1 系统日志术语

    facility:(设施),从功能或程序上对日志进行归类

     常见的系统内置类:

        auth,authpriv,cron,ftp,mail,syslog,security等

     也可以自定义分类或系统预留分类:

        local0-local7

    priority(优先级),从低到高

      debug,info,notice,warn,error,crit(critical),alter,emerg(紧急)

    

    查看帮助:man 3 syslog(如果系统上无帮助手册,安装yum | dnf install -y man-pages),man logger

  4.2  相关文件

    程序包:rsyslog

    主程序:/usr/sbin/rsyslogd

    配置文件:/etc/rsyslog.conf 以及/etc/rsyslog.d/*.conf

    库文件:/lib64/rsyslog/*.so

       使用命令:rpm -ql rsyslog。即可查看安装程序生成的所有文件

  

  4.2.1 rsyslog主配置文件格式(主配置:/etc/rsyslog.conf)

    主要由三部分组成:

      MODULES:相关模块配置(如需使用某模块,需要手动加载)

      GLOBAL DIRECTIVES[指令]:全局配置

      RULES:日志记录的相关规则

    RULES:配置格式:facility.priority; facility.priority… target

      facility格式:

        *   表示所有的facility

        facility1,facility2...    表示指定的facility列表

  

      priority格式:

        *   表示所有级别

        none   表示没有级别,即不记录

        priority  表示指定级别,包含以上的所有级别

        =priority 仅记录指定级别的日志信息

  

      target格式:

        文件路径 :一般在/var/og/,文件路径前的”-“ 表示异步写入,没有“-” 表示同步写入

        用户:将日志事件通知给指定的用户," * "表示登录的所有用户

        日志服务器:@host,把日志发送到指定的远程UDP日志服务器上;@@host,八日至发送到指定的远程TCP日志服务器上

        管道:| COMMAND ,转发给其他命令处理

    4.2.2 通用的日志文件格式(/var/log/message,cron,secure等):

      事件产生的日期时间   主机  进程[pid] :事件内容

      

      范例:将ssh服务的日志记录至自定义的local的日志类别中。

        1. 修改sshd服务的配置(/etc/ssh/sshd_config)

           SyslogFacility AUTHPRIV  注释,添加 SyslogFacility local3

        2. 修改rsyslog的配置(/etc/rsyslog.conf)

            在rules下面添加locla3.*     /var/log/test.log(自定义文件的路径)

        3 .重启sshd,rsyslog;并测试(logger命令,打印自定的string至日志文件中)

  

    4.2.3  启用网络日志服务:

      启用网路日志服务功能,可以将多个远程主机的日志,发送到集中日志服务器上,便于集中管理。

        实现原理是基于主配置文件中的tcp或udp端口。默认是注释掉了

      

       实现步骤

          1. 在集中管理的主机上打开监听的端口(tcp或udp或同时开),并查看端口514是否打开(重启rsyslog)

            省略(在主配置文件中取消注释)

          2.  在需要被管理的主机上的主配置文件中修改规则

              *.info;mail.none;authpriv.none;cron.none位置添加一行

            *.info;mail.none;authpriv.none;cron.none          @10.0.0.110(udp)  |  @@ 10.0.0.110(tcp)

          3. 测试

  

    4.2.4 常见的日志文件

      /var/log/secure : 系统安全日志,文本格式,应用周期性分析

      /var/log/btmp:当前系统上,用户的失败尝试登录相关信息,二进制格式,使用lastb命令进行查看

      /var/log/wtmp:当前系统上,用户正常登录的相关信息,二进制格式,使用last命令查看

      /var/log/lastlog:每一个用户最近一次的登录信息,二进制格式,使用lastlog命令查看

      /var/log/dmesg[系统核心日志]:centos7之前版本系统引导过程中的日志信息,文本格式。但系统启动之后,将不在记录。使用dmesg命令进程查看

      /var/og/boot.log :系统服务启动的相关信息,文本格式

      /var/log/message:系统大部分的日志记录信息

      /var/log/anaconda:anaconda的日志

   

    范例1:找到失败登录的ip

      [root@centos8 ~]#awk '/Failed password/{print $(NF-3)}' /var/log/secure

    范例2:找出失败登录次数最多的前10个ip      

      [root@centos8 ~]#lastb -f btmp-test1 | awk '{print $3}'|sort | uniq -c|sort - nr|head     

      [root@centos8 ~]#lastb -f btmp-test2 | awk '{ip[$3]++}END{for(i in ip){print ip[i],i}}'|sort -nr|head

    4.2.5 日志管理工具journalctl 

      前面介绍的日志查看过于分散,在centos7之后,利用systemd统一管理所有Uint的启动日志。使用journalctl命令即可管理所有日志信息(内核日志和用于日志)

        命令格式:journalctl [OPTIONS...] [MATCHES...]

5. 案例

  案例一:使用mysql存储日志信息

  

    实现目标:利用rsyslog日志服务,将收集的日志信息存储于mysql中

        将10.0.0.143的日志信息存在10.0.0.110主机的数据库中。

    环境准备:centos 7 (10.0.0.143)---->  cnetos8(10.0.0.110)

    实现步骤:

     1. 安装rsyslog-mysql数据库连接协议

       [root@7143 ~]# yum install rsyslog-mysql         #安装

       [root@7143~]# rpm -ql rsyslog-mysql               #查看生成的文件

      

    2. 将安装生成的数据库文件传到数据库主机上(10.0.0.110)。

       [root@7143~]# scp  /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql  10.0.0.110:

    3. 加载模块文件(/usr/lib64/rsyslog/ommysql.so),修改主配置文件/etc/rsyslog.conf文件。

       [root@7143~]# vim /etc/rsyslog.conf   主配置文件的modules位置加载模块。centos8上面使用加载的方式:module(load="模块名" ) 

         

      然后是定义规则(ROULES)    *.info;mail.none;authpriv.none;cron.none               :ommysql:10.0.0.116,Syslog,syslog,123456

  

  

   4. 在10.0.0.110主机上,安装数据库,创建用户并授权。

      [root@8116 ~]# yum install -y mysql-server   #安装数据库

      [root@8116 ~]#mysql  < mysql-createDB.sql       #导入传输过来的数据文件

      [root@8116 ~]#mysql

        mysql> create user syslog@'%'  identified by '123456';           #创建用户

        mysql> grant all on Syslog.* to syslog@'%'                  #授权

   5.测试 

      使用logger命令可以测试

      select * from Syslog.SystemEvents\G; 可便于查看

  案例二:通过loganalyzer展示数据库中的日志

   loganalyzer是php语言开发的日志管理系统,可以将数据库的日志以web方式来展示 

    官网:https://loganalyzer.adiscon.com

     安装环境准备:需要下载loganalyzer包

    实现步骤:

     [root@7143 ~]# yum install rsyslog-mysql     #安装连接数据库程序

     [root@7143 ~]# rpm -ql  rsyslog-mysql 

        [root@7143 ~]# scp     /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql        10.0.0.116:           将安装时带的数据库文件传输到10.0.0.116主机上      

     [root@7143 ~]# vim  /etc/rsyslog.conf          修改配置文件,

        MODULES(加载模块):centos 7  使用$ModLoad模块名

                  centos8 使用module(load=模块名)

        ROULES(定义规则):

           *.info;mail.none;authpriv.none;cron.none    :ommysql:10.0.0.116,Syslog[数据库名],syslog[连接数据库账号],123456

  

     10.0.0.116:安装数据库并创建账户及授权,导入数据文件

      [root@8116 ~]#  yum install -y mysql-server ;systemctl enable --now mysqld

      [root@8116 ~]#  mysql < mysql-createDB.sql

      [root@8116 ~]# mysql                    #安装后哦默认空密码登录,账户是root

        mysql> create user syslog@'%' identified by '123456';

        mysql>grant all on Syslog.* to syslog@'%'

      

     建议测试

     

    10.0.0.117: 搭建web环境

      [root@8117 ~]# yum install -y httpd php-fpm php-mysqlnd  php-gd ;systemctl enable --now httpd 

      [root@8117 ~]#crul http://10.0.0.117 测试。也可以使用浏览器测试

      [root@8117 ~]#tar xf loganalyzer-4.1.11.tar.gz     -C  /var/www/html/ 将下载的loganalyzer文件解压到/var/www/html目录下

      [root@8117 ~]#chown -R apache.apache  /var/www/html/src/ 修改权限,因为文件的写入时使用apache用户的身份(只是安装结束后一需要修改config.php文件的权限)。     

        也可以使用解压文件中的方法(解压文件下的contrib目录下),  touch config.php ;chmod 666 config.php

      浏览器测试:http://10.0.0.117/src

    

      然后下一步.... 总共有7步

      只是在第7步时,需要有变化。

        source type               mysql native

        database host        Syslog

        database name          SystemEvents

        database user    syslog

        database password          123456

  最后测试(logger ”string“),省略

6. logrotate  日志转储

    logrorate程序是一个人日志文件管理工具。用来把就得日志删除,并创建新得日志文件,该过程就叫做日志得转储或滚动

    转储的条件可以根据文件的带下,也可以根据定义的时间段(天,周,月)来转储,该过程是通过cron程序来实现的

  软件包:logrotate   

  相关文件

    /etc/cron.daily/logrotate                   计划任务

    /usr/sbin/logrotate                            程序文件

    /etc/logrotate.conf                            配置文件(系统默认转储条件)

    /var/lib/logrotate/logrotate.status      日志文件

  配置文件主要的参数:

    compress | nocompress  是否启用压缩,默认是gzip压缩

    copytruncate:用于还在打开中的日志文件,把当前日志备份并截断

      nocopytruncate:备份日志但不截断    

    create mode owner  group :转储文件,使用指定的权限,所有者,所属组创建新的日志文件

      nocreate:不创建新的日志文件

    delaycompress:延迟压缩,通常和compress一起使用。准出的日志文件到下一次转储是才压缩

      nodelaycompress:覆盖delaycompress选项,转储时同时压缩

    errors address:转储时的错误发送到指定的有点地址

    ifempty:即使时空文件也转储,词尾默认选项

     noifempty:如果是空文件就不转储

    mail address:把转储时的日志文件发送到指定的邮件中

      nomail 转储时不发生日志文件

    olddir directory  :转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统

      noolddir :转储后的日志文件和当前日志文件放在一个目录下

    prerotate/endscript:在转储以前需要执行的命令,注意;两个关键字需要单独成行

    postrotate/endscript :在转储之后需要之心的命令,注意;两个关键字需要单独成行

    daily:指定转储周期,天

    weekly:指定转储周期,周

    monthly:指定转储周期,月

    rotate count :指定日志文件删除之前转储的次数,0表示没有备份,#表示指定保留#个备份

    tabooext [+] list:让logtotate不转储指定扩展名的文件,缺省的扩展名是:.rpm-orig,.rpmsave, v, 和 ~

    size size :当日志文件到达指定的大小时才转储,bytes(缺省)及KB或MB

    missingok:如果日志文件不存在,不提示错误,继续处理下一个

      nomissingok:如果日志不存在,提示错误,此为默认值

    sharedscripts:对每个转储日志运行prerotate和postrotate脚本,日志文件的绝对路径作为第一个参数传递给脚本。 这意味着单个脚本可以针对与多个文件匹配的日志文件条目多次运行(例如/ var / log                   / news /*.example)。 如果指定此项sharedscripts,则无论有多少个日志与通配符模式匹配,脚本都只会运行一次

      nosharedscripts 针对每一个转储的日志文件,都执行一次prerotate 和 postrotate脚本,此为默认值

    

范例1 :设置nginx的日志转储

   cat  /etc/logrotate.d/nginx   

      var/log/nginx/*.log {
         daily
         rotate 100
         missingok
         compress
         delaycompress
         notifempty
         create 644 ngnix nginx
         postrotate
         if [ -f /app/nginx/logs/nginx.pid ]; then
             kill -USR1 `cat /app/nginx/logs/nginx.pid`          #让nginx进程重读日志文件。USER1  相当于发送了respone之心
         fi
       endscript
            }

范例2:对指定的日志手动执行日志转储

   dd if=/dev/zero of=/var/log/test1.log bs=2M count=1

   dd if=/dev/zero of=/var/log/test2.log bs=2M count=1

  

  针对不同的日志创建转储配置文件

cat   /etc/logrotate.d/test1

  /var/log/test1.log{
      daily
      rotate 2
      compress
      delaycompress
      missingok
      size 1M
      notifempty
      create 640 bin nobody
      postrotate
      echo `date +%F_%T` >>/data/test1,log
      endscript
        }

 针对一个测试日志,手动执行日志转储

    logrotate  /etc/logrotate.d/test1

  

  或执行总的转储配置文件

    logrotate  /etc/logrotate.conf

  

       

  

 

  

      

        

        

      

              

    

    

    

    

          

      

    

      

    

    

      

         

      

    

      

        

          

        

      

    

     

  

    

一如IT深似海,从此妹子是路人; 只要学不死,就往死里学;
原文地址:https://www.cnblogs.com/ldlx/p/14505740.html