linux学习45-日志管理

日志管理

1 日志介绍

  • 日志:

    1. 记录内容:
      时间,地点,人物,事件
    2. 日志级别:
      事件的关键性程度,Loglevel
  • 事件记录格式:
    日期时间 主机进程[pid]: 事件内容

    [root@hai7-8 ~]$cat /var/log/messages
    Oct 25 20:34:27 hai7-8 dhclient[53598]: DHCPACK from 172.20.0.1 (xid=0x12fbdb30)
    |    日期时间   | 主机名 |    进程编号    |         事件内容          
    
  • C/S架构
    通过TCP或UDP协议的服务完成日志记录传送,将分布在不同主机的日志实现集中管理

  • CentOS6和CentOS7的日志管理程序rsyslog

    1. 查看版本信息
      [root@hai7-8 $]$rpm -qi rsyslog
      
    2. 特性
      1. 多线程
      2. 支持UDP, TCP, SSL, TLS, RELP
      3. MySQL, PGSQL, Oracle实现日志存储
      4. 强大的过滤器,可实现过滤记录日志信息中任意部分
      5. 自定义输出格式
    3. rsyslog术语(见man logger)
      1. facility:设施,从功能或程序上对日志进行归类
        auth, authpriv, cron, daemon,ftp,kern, lpr, mail, news, security(auth), user, uucp, local0-local7, syslog
      2. Priority:优先级别,从低到高排序
        debug, info, notice, warn(warning), err(error), crit(critical), alert, emerg(panic)
        参看帮助:man 3 syslog

2 日志配置

  • 程序包:rsyslog

  • rsyslog包内主要文件

    1. 主程序
      /usr/sbin/rsyslogd
    2. 配置文件
      /etc/rsyslog.conf,/etc/rsyslog.d/*.conf
    3. 库文件(各种模块)
      /lib64/rsyslog/*.so
  • 端口号:udp514和tcp514

  • 配置文件格式:由三部分组成

    1. MODULES:相关模块配置,通常不需要修改
    2. GLOBAL DIRECTIVES:全局配置,通常不需要修改
    3. RULES:日志记录相关的规则配置
      [root@hai7-8 ~]$vim /etc/rsyslog.conf
      #### RULES ####
      '主日志,`*.info` 为一个组合,*表示哪个设施发生的事,info表示级别比info高的级别都要记录,中间以点分隔,用来分隔多个组合'
      *.info;mail.none;authpriv.none;cron.none       /var/log/messages
      '身份验证日志'
      authpriv.*                                     /var/log/secure   
      '邮件日志,-表示异步写入'
      mail.*                                         -/var/log/maillog   
      '计划任务记录'
      cron.*                                         /var/log/cron   
      '当发生emerg级别以上级别的事件,将给所有登录的用户发消息'
      *.emerg                                        :omusrmsg:*    
      'uucp和news类别当发生crit级别事件时,放入/var/log/spooler文件中'
      uucp,news.crit                                 /var/log/spooler  
      '自定义级别7,记录内核的信息放在/var/log/boot.log'
      local7.*                                       /var/log/boot.log     
      |facility.Priority|                           |日志存放地点|
      
  • RULES配置格式
    facility.priority; facility.priority… target

    1. facility
      *: 所有的facility
      facility1,facility2,facility3,...:指定的facility列表
    2. priority
      *:所有级别
      none:没有级别,即不记录
      PRIORITY:指定级别(含)以上的所有级别
      =PRIORITY:仅记录指定级别的日志信息
    3. target
      文件路径:通常在/var/log/,文件路径前的-表示异步写入
      用户:将日志事件通知给指定的用户,* 表示登录的所有用户,与权限有关系,普通用户无法得到通知
      [root@hai7-6 ~]$vim /etc/rsyslog.conf
      #### RULES ####
      local6.*              root
      
  • 管道:| COMMAND,转发给其它命令处理

  • 日志服务器:@host,把日志送往至指定的远程服务器记录

    1. 在远程服务器上打开udp的514端口
      [root@hai6  ~]$vim /etc/rsyslog.conf
      $ModLoad imudp           <==启用udp接口
      $UDPServerRun 514
      #$ModLoad imtcp          <==tcp接口,使用哪种协议就启用哪一种      
      #$InputTCPServerRun 514
      
    2. 以ssh服务为例,ssh默认记录的日志为authpriv类型,在本地服务器上修改日志配置文件
      [root@hai7-6 ~]$vim /etc/rsyslog.conf
      authpriv.*            /var/log/secure   <==注释掉此项将不往本机发送   
      authpriv.*            @192.168.50.106   <==udp协议,指定为远程主机ip
      authpriv.*            @@192.168.50.106  <==tcp协议指定为远程主机ip格式,2个@
      
  • 自定义日志文件存放地点
    如果软件本身不支持rsyslog日志,需要基于rsyslog的API接口来开发才可以
    以ssh为例

    1. 在rsyslog配置文件RULES部分,增加一行自定义规则
      [root@hai7-6 ~]$vim /etc/rsyslog.conf
      #### RULES ####
      local6.*            /var/log/sshtest.log    <==增加行
      
    2. 修改ssh配置文件中定义日志记录项
      [root@hai7-6 ~]$vim /etc/ssh/sshd_config
      #SyslogFacility AUTHPRIV   <==原定义项,注释掉
      SyslogFacility local6      <==自定义项
      
    3. 重启ssh及日志服务
      [root@hai7-6 ~]$systemctl restart sshd
      [root@hai7-6 ~]$systemctl restart rsyslog
      
  • 测试工具:‘logger’
    生成日志信息

    1. '生成一个新日志信息'
    [root@hai7-6 ~]$logger "This is a log"
    2. '/var/log/messages记录了大部分应用程序以及操作系统发生的事'
    [root@hai7-6 ~]$tail -f /var/log/messages 
    Oct 26 07:53:13 hai7-6 root: This is a log   <==触发生成的日志信息
    
  • 其他日志

    1. /var/log/secure
      系统安装日志,文本格式,应周期性分析
    2. /var/log/btmp
      当前系统上,用户的失败尝试登录相关的日志信息,二进制格式,lastb命令进行查看
      [root@hai7-6 ~]$lastb
      root     ssh:notty    192.168.50.97    Fri Oct 26 09:19 - 09:19  (00:00)
      
    3. /var/log/wtmp
      当前系统上,用户正常登录系统的相关日志信息,二进制格式,last命令可以查看
      [root@hai7-6 ~]$last
      reboot   system boot  3.10.0-862.el7.x Wed Sep 19 16:23 - 09:19 (36+16:56)  
      (36+16:56),表示运行了多久,在什么时间登录
      
    4. /var/log/lastlog
      每一个用户最近一次的登录信息,二进制格式,lastlog命令可以查看
      [root@hai7-6 ~]$lastlog
      gdm    :0     Tue Sep 25 07:45:51 +0800 2018   <==此账号为图形界面部署时用到,变相说明系统安装时间
      
    5. /var/log/dmesg
      系统引导过程中的日志信息,文本格式,使用dmesg命令查看,或者cat文件
    6. /var/log/messages
      系统中大部分的信息
    7. /var/log/anaconda :
      anaconda的日志,安装系统过程日志;centos6中此日志在/var/log目录下,anaconda开头的文件

3 日志管理journalctl(centos7)

Systemd统一管理所有Unit 的启动日志,带来的好处就是,可以只用journalctl一个命令,查看所有日志(内核日志和应用日志)。日志的配置文件/etc/systemd/journald.conf

  • journalctl用法
    1. 查看所有日志(默认情况下,只保存本次启动的日志)
      journalctl
    2. 查看内核日志(不显示应用日志)
      journalctl -k
    3. 查看系统本次启动的日志
      journalctl -b
      journalctl -b -0
    4. 查看上一次启动的日志(需更改设置)
      journalctl -b -1
    5. 查看指定时间的日志
      1. journalctl–since=“2017-10-30 18:10:30”
      2. journalctl–since “20 min ago”
      3. journalctl–since yesterday
      4. journalctl–since “2017-01-10” --until “2017-01-11 03:00”
      5. journalctl–since 09:00 --until “1 hour ago”
    6. 显示尾部的最新10行日志
      journalctl -n
    7. 显示尾部指定行数的日志
      journalctl -n 20
    8. 实时滚动显示最新日志
      journalctl -f
    9. 查看指定服务的日志
      journalctl /usr/lib/systemd/systemd
    10. 查看指定进程的日志
      journalctl_PID=1
    11. 查看某个路径的脚本的日志
      journalctl /usr/bin/bash
    12. 查看指定用户的日志
      journalctl_UID=33 --since today
    13. 查看某个Unit 的日志
      1. journalctl -u nginx.service
      2. journalctl -u nginx.service --since today
    14. 实时滚动显示某个Unit 的最新日志
      journalctl -u nginx.service -f
    15. 合并显示多个Unit 的日志
      journalctl -u nginx.service -u php-fpm.service --since today
  1. 日志管理journalctl
    1. 查看指定优先级(及其以上级别)的日志,共有8级
      0: emerg
      1: alert
      2: crit
      3: err
      4: warning
      5: notice
      6: info
      7: debug
    2. 示例
      journalctl -p err -b
      journalctl -p 3 -b
  2. 日志输出格式
    1. 默认分页输出,–no-pager 改为正常的标准输出
      journalctl --no-pager
    2. 以JSON 格式(单行)输出
      journalctl-b -u nginx.service -o json
    3. 以JSON 格式(多行)输出,可读性更好
      journalctl-b -u nginx.serviceqq -o json-pretty
    4. 显示日志占据的硬盘空间
      journalctl --disk-usage
    5. 指定日志文件占据的最大空间
      journalctl --vacuum-size=1G
    6. 指定日志文件保存多久
      journalctl --vacuum-time=1years

4. 将日志记录于MySQL中

  • 需要安装的程序包
    rsyslog-mysql
  • 搭建过程
    1. rsyslog服务器上执行的操作
      1. 安装模块mysql模块相关的程序包
        [root@hai7-7 ~]$yum install rsyslog-mysql
        
      2. 查看程序包包含文件
        [root@hai7-7 ~]$rpm -ql rsyslog-mysql
        /usr/lib64/rsyslog/ommysql.so
        'rsyslog所有模块都放在/usr/lib64/rsyslog/中'  
        /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql  
        'sql脚本,将在mysql中建立的数据库表等,需要导入mysq'
        
      3. sql脚本拷贝给数据库服务器,建立rsyslog服务器的专用数据库
        [root@hai7-7 ~]$scp /usr/share/doc/rsyslog-8.24.0/mysql-createDB.sql  192.168.50.97:/data
        
      4. 修改rsyslog配置文件,加载支持mysql的模块
        [root@hai7-7 ~]$vim /etc/rsyslog.conf
        #### MODULES ####      <==在模块部分加入新增模块 
        # Provides TCP syslog reception
        1. $ModLoad imtcp         <==启用tcp接口,将注释去掉
           $InputTCPServerRun 514
        2. $ModLoad  ommysql      <==$ModLoad表示加载,后面跟模块名称不需要.so后缀,/usr/lib64/rsyslog/下的模块不需要写路径
        #### RULES ####           <==在规则部分定义模块转发功能
        3. *.info;mail.none;authpriv.none;cron.none        :ommysql:192.168.50.107,Syslog, syslog,centos
        |           facility.priority           |      |  模块名 |    数据库ip,  |数据库名,|账号,|数据库密码| 
        
    2. 数据库服务器
      1. 在数据库服务器上为rsyslog创建数据库及表
        [root@hai7-6 data]$mysql < mysql-createDB.sql
        
      2. 在数据库为rsyslog服务器创建账号
        [root@hai7-6 data]$mysql -e "GRANT ALL ON Syslog.* TO syslog@'192.168.50.97' IDENTIFIED BY 'centos'" 
        
    3. 测试,使用logger命令生成日志

5. web页面展示数据库日志(loganalyzer)

  • 搭建环境
    1. lamp或者lnmp架构
    2. 以模块方式搭建
    3. 额外需要的程序 php-gd,增加动态绘图功能
  • 搭建过程
    1. 在rsyslog服务器上准备amp或nmp组合
      [root@hai7-8 ~]$yum install httpd php php-mysql  php-gd  -y   
      
    2. 安装LogAnalyzer,官网获取程序包,解压
      [root@hai7-8 ~]$tar xvf loganalyzer-4.1.6.tar.gz 
      
    3. 将解压后生成的src目录,拷贝到httpd页面文件目录
      [root@hai7-8 ~]$cp -ar loganalyzer-4.1.6/src/ /var/www/html/log
      
    4. 建立配置文件
      1. '进入拷贝目录'
      [root@hai7-8 ~]$cd /var/www/html/log
      2. '创建配置文件'
      [root@hai7-8 ~]$touch config.php
      3. '授予权限,这一步必须有,不然会报错,官方脚本要求为666,也可以手动授权写权限'
      [root@hai7-8 /var/www/html/log]$chmod 666 config.php  
      根据环境可以授权写权限
      [root@hai7-8 /var/www/html/log]$setfacl -m u:apache:w config.php
      
    5. 登录httpd页面(http://192.168.50.110/log/ ),此实验使用主机为192.168.50.110,前3步选择默认,下一步就可以,第3步后直接跳转到第7步,设置如下图
      在这里插入图片描述
    6. 基于安全考虑,如果设置权限为666,配置成功后要将权限修改为644
      [root@hai7-8 ~]$cd /var/www/html/log
      [root@hai7-8 log]$chmod644 config.php
      

6. Logrotate日志存储

logrotate 程序是一个日志文件管理工具。用来把旧的日志文件删除,并创建新的日志文件,称为日志转储或滚动。可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过cron 程序来执行

  • 配置文件

    1. 主配置文件:/etc/logrotate.conf
    2. 子配置文件:/etc/logrotate.d/
      /var/log/wtmp {
          monthly      			<==每个月生成一个新文件
          create 0664 root utmp 	<==为旧文件取一个新名字,给予权限664
          minsize 1M    			<==最小达到1M,采取创建新的日志文件
          rotate 1    			<==保留1个版本
      }
      
  • 主要参数如下

    参数 描述
    compress 通过gzip 压缩转储以后的日志
    nocompress 不需要压缩时,用这个参数
    copytruncate 用于还在打开中的日志文件,把当前日志备份并截断
    nocopytruncate 备份日志文件但是不截断
    create mode owner group 转储文件,使用指定的文件模式创建新的日志文件
    nocreate 不建立新的日志文件
    delaycompress和compress 一起使用时,转储的日志文件到下一次转储时才压缩
    nodelaycompress 覆盖delaycompress选项,转储并压缩
    errors address 专储时的错误信息发送到指定的Email 地址
    ifempty 即使是空文件也转储,是缺省选项
    notifempty 如果是空文件的话,不转储
    mail address 把转储的日志文件发送到指定的E-mail 地址
    nomail 转储时不发送日志文件
    olddirdirectory 转储后的日志文件放入指定的目录,必须和当前日志文件在同一个文件系统
    noolddir 转储后的日志文件和当前日志文件放在同一个目录下
    prerotate/endscript 在转储以前需要执行的命令可以放入这个对,这两个关键字必须单独成行
    postrotate/endscript 在转储以后需要执行的命令可以放入这个对,这两个关键字必须单独成行
    daily 指定转储周期为每天
    weekly 指定转储周期为每周
    monthly 指定转储周期为每月
    size 大小指定日志超过多大时,就执行日志转储
    rotate count 指定日志文件删除之前转储的次数,0 指没有备份,5 指保留5 个备份
    Missingok 如果日志不存在,提示错误
    Nomissingok 如果日志不存在,继续下一次日志,不提示错误

猜你喜欢

转载自blog.csdn.net/free050463/article/details/83386441