欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

日志管理

程序员文章站 2022-05-11 11:13:03
...

linux下日志的收集与分析是系统管理员应该进行的任务之一,日志文件可以帮助我们分析解决系统方面的错误,网络服务的问题。它就像一个记事本一样帮助我们记录了系统上何时何地何人做了什么操作。早期的linux系统采用syslog服务后续的linux发行版都采用rsyslog服务两个没有本质的区别,rsyslog相当于syslog的升级版。

1.常见的日志文件名

    /var/log/cron                             #系统定时任务日志信息
    /var/log/dmesg                            #系统开机时内核检测信息
    /var/log/lastlog                          #最近次登录系统信息
    /var/log/mail                             #系统邮件服务信息                  
    /var/log/messages                         #几乎所有的系统服务信息报错都在这个文件
    /var/log/secure                           #系统认证信息
    /var/log/wtmp,/var/log/faillog            #记录正确登录系统的账户信息(wtmp),不正确登录的账户信息(faillog)
    /var/log/httpd/*,/var/log/samba/*         #不同服务自己的日志文件
    等等


2.日志文件内容的一般格式

日期      主机名     服务名称        内容

日志管理
拿最后一条数据来看,该数据是说明在Aug 10 14:55:32时间由king这台主机的systemd服务发来消息说开启了apache服务

3.rsyslog的配置文件 /etc/rsyslog.conf

  • 语法格式
服务名称[.=!]信息等级   信息记录的文件名或者主机
"."代表比后面还要高的等级(含该等级)都被记录下来
".="代表所需要的等级就是后边接的等级,其他的不需要
".!"代表不等于,即除了该等级外其他等级都记录
#vim /etc/rsyslog.conf

日志管理

authpriv.*      /var/log/secure

这一行是说authpriv服务产生的所有等级的信息都记录到/var/log/secure这个文件当中。
例如:我想让message这个文件记录所有的信息,但是不想要记录cron,mail的信息该怎么写呢?

*.*;cron,mail.none              /var/log/messages
*.*;cron.none;mail.none         /var/log/messages

这两种方法均可以。

  • 日志类型
   auth                             ##与认证有关的日志
   authpriv                         ##ssh,ftp等登录信息的验证信息
   cron                             ##时间任务相关
   kern                             ##内核
   lpr                              ##打印
   mail                             ##邮件
   mark(syslog)–rsyslog             ##服务内部的信息,时间标识
   news                             ##新闻组
   user                             ##用户程序产生的相关信息
   uucp                             ##unix to unix copy, unix主机之间相关的通讯
   local 1~7                        ##自定义的日志设备
  • 日志等级
   debug                         ##有调式信息的,日志信息最多
   info                          ##般信息的日志,最常用
   notice                        ##最具有重要性的普通条件的信息
   warning                       ##警告级别
   err                           ##错误级别,阻止某个功能或者模块不能正常工作的信息
   crit                          ##严重级别,阻止整个系统或者整个软件不能正常工作的信息
   alert                         ##需要立刻修改的信息
   emerg                         ##内核崩溃等严重信息
   none                          ##什么都不记录

tips:级别从上到下级别越高日志信息月少。
4.配置示例

   1. 记录到普通文件或设备文件::
      *.*     /var/log/file.log            #文件绝对路径
      *.*     /dev/pts/0

   2. 发送给用户(需要在线才能收到)
      *.*   root
      *.*   root,kadefor,up01              ## 使用,号分隔多个用户
      *.*   *                              ## *号表示所有在线用户

   3. 忽略,丢弃
      local3.*   ~                         ## 忽略所有local3类型的所有级别的日志

   4. 执行脚本::
      local3.*    ^/tmp/a.sh               ## ^号后跟可执行脚本或程序的绝对路径
                                           ## 日志内容可以作为脚本的第一个参数.
                                           ##  可用来触发报警

测试: logger -p local3.info ‘test message ‘ ##logger 命令用于产生日志

5.日志同步

可以想象当我们需要对上百上前台的机器进行日志分析时我们还能在每台机器上去进行操作吗?当然不能,因此我们可以采用日志同步机制将所有的日志都发送到一台机器上进行分析。

日志接受方配置
vim /etc/rsyslog.conf

      15 $ModLoad imudp             ##日志接收插件(udp协议)
      16 $UDPServerRun 514          ##日志接收插件使用端口
      19 #$ModLoad imtcp            ##tcp协议
      20 #$InputTCPServerRun 514    ##端口
使用tcp/或者upd二者其一均可以

日志发送方配置
vim /etc/rsyslog.conf

*.*                @172.25.20.1    #采用udp协议将日志发送到20.1主机
                   #一个@代表使用udp协议发送,两个@符代表使用tcp协议发送

关闭防火墙 systemctl stop firewalld
重启服务 systemctl restart rsyslog.service
netstat -anuple |grep syslog

测试
      >/var/log/messages            ##两边都做,清空日志内容
      logger test info              ##日志发送方用logger命令产生日志信息
      tail -f /var/log/messages     ##日志接收方

日志管理
发送方产生日志
日志管理
我们在接受方看到了信息,成功了。

6.日志采集格式

$template MYFORMAT, "%timegenerated% %FROMHOST-IP% %syslogtag% %msg%\n"

%timegenerated%         ##显示日志时间
%FROMHOST-IP%           ##显示主机ip
%syslogtag%             ##日志记录目标
%msg%                   ##日志内容
$ActionfileDefaultTemplate MYFORMAT

*.info;mail.none;authpriv.none;cron.none                /var/log/messages;<<MYFORMAT>>


7.日志轮替

配置文件/etc/logrotate.conf
/etc/logrotate.d/

logrotate的主要功能就是将旧的日志文件移动成旧文件,并重新新建一个新的空文件来记录。

vim /etc/logrotate.conf
# 我们先看一下logrotate默认配置
weekly          #默认每周进行一次rotate工作
rotate 4        #默认保留4个文件
create          #由于日志文件被重命名,因此create一个新文件存储
dateext         #使用日期作为切分文件的前缀
#compress       #是否对日至文件进行压缩,默认不开启,但是如果日志文件过大的话可以考虑开启
include /etc/logrotate.d #将/etc/logrotate.d下面所有的配置项都读进来rotate

/var/log/wtmp {             #仅对/var/log/wtmp进行设置
    monthly                 #每月一次,替代每周
    create 0664 root utmp   #指定新文件权限所属用户和组
        minsize 1M          #文件容量超过1MB才进行rotate
    rotate 1                #仅保留一个文件
}

由这个文件我们知道/etc/logrotate.d/是由logrotate.conf所规划出来的目录,我们可以将所有的数据都写进logrotate.conf里边但是这样一来会使的这个文件过于复杂尤其是开启的服务较多的情况下就更为复杂了,况且每个服务都去改logrotate.conf文件也不太合理。所以独立出来一个目录,每个以rpm打包方式所新建服务的日志文件的轮替设置就可以独立成为一个文件,放到/etc/logrotate.d/下面,方便管理。

下面我们以/etc/logrotate.d/syslog这个轮替syslog服务的文件,来设置一下它的rotate。

vim /etc/logrotate.d/syslog
var/log/cron
/var/log/maillog
/var/log/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
}

logrotate的写法为:
文件名:被处理的日志文件名的绝对路径文件名写在前面,不同的文件名可以使用空格分隔开
参数:上述文件名进行rotate的参数都写进{}里边,可调用外部命令来进行额外的命令执行这个设置需要与sharedscripts和endscript一起使用才行。
prerotate:启动logrotate之前进行的命令
postrotate:启动logrotate之后进行的命令
轮替完毕取得syslog的pid后kill -HUP(等于kill -1)重启syslogd

如果有人恶意登陆了我们的系统,又不想留下证据,当然第一个删除的肯定是日志文件了。当然我们这里可以给文件添加隐藏属性设置日志文件只可以增加内容不可以删除和修改,但是这样的话我们在做日志轮替的时候,需要将旧文件重命名新建新文件来进行日志轮替,这个时候因为日志有隐藏属性chattr +a是不可以被修改的,那该怎么办呢?就利用prerotate和postrotate来进行轮替前后所要进行的操作

vim /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/var/log/messages
/var/log/secure
/var/log/spooler
{
    missingok
    sharedscripts
    prerotate
     /usr/bin/chattr  -a  /var/log/messages
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /usr/bin/chattr  +a  /var/log/messages
    endscript
}

这样在轮替之前去掉a属性轮替之后加上a属性这样就ok了。

8.测试logrotate的工作

设置好了之后我们测试一下:
logrotate [-vf] logfile
-v:启动显示模式,会显示logrotate的运行过程
-f:不论是否符合配置文件的参数,强制每个日志文件都进行rotate工作

执行 logrotate -vf /etc/logrotate.conf
可以看到日志的轮替信息并且没有报错证明设置没有错,ok!
在来看一下其他的日志切割的文件配置:
yum源的日志切割配置,vim /etc/logrotate.d/yum
/var/log/yum.log {
    missingok
    notifempty
    size 30k
    yearly
    create 0600 root root
}

这些服务的日志轮替都可根据需要自行在/etc/logrotate.d/下定义

tips:在查看日志文件(比如/var/log/messages)不可以用vim打开否则日志文件可能就不能记录信息了,因为syslog的日志文件一旦被编辑过就不能记录信息了,但是如果出现这样的问题可以手动重启一下服务就好了

9.日志分析

systemd-journald               ###日志分析进程
journalctl                     ###日志分析命令

journalctl -n 5                ##查看最近生成的5条日志
journalctl -p err              ##查看系统报错
journalctl --since --until     ###查看某个时间段生成的日志
journalctl -o verbose          ###查看日志能够使用的条件参数
journalctl  _UID=              ##进程uid
        _PID=                  ##进程id
        _GID=                  ##进程gid
        _HOSTNAME=             ##进程所在主机
        _SYSTEMD_UNIT=         ##服务名称
        _COMM=                 ##命令名称
默认情况下journalctl是无法看到关机之间产生的日志的,如果向检测到这类日志设置如下:
[root@serverX ~]#mkdir /var/log/journal
[root@serverX ~]#chown root:systemd-journal /var/log/journal
[root@serverX ~]#chmod 2755 /var/log/journal
Send the USR1 signal to the systemd-journald or reboot serverX.(USR1信号重新加载配置文件)
[root@serverX ~]#killall -USR1 systemd-journald
[root@serverX ~]#ls /var/log/journal/4513ad59a3b442ffa4b7ea88343fa55f
system.journal user-1000.journal