学会看日志文件处理问题

rsyslog是一个进程,是一个命令。管理日志的。–》系统日志记录器
它有一个配置文件:/etc/rsyslog.conf
自己创建日志时,要修改该配置文件。

日志的作用:

  • 用于记录系统、程序运行中发生的各种事件;
  • 通过阅读日志,有助于诊断和解决系统故障

日志文件的分类:

  • 内核及系统日志
    • 由系统服务rsyslog统一进行管理,日志格式基本相似
  • 用户日志
    • 记录系统用户登录及退出系统的相关信息
  • 程序日志
    • 由各种应用程序独立管理的日志文件,记录格式不统一

日志记录的一般格式:

时间标签 主机名 子系统名 消息字段

这里写图片描述

/var/log –》此目录下有很多的日志文件。
eg:tailf /var/log/cron –》监听cron命令的日志文件的末尾五行。

相应的应用程序独立进行管理的日志文件:

  • Web服务:/var/log/httpd/
    • access_log、error_log
  • 代理服务:/var/log/squid/
    • access.log、cache.log、squid.out、store.log
  • FTP服务:/var/log/xferlog
    等等

保存了用户登录、退出等信息的日志文件:

  • /var/log/lastlog:最近的用户登录事件
  • /var/log/wtmp:用户登录、注销及系统开、关机事件
  • /var/run/utmp:当前登录的每个用户的详细信息
  • /var/log/secure:与用户验证相关的安全性事件

用户登录分析:

  • who、w、user、last、ac、lastlog等命令,其中:
    • last 最近登录系统的用户;
    • lastlog 查看所有的用户的登录信息

日志分析工具:

  • 文本查看、grep过滤检索、Webmin管理套件中查看
  • awk、sed等文本过滤、格式化编辑工具
  • Webalizer、Awstats等专用日志分析工具
  • 其他市面上的商业日志分析工具等

syslog系统日志

syslog系统日志/etc/syslog.conf
由系统服务syslogd 统一管理:

  • 软件包:sysklogd-1.4.1-29.2
  • 主要程序:/sbin/klogd、/sbin/syslogd
  • 系统日志的配置文件:/etc/syslog.conf

这里写图片描述
(设备类别.日志级别 消息发送到的文件)
(像cron级别的日志文件,都写到/var/log/cron里面去。)
设备类别[连接符]日志级别:

  • . 记录大于等于后面的级别日志
  • .=只记录等于后面的级别日志
  • .!=只记录不等于后面的级别日志

消息发送位置:

  • 本地文件:通常就是文件的绝对路径
  • 打印机:例如 /dev/lp0 这个打印机装置
  • 用户名称:显示给用户
  • 远程主机:例如 @202.100.100.1
  • *:所有在线的人

系统日志保存位置:默认为/var/log目录下

主要日志文件介绍:

  • 内核及公共消息日志:/var/log/messages
  • 计划任务日志:/var/log/cron
  • 系统引导日志:/var/log/dmesg
  • 邮件系统日志:/var/log/maillog
  • 错误登录日志:/var/log/faillog

用户运行过的进程分析工具:

  • accton、lastcomm
  • sa:报告、清理和维护进程统计文件。

例子:

# accton /var/account/pacct --》启用统计
# lastcomm --user root    --》查看统计
lastcomm                root     pts/2      0.00 secs Thu Jul 28 21:22
lastcomm                root     pts/2      0.00 secs Thu Jul 28 21:22
accton            S     root     pts/2      0.00 secs Thu Jul 28 21:22
#accton    --》关闭统计

PS:
配置文件和程序的关系:
配置文件为程序传递参数,告诉程序要做什么,或者哪些做,哪些不做等信息。

日志消息的级别loglevel(记住!)

  • 0 EMERG(紧急):会导致主机系统不可用的情况 emergencies(零,最严重!!)
  • 1 ALERT(警告):必须马上采取措施解决的问题 alert
  • 2 CRIT(严重):比较严重的情况 critical
  • 3 ERR(错误):运行出现错误 error
  • 4 WARNING(提醒):可能会影响系统功能的事件
  • 5 NOTICE(注意):不会影响系统但值得注意
  • 6 INFO(信息):一般信息 information
  • 7 DEBUG(调试):程序或系统调试信息等
  • 8 none 没有优先级,不记录任何日志消息。

日志的设备类型:SyslogFacility

  • mail 邮件日志
  • cron 计划任务日志
  • authpriv 用户认证时产生的日志,如login命令、su命令。
  • local0–local7 由自定义程序使用。
  • news 网络新闻传输协议(nntp)产生的消息。
  • user 用户进程。
  • kern 系统内核消息。 kernel
  • daemon 某些守护

/var/log/下面的日志文件

  • messages —>默认情况下会记录所有的日志信息
  • secure —》安全认证相关的日志(ssh、useradd、passwd)
  • dmesg —》系统在启动的过程中加载了那些内核模块的信息,对一些硬件的识别加载的驱动等信息。kernel启动的过程中的信息
  • boot.log —》启动系统的过程之中出现的问题和正常的情况
  • maillog —》与发邮件相关的日志
  • lastlog —》记录最近登录过系统的用户的信息 last
  • cron —》计划任务
  • httpd —》独立的目录,记录httpd进程产生相关的日志
  • nginx —》独立的目录,记录nginx进程产生的相关的日志
  • mysqld.log —》mysql的日志
  • yum.log —》yum的日志
  • xferlog —-》ftp的日志
  • wtmp —》lastlog 查看所有的用户的登录信息

主动记录日志工具:logger:从命令行直接向系统日志文件写入一行信息

# ping -c2 172.16.70.7|logger -i(ping命令的pid号)-t (信息)"This is a test" -p authpriv.info(设备类型)
# tail -5 /var/log/secure
Jul 28 21:26:20 localhost This is a test[5623]: 64 bytes from 172.16.70.7: icmp_seq=2 ttl=64 time=0.178 ms
Jul 28 21:26:20 localhost This is a test[5623]: 
Jul 28 21:26:20 localhost This is a test[5623]: --- 172.16.70.7 ping statistics ---
Jul 28 21:26:20 localhost This is a test[5623]: 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
Jul 28 21:26:20 localhost This is a test[5623]: rtt min/avg/max/mdev = 0.166/0.172/0.178/0.006 ms

自己写脚本实现记录日志的功能

①修改 /etc/rsyslog.conf 文件
在#Save boot messages also to boot.log下面添加东西。
这里写图片描述
②刷新服务#service rsyslog restart
(刷新rsyslog服务后,就会发现在/var/log/下面出现了shell_monitor.log文件!)
(但是里面没有东西!)
③脚本的内容

#vim /var/log/monitor.sh
if service httpd status &>/dev/null
then
    echo "httpd is running"|logger  -t(信息) "httpd01_server"-p(设备类型号) local6.info        
(把echo的内容传递给logger)
else
    service httpd start &>/dev/null
    echo "httpd is star"| logger -t "httpd01_server" -p local6.info
fi

④#bash monitor.sh #执行脚本

#cat shell_monitor.log    #查看自己定义的日志文件

这里写图片描述
(发现里面有内容了!)(输出的时候,先显示-t的,再显示前面echo的内容)

日志轮转功能 logrotate

方便有效的管理日志,防止日志文件过大
日志轮转命令:logrotate
日志轮转主要配置文件:/etc/logrotate.conf

  • 配合一个配置文件,再加上计划任务,每天执行一次来达到循环的效果;
  • 好处:总保留最近最新的日志。

日志轮转主要配置文件:/etc/logrotate.conf (主配置文件)

# cat /etc/logrotate.conf |grep -v ^#|grep -v ^$ (删除注释行和空行)
--》查看日志轮转配置文件的内容
weekly    --》每周一次
rotate 4    --》保留4个备份的日志文件
create    --》创建新的空的日志文件
dateext    --》以日期做后缀
include /etc/logrotate.d    --》次要配置文件都存放在次目录下
/var/log/wtmp {    --》(单独针对wtmp的)
    monthly
    create 0664 root utmp    --》创建文件的时候,指定权限和属组、属主
    minsize 1M    --》大于1M才轮转日志
    rotate 1    --》保留1个备份日志
}
/var/log/btmp {    --》针对btmp的
    missingok    --》如果某文件没丢失,做什么
    monthly
    create 0600 root utmp
    rotate 1
}

PS:
没有单独的日志文件,在轮转的时候,参考/etc/logrotate.conf里面的配置。
同时如果有单独的日志文件,但是里面有些配置没有,也会参考主配置文件里的内容。—》单独配置文件里没有的配置项,参考主配置文件公共的配置项,建议写到主配置文件里,各个日志文件根据自身的特点,可以单独写一些配置。

日志轮转是怎么实现的?

日志轮转,依赖cron计划任务的每天执行的任务来完成轮转的。
系统把日志轮转的脚本logrotate放在/etc/cron.daily目录下

这里写图片描述

mysqld日志轮转文件

#vim /etc/logrotate.d/mysqld

vim /etc/rsyslog.conf

①local6.* /var/log/mysqld.log

  • 指定目录的日志设备类型是local6
  • 消息级别是,记录到/var/log/mysqld.log
  • 主要是告诉rsyslog进程去记录,至于mysqld进程是否采用rsyslog进程去记录日志,取决于mysqld进程。
  • mysqld进程也许没有采用rsyslog进程去帮助记录日志,它自己有独立的进程去实现日志的记录功能。

②#service rsyslog restart –》刷新服务,让配置文件生效。

#vim httpd
/var/log/httpd/*log {    --》指定轮转的日志文件,具体如何轮转,看大括号里的内容!
    missingok    --》日志文件不存在的时候,继续进行,不报错。
    notifempty    --》若日志文件为空,不轮转(not if empty)
    sharedscripts    --》配合prerotate和postrotate使用
    delaycompress    --》推迟压缩
    postrotate   --》轮转后执行下面的命令
           /sbin/service httpd reload > /dev/null 2>/dev/null || true
    endscript
}

多个日志文件使用一套轮转方法:

内核及公共消息日志:/var/log/messages
计划任务日志:/var/log/cron
邮件系统日志:/var/log/maillog
/var/log/secure
/var/log/spooler
{
sharedscripts
postrotate
/bin/kill -HUP cat /var/run/syslogd.pid 2>/dev/null 2>/dev/null || true
endscript
}

#
#########怎么让日志轮转(全)

①(添加设备类型、消息级别和消息发送目录到)/etc/rsyslog.conf
local6.info /var/log/liupeng
这里写图片描述
②刷新服务#service rsyslog restart
③日志脚本的内容:(脚本放在哪里都行)

#cat /lianxi/liupeng.sh
#!/bin/bash
if service mysqld status &>/dev/null
then
     echo "mysqld is running~"|logger -it "mysqld is started!" -p local6.info
  (这是输出的内容,也会写到日志)           (这是写到日志的内容)
else
     service httpd start &>/dev/null
     echo "mysqld is start"|logger -it "mysqld start for you!" -p local6.info
fi
#bash  /lianxi/liupeng.sh

(执行脚本后,会看到在/var/log/liupeng.log文件里面生成了内容。)

这里写图片描述

④进入/etc/logrorate目录,添加轮转日志配置文件liupeng:

#cd /etc/logrotate.d
#vim liupeng
/var/log/liupeng.log {    --》指定轮转的日志文件,具体如何轮转,看大括号里的内容! 
      rotate 4  --》保留4个
      weekly     --》每周轮转一次
      create    --》创建新的空的日志文件
      dateext    --》以日期做后缀
      missingok    --》日志文件不存在的时候,继续进行,不报错。
      notifempty    --》若日志文件为空,不轮转(not if empty)
      sharedscripts 
      prerorate
              轮转之前执行的命令
      endscript
}

⑤#logrotate -vf /etc/logrotate.conf (-f 强制轮转)
–》轮转自己写的日志。

PS:

  • man 5 logrotate.conf –》man 5 配置文件:看这个配置文件里的所有功能
  • prerorate:轮转前需要做的事情;
  • postrorate:轮转后需要做的事情。

练习:自己编写脚本实现记录日志功能:

1.监控httpd、yum、mysql服务,如果服务正在运行写入到日志文件,如果服务没有运行也写入到日志文件,然后启动服务
2.日志文件的名字自己定义.例如:/var/log/liupeng_monitor.log
3.让日志文件每个星期轮转一次,保留4个文件,在轮转之前将要删除的日志文件复制到/backup目录下。

[root@liupeng lianxi]# cat log_monitor.sh    --》主脚本
#!/bin/bash
###########配置rsyslog文件
if ! egrep "local6" /etc/rsyslog.conf &>/dev/null
then
    echo "local6.* /var/log/liupeng_monitor.log" >>/etc/rsyslog/conf
    echo "local6.alert  *" >>/etc/rsyslog.conf   --》如果接收到local6这种设备类型,消息级别为alert,给所有人发送(屏幕输出)!
    service rsyslog restart 
fi
###########监控功能
monitor(){   
if service $1 status &>/dev/null
then
            echo "$1_STATUS_CLEAR" | logger -it "$1_STATUS" -p local6.info
else
            echo "$1_NOT_RUNNING" | logger -it "$1_SERVICE_DOWN" -p local6.notice

            if ! service $1 restart &>/dev/null
            then
                echo "$1_CAN_NOT_RESTART" | logger -it "$1_SERVICE_ERROR" -p local6.alert
            else
                echo "$1_RUNNING_AGAIN" | logger -it "$1_STATUS_CLEAR_NOTICE" -p local6.notice
            fi
fi
}
###########本地yum是否存在
local_yum_monitor(){
yum clean all &>/dev/null
if yum list &>/dev/null
then
     echo "YUM_STATUS_CLEAR" | logger -it "YUM_STATUS" -p local6.info
else
    echo "YUM_STATUS_ERROR" | logger -it "YUM_STATUS_WRONG" -p local6.alert
    bash yum_install.sh
fi
}
###############日志轮转
my_lograte(){    --》日志轮转
[ -d /backup ]||mkdir /backup
if ! [ -f /etc/logrotat.d/monitor ]
then
    echo 
"/var/log/liupeng_monitor.log {
    rotate 4
    weekly
    dateext
        create
    prerotate
            /bin/cp -n /var/log/liupeng_monitor.log-* /backup/    
        --》-n选项:若存在,则不再覆盖!
    endscript
}" >/etc/logrotate.d/monitor
fi
}
if [ -f ./monitor.conf ]
then
    conf=(`cat ./monitor.conf |egrep -v "#|^$|^yum" `)
    for i in ${conf[@]}
    do
        monitor $i &
    done
    if cat ./monitor.conf|egrep "^yum_check=1$" &>/dev/null
    then
        local_yum_monitor
    fi        
else
    echo -e "#[SERVICE_NAME]
httpd
mysqld
#[YUM]
yum_check=1" > monitor.conf
fi
my_lograte
[root@liupeng lianxi]# cat monitor.conf    --》供选择的服务
#[SERVICE_NAME]
httpd
mysqld
#[YUM]
yum_check=1
[root@liupeng lianxi]# cat yum_install.sh    --》安装yum服务
#!/bin/bash
#local_yum_install
repos="/etc/yum.repos.d"

local_yum(){

        cat >$repos/local.repo <<EOF
[local_yum]
name=local_yum
baseurl=file:///mnt
gpgcheck=0
enabled=1
EOF
        read -p "请确认光盘已经放入光驱中,按任意建继续 ..."
        mount /dev/cdrom /mnt &>/dev/null
        case $? in
        0)
                yum clean all &>/dev/null
                yum update && echo "本地yum源配置成功!"
                ;;
        32)
                yum clean all &>/dev/null
                echo "光盘已经挂载!"
                ;;
        *)
                echo "请放入光盘!"
                ;;
        esac
}
if [ -d $repos/bak ]
then
        if [ -f $repos/local.repo ]
        then
                rm -f $repos/local.repo
                local_yum
        else
                local_yum
        fi
else
        mkdir $repos/bak
        mv $repos/*.repo $repos/bak
        local_yum
fi
原文地址:https://www.cnblogs.com/lpeng94/p/12546500.html