Linux日志管理

一,简介

rsyslog 系统日志管理:关心问题:哪类程序---》产生的什么日志----》放到什么地方

logrotate日志轮转:将大量的日志,分割管理,删除旧日志。

系统信息可视化:将来采集 -----> 分析

二, 日志处理

1,处理日志的进程

1.1  第一类

rsyslogd: 系统专职日志程序。将绝大部分日志记录,
和系统操作有关,安全,认证sshd,su,计划任务at,cron..

1.2 第二类

httpd/nginx/mysql: 各类应用程序,可以以自己的方式记录日志

1.3 观察 rsyslogd程序

[root@yangs ~]# ps aux |grep rsyslogd
root 717 0.0 0.0 219752 3880 ? Ssl 09:05 0:00 /usr/sbin/rsyslogd -n

2,常见的日志文件(系统、进程、应用程序)

常见的日志文件(系统、进程、应用程序)
# tail /var/log/messages         //系统主日志文件
# tail -20 /var/log/messages
# tail -f /var/log/messages         //动态查看日志文件的尾部
# tailf /var/log/secure             //认证、安全
# tail /var/log/maillog             //跟邮件postfix相关
# tail /var/log/cron            //crond、at进程产生的日志
# tail /var/log/dmesg             //和系统启动相关
# tail /var/log/audit/audit.log         //系统审计日志
# tail /var/log/yum.log             //yum
# tail /var/log/mysqld.log         //MySQL
# tail /var/log/xferlog             //和访问FTP服务器相关
# w                     //当前登录的用户 /var/log/wtmp
# last                     //最近登录的用户 /var/log/btmp
# lastlog                 //所有用户的登录情况 /var/log/lastlog

案例1:

请大家使用xshell,ssh命令登陆教师机。
案例1: SSH登录失败的用户
[root@localhost ~]# grep 'Fail' /var/log/secure

了解

[root@localhost ~]# grep 'Fail' /var/log/secure |awk '{print $11}' |sort |uniq -c|sort -k1 -n -r |head -5

7 172.16.130.14
6 172.16.130.70
5 172.16.130.56
3 172.16.130.80
2 172.16.130.76
sort 分类,排序
uniq -c 去重

案例2:

案例2: SSH登录成功的用户
[root@localhost ~]# grep 'Accepted' /var/log/secure

了解

[root@localhost ~]# grep 'Accepted' /var/log/secure |awk '{print $(NF-3)}' |sort |uniq -c
4 111.201.131.215
1 116.243.0.213
1 123.120.14.32
3 123.120.38.233
2 221.222.199.175
1 221.222.202.102

3,rsyslogd配置(重点)

3.1 相关程序

yum install rsyslog logrotate (默认已安装)

3.2 启动程序

systemctl start rsyslog.service

3.3 相关文件

#rpm -qc rsyslog    //观察日志程序的配置文件

/etc/rsyslog.conf         //rsyslogd的主配置文件(关键)

/etc/sysconfig/rsyslog         //rsyslogd相关文件,定义级别(了解一下)

/etc/logrotate.d/syslog     //和日志办轮转(切割)相关(任务二)

3.4 主配置文件常见配置

3.4.1 告诉rsyslogd进程 哪个设备,什么样的信息,以及存到哪里。

3.4.2 #vim /etc/rsyslog.conf

1. RULES

authpriv.*         /var/log/secure(SSH信息)
mail.*             -/var/log/maillog(发邮件)
cron.*             /var/log/cron(创建任务)
authpriv.*         * <*代表所有终端>
authpriv.*         @192.168.10.230     
authpriv.*         @@192.168.10.230     
这里有一个-符号, 表示是使用异步的方式记录, 因为日志一般会比较大
*.info;mail.none;authpriv.none;cron.none                /var/log/messages   
系统日志排除了邮件,认证,计划日志。
@@表示通过tcp协议发送    @表示通过udp进行转发
omprog - 发送日志给程序处理
案例5
通过邮件日志,了解日志记录。
终端1

锁定邮件日志
tailf /var/log/maillog
终端2
发送电子邮件,触发生成日志。
mail -s 'test1' root
1234
ctrl+D
返回终端1,观察新生成日志。理解日志行为。
案例6
通过任务计划,了解日志记录。
终端1

tailf /var/log/cron
终端2
crontab -e
观察终端1

2.FACILITY&LEVEL

目的:通过man手册理解设备和级别

facility设备

# man 3 syslog
facility:是系统对某种类型事件的定义。如AUTHPRIV是安全事件,CRON是计划任务事件。
设备如下:

LOG_AUTH
LOG_AUTHPRIV         安全认证
LOG_CRON    clock daemon (cron and at)
LOG_DAEMON             后台进程
LOG_FTP        ftp daemon
LOG_KERN    kernel messages
LOG_LOCAL0 through LOG_LOCAL7         用户自定义设备
LOG_LPR        printer subsystem
LOG_MAIL             邮件系统mail subsystem
LOG_NEWS    news subsystem
LOG_SYSLOG         syslogd自身产生的日志
LOG_USER (default)

关于程序和设备的联系问题,程序自身会决定将日志交给哪类设备。如SSH程序会选择安全类设备。这一点由开发者定义。
vim  /etc/ssh/sshd_config
SyslogFacility AUTHPRIV

level级别

# man 3 syslog
level :是指遇到何种情况(正常、错误)才会记录日志。

LOG_EMERG         紧急,致命,服务无法继续运行,如配置文件丢失
LOG_ALERT         报警,需要立即处理,如磁盘空使用95%
LOG_CRIT         致命行为
LOG_ERR         错误行为
LOG_WARNING     警告信息
LOG_NOTICE     普通,重要的标准信息
LOG_INFO         标准信息
LOG_DEBUG         调试信息,排错所需,一般不建议使用
从下到上,级别从低到高,记录的信息越来越少

3.图示

目的:通过绘图形式来理解日志工作的机制

Linux日志管理_第1张图片

4.示例

日志命令
# logger "run......."    //messages日志
# logger -p emerg  "run......."    //所有终端
# logger -p authpriv.info "run......."    
//secure安全日志

4,日志收集服务器

4.1 目的

日志可以存放在本地
日志可以存放在远程服务器

4.2 实战案例

案例1:将authpriv设备日志记录到/var/log/auth.log

步骤

1.修改日志文件的位置

vim /etc/rsyslog.conf
#authpriv.*                                              /var/log/secure
authpriv.*                                              /var/log/auth.log

2.观察日志文件

# ll /var/log/auth.log
ls: 无法访问/var/log/auth.log: 没有那个文件或目录

因为没有任何日志记录生成。

3.重启程序,触发日志生效

#systemctl restart rsyslog.service
# ll /var/log/auth.log
-rw-------. 1 root root 964   /var/log/auth.log
cat /var/log/auth.log

案例2:改变应用程序sshd的日志设备为local5,并定义local5设备日志记录到/var/log/local5.local

步骤

1.设置ssh程序的日志设备为自定义设备

# vim /etc/ssh/sshd_config
#SyslogFacility AUTHPRIV
SyslogFacility LOCAL5

2.设置自定义设备日志文件存储位置

# vim /etc/rsyslog.conf
local5.*       /var/log/local5.local

3.重启生效

# systemctl restart sshd
# systemctl restart rsyslog

4.尝试登录,触发日志

5.观察日志,理解自定义日志设备

# ll /var/log/local5.local
-rw-------. 1 root root 201   /var/log/local5.local
cat /var/log/local5.local

案例3:使用logger程序写日志到指定的设备及级别。并发送到集中日志服务器。

步骤        //准备两台服务器,一个用来发送日志,另一个用来接收日志

服务器1(10.18.41.144)发送日志
# vim /etc/ssh/sshd_config
#SyslogFacility AUTHPRIV
SyslogFacility LOCAL5
此处修改SSH只是测试

vim /etc/rsyslog.conf

local5.*         @10.18.41.12

此处填写另一台设备的IP地址。

另一台设备是集中日志服务器。

# systemctl restart sshd
# systemctl restart rsyslog
#systemctl stop firewalld

服务器2(10.18.41.12)接受日志
# vim /etc/rsyslog.conf
$ModLoad imudp
$UDPServerRun 514
local5.*       /var/log/server152.log

# systemctl restart rsyslog
#systemctl stop firewalld


尝试ssh登录服务器1.
并观察本地日志

ll /var/log/server152.log

三, 日志轮转(logrotate 日志轮转)

1,简介

日志 , 记录了程序运行时各种信息。

通过日志可以分析用户行为,记录运行轨迹,查找程序问题。

可惜磁盘的空间是有限的,就像飞机里的黑匣子,记录的信息再重要也只能记录最后一段时间发生的事。

为了节省空间和整理方便,日志文件经常需要按!时间或!大小等维度分成多份,删除时间久远的日志文件。这就是通常说的日志滚动(log rotation)。

logrotate本身不是系统守护进程,它是通过计划任务crond每天执行

2,工作原理

2.1 被crond调动

[root@yangs ~]# cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf     //日志轮转,按/etc/logrotate.conf

2.2 按照配置进行轮转

2.2.1 配置文件种类

logrotate 配置文件:
主文件:/etc/logrotate.conf (决定每个日志文件如何轮转)
子文件夹:/etc/logrotate.d/*

2.2.2 观察主文件和子文件

[root@tianyun ~]# ls /etc/logrotate.conf /etc/logrotate.d/
/etc/logrotate.conf
/etc/logrotate.d/:
acpid cups iscsiuiolog ppp rpm subscription-manager up2date wpa_supplicant
conman httpd mgetty psacct setroubleshoot syslog vsftpd.log yum

3,主配置文件介绍

[root@localhost ~]# vim /etc/logrotate.conf
=========全局设置==========
weekly         //轮转的周期,一周轮转
rotate 4         //保留4份
create         //轮转后创建新文件
dateext         //使用日期作为后缀
#compress     //是否压缩
include /etc/logrotate.d    //包含该目录下的子配置文件

/var/log/wtmp {     //对某日志文件设置轮转的方法
monthly                 //一月轮转一次
minsize 1M         //最小达到1M才轮转
create 0664 root utmp     //轮转后创建新文件,并设置权限
rotate 1         //保留一份
}

/var/log/btmp {
missingok         //丢失不提示
monthly             //每月轮转一次
create 0600 root utmp     //轮转后创建新文件,并设置权限
rotate 1         //保留一份
}

4,实例部分

例1:yum日志轮转

轮转文件/var/log/yum.log

配置轮转规则

# vim /etc/logrotate.d/yum
/var/log/yum.log {
missingok        //丢失不执行
# notifempty        //空文件不论转
# size 30k        //达到30k即可轮转
# yearly        //或者一年一轮转
daily        //缩小周期到1天
rotate 3        //轮转保留3次
create 0777 root root
}

测试

# /usr/sbin/logrotate /etc/logrotate.conf //手动轮转

# ls /var/log/yum*
/var/log/yum.log     //文件只有一个。因为日期没变

# grep 'yum' /var/lib/logrotate/logrotate.status //记录所有日志文件最近轮转的时间
"/var/log/yum.log" 2017-3-31-10:0:23        //如果没有轮转过,第一次只有记录

修改时间,手动触发轮转
# date 04011000
# /usr/sbin/logrotate  -s /var/lib/logrotate/logrotate.status /etc/logrotate.conf

例2:messages日志轮转(追加属性)

目的:

1.设置系统日志轮转
2.为系统日志文件增加属性。用于保护日志文件。

准备工作:

删除原有的 /etc/logrotate.d/syslog,关于messages的行。
避免不同的规则互相影响。
    示例
[root@localhost ~]# cat /etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
???????删除掉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
}

第一步:设置轮转

vim /etc/logrotate.d/messages
/var/log/messages {        
#notifempty        
daily                
create 0600 root root    
missingok        
rotate 5        


测试:

/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status  /etc/logrotate.conf
ll /var/log/message*
发现轮转成功。

第二步:设置追加属性

chattr +a /var/log/messages

测试:

修改时间,再次手动轮转,发现轮转失败。请思考,为什么。
/usr/sbin/logrotate -s /var/lib/logrotate/logrotate.status  /etc/logrotate.conf

第三步:设置轮转脚本

  vim /etc/logrotate.d/messages
/var/log/messages {
prerotate
chattr -a /var/log/messages
endscript

#notifempty
daily
create 0600 root root
missingok
rotate 5

postrotate
chattr +a /var/log/messages
endscript
}

修改时间,重启rsyslog程序。进行轮转测试

第四步:总结

chattr的a属性只能以追加的方式打开,用vi打开是不行的。可以这样写入:ls >> file
避免日志被误删除

例3:理解轮转后需重启的概念

1.通过如下轮转配置示例,理解轮转后执行脚本的语法结构。

2.轮转配置示例
例3:/etc/logrotate.d/syslog
/var/log/cron
/var/log/maillog
/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
}

注释
重启 `rsyslog ,`如果重启失败,输入到垃圾桶  ||  永远为真
1) SIGHUP 重新加载配置
如果左侧命令执行失败了||那么就执行右侧命令。
&& || 示例说明
1.测试一个存在的IP,返回yes
[root@localhost ~]# ping -c 1 10.18.42.74 &> /dev/null  && echo yes || echo no
yes

2.测试一个不存在的IP,返回NO
[root@localhost ~]# ping -c 1 10.18.42.79 &> /dev/null  && echo yes || echo no
no

强制轮转的命令:logrotate -f /etc/logrotate.conf

3.通过实验4,理解重启程序的必要性。

例4:access_log日志轮转

第一步:安装网站(了解)
[root@localhost ~]# yum -y install httpd
[root@localhost ~]# echo "AAAAA" > /var/www/html/index.html
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# firewall-cmd --permanent --add-service=http
[root@localhost ~]# firewall-cmd --reload

第二步:访问网站地址,观察访问日志(了解)
[root@localhost ~]# wc -l /etc/httpd/logs/access_log
2647 /etc/httpd/logs/access_log
[root@localhost ~]# awk '{print $1}' /etc/httpd/logs/access_log |sort |uniq -c |sort -k1 -nr
1310 172.16.120.161
826 172.16.120.14
729 172.16.120.210
638 172.16.120.107

第三步:观察访问日志有个孪生兄弟。(了解)
[root@localhost ~]# ll -i /etc/httpd/logs/access_log /var/log/httpd/access_log
37552569 -rw-r--r-- 1 root root 658886 Apr 7 10:07 /etc/httpd/logs/access_log
37552569 -rw-r--r-- 1 root root 658886 Apr 7 10:07 /var/log/httpd/access_log

第四步:编写轮转规则,只是注释掉重启的语句(重点理解)
[root@localhost ~]# vim /etc/logrotate.d/httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
# postrotate
# /bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
# endscript
}

第五步:轮转,观察轮转后的日志(了解)
[root@localhost ~]# ll /var/log/httpd/access*   -i     //观察原来的日志文件和目标日志文件
-rw-r--r-- 1 root root 664831 Apr 7 10:08 /var/log/httpd/access_log

[root@localhost ~]# logrotate -f /etc/logrotate.conf

[root@localhost ~]# ll /var/log/httpd/access*
-rw-r--r-- 1 root root 0 Apr 7 10:11 /var/log/httpd/access_log
-rw-r--r-- 1 root root 664831 Apr 7 10:08 /var/log/httpd/access_log-20170407
重点注意:原来的文件空了。access_log文件空了。

第六步: 继续访问网站,观察日志文件...(重点理解)
问题来了。原来的文件应该继续写入内容。但是依旧是空的。
[root@localhost ~]# ls /etc/httpd/logs/* -l
-rw-r--r-- 1 root root 0 Apr 7 10:11 /etc/httpd/logs/access_log
-rw-r--r-- 1 root root 1522522 Apr 7 10:12 /etc/httpd/logs/access_log-20170407
-rw-r--r-- 1 root root 0 Apr 7 10:11 /etc/httpd/logs/error_log
-rw-r--r-- 1 root root 1124 Apr 7 10:03 /etc/httpd/logs/error_log-20170407

第七步:根据FD观察程序打开了那个日志
[root@localhost ~]# pgrep httpd
6416
7049
7055
7059
7945
7947
7948
7950
7951
7952
7971

第八步:父进程打开的依旧是轮询后的新文件(了解)
因为轮训是将原来的文件改名。重新创建了一个新文件。
老的access_log改名为access_log20170407
新的日志文件是重新创建的。access_log文件。

[root@localhost ~]# ll /proc/6416/fd
total 0
lr-x------ 1 root root 64 Apr 7 10:02 0 -> /dev/null
lrwx------ 1 root root 64 Apr 7 10:02 1 -> socket:[76246]
l-wx------ 1 root root 64 Apr 7 10:02 2 -> /var/log/httpd/error_log-20170407
lrwx------ 1 root root 64 Apr 7 10:02 3 -> socket:[76890]
lrwx------ 1 root root 64 Apr 7 10:02 4 -> socket:[76891]
lr-x------ 1 root root 64 Apr 7 10:02 5 -> pipe:[76906]
l-wx------ 1 root root 64 Apr 7 10:02 6 -> pipe:[76906]
l-wx------ 1 root root 64 Apr 7 10:02 7 -> /var/log/httpd/access_log-20170407

第九步:手动重启,观察FD调用的文件是那个?(了解)
[root@localhost ~]# systemctl reload httpd

[root@localhost ~]# ll /proc/6416/fd
total 0
lr-x------ 1 root root 64 Apr 7 10:02 0 -> /dev/null
lrwx------ 1 root root 64 Apr 7 10:02 1 -> socket:[76246]
l-wx------ 1 root root 64 Apr 7 10:02 2 -> /var/log/httpd/error_log
lrwx------ 1 root root 64 Apr 7 10:02 3 -> socket:[76890]
lrwx------ 1 root root 64 Apr 7 10:02 4 -> socket:[76891]
lr-x------ 1 root root 64 Apr 7 10:02 5 -> pipe:[96182]
l-wx------ 1 root root 64 Apr 7 10:02 6 -> pipe:[96182]
l-wx------ 1 root root 64 Apr 7 10:02 7 -> /var/log/httpd/access_log

第十步:继续访问网站,观察日志文件...(了解)
[root@localhost ~]# ll /etc/httpd/logs/access_log*
-rw-r--r-- 1 root root 1076521 Apr 7 10:17 /etc/httpd/logs/access_log
-rw-r--r-- 1 root root 1797243 Apr 7 10:15 /etc/httpd/logs/access_log-20170407

第十一步:启动轮转日志中的重启语句,理解该语句含义(重点理解)
[root@localhost ~]# vim /etc/logrotate.d/httpd
/var/log/httpd/*log {
missingok
notifempty
sharedscripts
delaycompress
postrotate
/bin/systemctl reload httpd.service > /dev/null 2>/dev/null || true
endscript
}

第十二步:修改时间,手动轮转。访问网站并观察日志大小。
[root@localhost ~]# date 04101000
Mon Apr 10 10:00:00 CST 2017
[root@localhost ~]# logrotate -f /etc/logrotate.conf
[root@localhost~]# ll /etc/httpd/logs/access_log*
-rw-r--r-- 1 root root 39910 Apr 10 10:00 /etc/httpd/logs/access_log
-rw-r--r-- 1 root root 1797243 Apr 7 10:15 /etc/httpd/logs/access_log-20170407
-rw-r--r-- 1 root root 5131350 Apr 10 10:00 /etc/httpd/logs/access_log-20170410

说明:
轮转后 原日志文件 被改名,新日志 文件是创建的。
应用程序根据inode找到日志文件进行书写,如果不重启,找寻的依旧是老的日志文件。





你可能感兴趣的:(Linux基础)