zoukankan      html  css  js  c++  java
  • 日志管理——rsyslog、logrotate

    一、 rsyslog介绍

    rsyslog提供高性能、强大的安全特性和模块化设计。能够接受来自各种来源的输入,转换他们,并将结果输出到不同的目的地。性能通常被认为是“令人震惊的”!

    二、系统日志文件介绍

    日志格式:文本日志/二进制日志/数据库日志
    
    常见日志文件:
    /var/log/boot.log     系统引导日志,记录开机启动信息
    /var/log/dmesg        核心的启动日志(硬件相关)
    /var/log/messages     系统的日志文件
    /var/log/maillog      邮件服务的日志
    /var/log/xferlog      ftp服务的日志
    /var/log/secure       网络连接及系统登录的安全信息
    /var/log/cron         定时任务的日志
    /var/log/wtmp         记录所有的登入和登出(last -f 查看)       
    /var/log/btmp         记录失败的登入尝试(last -f 查看)
    

    三、日志级别

    日志信息分为以下级别,从上到下依次降低
          none        –什么都不记录
    0     emerg       –内核崩溃等严重信息
    1     alert       –需要立刻修改的信息
    2     crit        –严重级别,阻止整个系统或者整个软件不能正常工作的信息
    3     err         –错误级别,阻止某个功能或者模块不能正常工作的信息
    4     warning     –警告级别
    5     notice      –最具有重要性的普通条件的信息
    6     info        –一般信息的日志,最常用
    7     debug       –有调式信息的,日志信息最多
    

    四、日志配置

    4.1 日志定义相关符号

    rsyslog`服务的配置文件:`/etc/rsyslog.conf
    配置文件中常见的表示符号:
    .      用来分隔服务和日志级别
    *      任何服务或者任何级别
    =      有等号表示等于某一级别,没有等号表示
    !      排除操作,前面有相同服务的表达式,这个操作才有意义
    ;      用于分隔不同的 服务.级别 组合
    ,      用于分隔不同的服务
    -      用于指定目标文件是,代表异步写入
    

    4.2 了解配置文件

    *.info;mail.none;authpriv.none;cron.none                /var/log/messages
    # 所有服务产生的日志,除了mail/验证/任务计划相关日志都记录到/var/log/messages
    authpriv.*                                              /var/log/secure
    # 记录所有跟验证相关日志
    mail.*                                                  -/var/log/maillog
    # 记录所有跟邮件相关的日志信息
    cron.*                                                  /var/log/cron
    # 记录跟任务计划相关的日志
    *.emerg                                                 :omusrmsg:*
    # 把所有级别为emerg的信息发送给所有登录到系统上的用户
    uucp,news.crit                                          /var/log/spooler
    local7.*                                                /var/log/boot.log
    # 记录所有跟启动相关的日志信息
    

    特别说明:

    man rsyslog.conf      查看rsyslog配置的帮助信息
    
    log facility          设备 设施:用来记录一种日志的日志设备
    
    deamon
    auth
    authpriv
    user
    news
    uucp
    ftp
    local0-7
    

    五、实战演练

    5.1 本地日志管理

    5.1.1 将本地ssh服务的日志记录到/var/log/sshd.log里

    思路:

    1. 通过修改配置文件完成
    2. 重启rsyslog服务
    3. 测试验证

    步骤:

    $ vim /etc/ssh/sshd_config
    # 定义ssh服务的日志存储设备为local1
    SyslogFacility local1
    $ vim /etc/rsyslog.conf 
    *.info;mail.none;authpriv.none;cron.none;local1.none                /var/log/messages
    authpriv.*;local1.none                                              /var/log/secure
    # 定义ssh服务的local1设备载体不再向以上文件记录日志信息(依然会记录,不过不是详细信息)
    local1.*                                                /var/log/sshd.log
    # 定义local1设备日志文件存储在/var/log/sshd.log中
    $ systemctl restart sshd 
    $ systemctl restart rsyslog
    # 找另一台服务登录测试
    $ tail /var/log/sshd.log 
    Jul 12 18:43:11 lzj-01 sshd[19259]: Accepted password for root from 192.168.1.2 port 36210 ssh2
    Jul 12 18:44:04 lzj-01 sshd[19259]: Received disconnect from 192.168.1.2: 11: disconnected by user
    

    5.2 远程管理日志

    5.2.1 将ssh服务的日志远程记录到日志管理服务器上保存。

    环境:

    192.168.1.1 log-server
    
    192.168.1.2 ssh-server
    
    192.168.1.3 client
    

    思路:

    1. 在ssh-server上将ssh服务单独记录
    2. 在ssh-server上通过修改/etc/rsyslog.conf文件将本地ssh服务日志远程传送到log-server服务器上;
    3. 在log-server上打开514端口等待客户传送日志
    4. 测试验证
    log-server服务器
    $ vim /etc/rsyslog.conf 
    $ModLoad imudp
    $UDPServerRun 514            # UDP协议 514端口
    $ModLoad imtcp
    $InputTCPServerRun 514       # TCP协议 514端口
    $ systemctl restart rsyslog
    $ netstat -nltup | grep 514
    tcp        0      0 0.0.0.0:514             0.0.0.0:*               LISTEN      19386/rsyslogd      
    tcp6       0      0 :::514                  :::*                    LISTEN      19386/rsyslogd      
    udp        0      0 0.0.0.0:514             0.0.0.0:*                           19386/rsyslogd      
    udp6       0      0 :::514                  :::*                                19386/rsyslogd   
    
    ssh-server服务器
    $ vim /etc/ssh/sshd_config
    SyslogFacility local0
    *.info;mail.none;authpriv.none;cron.none;local0.none                /var/log/messages
    authpriv.*;local0.none                                              /var/log/secure
    local0.* @@192.168.1.1:514
    # 远程发送到192.168.1.1服务器上,@表示UDP   @@表示TCP
    $ systemctl restart sshd && systemctl restart rsyslog
    
    client测试:
    $ ssh root@192.168.1.2
    
    log-server查看//var/log/messages日志
    $ tailf /var/log/messages
    Jul 12 19:36:57 ssh-server sshd[17203]: Accepted password for root from 192.168.1.3 port 60279 ssh2
    

    如果日志服务器管理多台服务器,按照上面的方法就不好区分了,解决办法(在日志管理端优化)如下:

    log-server服务器通过定义模板来保存不同的日志文件
    $ vim /etc/rsyslog.conf 
    # 在文件末尾加入以下内容:
    $template DynFile,"/var/log/system-%HOSTNAME%.log"
    # 定义一个模板DynFile,将日志保存在/var/log里,文件为system-客户端的主机名.log
    local0.* ?DynFile
    # 动态调用定义的模板
    $ systemctl restart rsyslog
    
    client再次测试:
    $ ssh root@192.168.1.2
    
    log-server验证:
    $ cat /var/log/system-ssh-server.log
    Jul 12 19:43:26 ssh-server sshd[17256]: Accepted password for root from 192.168.1.3 port 60282 ssh2
    

    六、日志轮转——logrotate

    为什么要进行日志轮转?

    • 避免日志文件过大,占用系统空间;
    • 方便日志查看;
    • 丢弃系统中最旧的日志文件,节省空间
    • 日志轮转的程序时logrotate
    • logrotate本身不是系统守护进程,它是通过计划任务crond每天执行

    6.1 了解logrotate相关配置文件

    $ egrep -v '^$|^#' /etc/logrotate.conf 
    weekly    # 默认每一周执行一次rotate轮转工作
    rotate 4  # 保留多少个日志文件(轮转几次).默认保留四个.就是指定日志文件删除之前轮转的次数,0 指没有备份
    create    # 自动创建新的日志文件,新的日志文件具有和原来的文件相同的权限;因为日志被改名,因此要创建一个新的来继续存储之前的日志
    dateext  # 这个参数很重要!就是切割后的日志文件以当前日期为格式结尾,如xxx.log-20131216这样,如果注释掉,切割出来是按数字递增,即前面说的xxx.log-1这种格式
    include /etc/logrotate.d   # 导入/etc/logrotate.d/ 目录中的各个应用配置
    /var/log/wtmp {   # 仅针对/var/log/wtmp 所设定的参数
        monthly       # 每月一次切割,取代默认的一周
        create 0664 root utmp    # 指定新建的日志文件权限以及所属用户和组
        minsize 1M             # 文件大小超过1M 后才会切割
        rotate 1            # 只保留一个日志
    }
    /var/log/btmp {
        missingok
        monthly
        create 0600 root utmp
        rotate 1
    }
    

    logrotate中其他可配置参数,具体如下:

    compress				  # 通过gzip 压缩转储以后的日志
    nocompress 				  # 不做gzip压缩处理
    copytruncate 			  # 用于还在打开中的日志文件,把当前日志备份并截断;是先拷贝再清空的方式,拷贝和清空之间有一个时间差,可能会丢失部分日志数据。
    nocopytruncate 			  # 备份日志文件不过不截断
    create mode owner group   # 轮转时指定创建新文件的属性,如create 0777 nobody nobody
    nocreate 				  # 不建立新的日志文件
    delaycompress 			  # 和compress 一起使用时,转储的日志文件到下一次转储时才压缩
    nodelaycompress           # 覆盖delaycompress 选项,转储同时压缩。
    missingok 				  # 如果日志丢失,不报错继续滚动下一个日志
    errors address            # 专储时的错误信息发送到指定的Email 地址
    ifempty 				  # 即使日志文件为空文件也做轮转,这个是logrotate的缺省选项。
    notifempty 				  # 当日志文件为空时,不进行轮转
    mail address 			  # 把转储的日志文件发送到指定的E-mail 地址
    nomail 					  # 转储时不发送日志文件
    olddir directory 		  # 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
    noolddir                  # 转储后的日志文件和当前日志文件放在同一个目录下
    sharedscripts 			  # 运行postrotate脚本,作用是在所有日志都轮转后统一执行一次脚本。如果没有配置这个,那么每个日志轮转后都会执行一次脚本
    prerotate 				  # 在logrotate转储之前需要执行的指令,例如修改文件的属性等动作;必须独立成行
    postrotate 				  # 在logrotate转储之后需要执行的指令,例如重新启动(kill -HUP) 某个服务!必须独立成行
    daily                     # 指定转储周期为每天
    weekly 					  # 指定转储周期为每周
    monthly 				  # 指定转储周期为每月
    rotate count 			  # 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
    dateext 				  # 使用当期日期作为命名格式
    dateformat .%s 			  # 配合dateext使用,紧跟在下一行出现,定义文件切割后的文件名,必须配合dateext使用,只支持%Y %m %d %s 这四个参数
    size(或minsize) log-size   # 当日志文件到达指定的大小时才转储,log-size能指定bytes(缺省)及KB (sizek)或MB(sizem).
    # 当日志文件>= log-size 的时候就转储。 以下为合法格式:(其他格式的单位大小写没有试过)
    # size = 5 或size 5 (>= 5 个字节就转储)
    # size = 100k 或size 100k
    # size = 100M 或size 100M
    

    logrotate指令选项:

    -d, --debug :debug模式,测试配置文件是否有错误。
    -f, --force :强制转储文件。
    -m, --mail=command :压缩日志后,发送日志到指定邮箱。
    -s, --state=statefile :使用指定的状态文件。
    -v, --verbose :显示转储过程。
    

    6.2 ssh日志轮转

    ssh服务日志现在是步骤5.1的状态!

    需求:

    • 每天进行轮转,保留5天的日志文件
    • 日志文件大小大于5M进行轮转
    $ find /var/log/ -type f | xargs rm -f
    $ find /var/log/ -type f -exec rm -f {} ;
    $ find /var/log/ -type f -delete
    # 将/var/log/目录下的所有文件进行删除(三种方法任选其一),方便查看而已
    $ systemctl restart rsyslog     # 产生logrotate服务定义的日志文件
    $ logrotate -f /etc/logrotate.conf     # 轮转logrotate定义的日志文件
    $ vim /etc/logrotate.d/sshd
    /var/log/sshd.log {
      daily
      compress
      missingok
      rotate 5
      size 5M
    }
    $ logrotate -f /etc/logrotate.conf    # 轮询一次
    # 验证
    $ ls /var/log/sshd.log*
    /var/log/sshd.log  /var/log/sshd.log-20200712.gz
    

    6.3 nginx日志的日志配置示例参考:

    $ vim /etc/logrotate.d/nginx
    /var/log/weblog/*.log {        //日志存放路径
        daily  //指定转储周期为每天
        compress  //通过gzip 压缩转储以后的日志
        rotate 7  //保存7天的日志
        missingok  //如果日志文件丢失,不要显示错误
        notifempty  //当日志文件为空时,不进行轮转
        dateext  //使用当期日期作为命名格式,exp: nginx_access.log-20190120
        sharedscripts  //运行postrotate脚本
        postrotate  //执行的指令
                if [ -f /run/nginx.pid ]; then
                        kill -USR1 `cat /run/nginx.pid`
                fi
        endscript  //结束指令
    }
    

    6.4 解决logrotate无法自动轮询日志的方法

    现象说明:
    使用logrotate轮询nginx日志,配置好之后,发现nginx日志连续两天没被切割,检查后确定配置文件一切正常,这是为什么呢??
    强行启动记录文件维护操作,纵使logrotate指令认为没有需要,应该有可能是logroate认为nginx日志太小,不进行轮询。
    故需要强制轮询,即在/etc/cron.daily/logrotate脚本中将-t 参数替换成-f 参数

    $ vim /etc/cron.daily/logrotate 
    #!/bin/sh
    /usr/sbin/logrotate /etc/logrotate.conf
    EXITVALUE=$?
    if [ $EXITVALUE != 0 ]; then
        /usr/bin/logger -f logrotate "ALERT exited abnormally with [$EXITVALUE]"
    fi
    exit 0
    
    $ systemctl restart crond
    # 重启cron服务
    
    *************** 当你发现自己的才华撑不起野心时,就请安静下来学习吧!***************
  • 相关阅读:
    03-树3 Tree Traversals Again
    Utuntu下Xshell使用+vi使用
    CSDN总结的面试中的十大算法
    EDM(邮件营销)
    腾讯CDC谈扁平化设计
    Graph Search图谱搜索
    LBS 与 GPS 定位之间的区别
    中间件的理解
    夏梦竹谈Hive vs. HBase的区别
    维基百科上—数据仓库、数据挖掘、OLAP三者之间的区别
  • 原文地址:https://www.cnblogs.com/lvzhenjiang/p/14411188.html
Copyright © 2011-2022 走看看