Linux日志学习

来源:互联网 发布:人脸识别算法 开源 编辑:程序博客网 时间:2024/04/30 09:49

Linux的系统日志的重要性对系统管理员来说不言而喻,Linux老鸟分析日志时总能找到重要的东西。可惜楼主是个小菜鸟,在学习“鸟哥私房菜”的时候整理了一些笔记,方便学习也分享经验~
文章分为三个部分:
1、Linux系统下重要的日志文件
2、日志有关的daemon及相关配置文件
3、日志轮替–logrotate

其实日志文件不外乎两个来源:

1、软件开发者自定义的日志文件与相关格式,如:apache等2、Linux日志管理服务产生的与系统相关的日志文件,如syslogd(在CentOS 6.x中已经更名为rsyslogd,功能也更强大)。

一、Linux系统下的重要的日志文件

Linux中一般将日志文件放置在/var/log目录下,有时某些daemon的日志文件也能在其他地方找到。

比如:httpd的日志可以在/etc/httpd/logs/* 找到,也可以在/var/log/httpd/* 找到,两个目录的内容是一样的。

有经验的老鸟可以通过几个常用的日志文件快速地掌握系统的最新状态:

1、/var/log/cron: 可以在这个文件中找到关于crontab例行工作的状态,比如crontab有没有实际被执行、进程执行时有没有发生错误等。

2、/var/log/dmeg: 这个文件记录系统开机时内核检测过程中产生的各种信息。

3、/var/log/lastlog: 对lastlog这个命令不陌生的一定知道lastlog就是到这个日志文件中读取系统上所有账号最近一次登陆系统时的信息。

4、/var/log/message: 这是个重要的日志文件,因为系统发生的几乎所有的所有重要信息都会被记录在这个文件里。(后面会解释)

5、/var/log/secure: 既然名字为secure,那这个文件顾名思义是与安全相关的。只要涉及到输入账号密码的软件,不管正确登陆或失败,它都会记录在案。

6、/var/log/httpd/* 、/var/log/samba/* 等: 除了系统相关外,不同的daemon产生的信息都会有它们自己的日志文件来记录。

二、rsyslog服务

在CentOS 6.x中,rsyslog已经取代了5.x的syslog提供更加强大的日志管理服务。
可以看到rsyslogd的启动设置

[root@localhost log]# chkconfig --list rsyslogrsyslog       0:off 1:off   2:on    3:on    4:on    5:on    6:off

先看看日志的格式

rsyslog记录的日志格式如下:

事件发生的时间  发生时间的主机名  触发时间的服务或进程名  该时间的实际数据内容

/etc/rsyslog.conf配置文件

这个配置文件规定了 什么服务的什么等级的信息将被记录在哪里
语法如下:

服务名称[.!=]信息的等级  日志文件的路径

这里介绍一些特殊的语法使用:
1、服务名称:
rsyslog自己设置了一系列标签,用以对应各种服务,如:
1、cron:主要是例行工作crontab/at等生成的日志
2、mail:与收发邮件相关的都对应这里
3、kern:就是内核产生信息的地方
……(具体可使用man 3 rsyslog查看)
因此,有了这些“标记”,软件作者就可以用上述的服务名称来标记自己的软件。

2、信息等级:
1、info:一些基本的信息说明
2、notice:比info多一些信息
3、warning:警告,但还不至于影响到某个daemon运行的信息
4、err:错误
5、crit:临界点
6、alert:警告
7、emerg:严重的错误信息,系统无法正常运行
8、debug:调试用,但不记录信息
9、none:不记录

3、[.!=]:

“.”代表比后面还要高的等级(包括)都会被记录下来“=”代表只记录指定等级“!”代表除了指定等级其他都记录

4、日志文件的路径:
即日志文件的存放路径,也可以是输出到设备、另一台主机等。

“*”代表目前在线的所有人,类似wall这个命令。(它用在emerg这个等级的信息非常方便,即意味着一旦发生重大错误立刻同时所有在线的人员)

来看看/etc/rsyslog.conf的默认参数:

[root@localhost ~]# vim /etc/rsyslog.conf...(省略)*.info;mail.none;news.none;authpriv.none;cron.none /var/log/messagemail.* /var/log/maillog*.emerg * #严重错误,发出警告广播...(省略)

可以看到,除了mail、news、authpriv、cron等服务生成的日志信息较多,在设置中有专门的文件记录,其他的信息都会写入/var/log/message中,所以现在知道为什么说这个文件和重要了吧。

说一下日志的安全相关的问题

接触过信息安全的人应该不陌生,在敌手渗透系统成功后,最后一步往往是留下后门和清除痕迹。清除痕迹最快捷的办法就是删掉系统日志,你想,如果直接把你的/var/log目录删掉,你去哪里找他在你的系统中干过的坏事?

另外还有一点,Linux的日志文件一旦编辑过rsyslogd就不会再进行信息记录,即使你是因为坏习惯使用vim的wq退出。(因为wq保存退出对文件进行了编辑。鸟哥在书里也提到过这个)【CentOS 6.5亲测正确】
因此,为了误操作或者是恶意操作破坏日志文件,可以对日志文件针对文件属性设置权限,如此一来root也将被限制。

科普一下:Linux除了可以设置rwx这种针对访问控制的权限,还有一种基于文件属性的权限chattr。格式如下:chattr [+-=]option filenamelsattr filename  #查看文件属性

在这里介绍两个属性:
1、i 属性:对文件设置i属性,表示不允许对该文件进行任何改动(就像把文件锁起来);对目录设置i属性,表示只能修改该目录下的数据,但是不能新建和删除。
2、a 属性:对文件设置a属性,表示只能对文件增加数据,但不允许删除和修改;对目录设置a属性,表示只能在该目录下建立和修改文件,但是不能删除。

综上,a属性正适合用于不停数据量不停增加的日志文件。如:

chattr +a /var/log/message

但这样也有一个问题,就是日志轮替的时候需要添加额外的设置才能顺利进行,下文分晓。

三、日志轮替logrotate

logrotate是一个程序,用于日志文件的轮替(即推陈出新,否则旧的日志会把系统挤爆)。但它与rsyslogd又有不同,rsyslogd是一个daemon,在系统后台运行,或者说系统一启动就一直驻扎在内存中。而logrotate只是一个单纯的程序,他会在每天固定的时候进行日志的轮替操作。也就是说它是一个crond例行性的作业,你会在/etc/cron.daily目录下找到他。

logrotate配置文件

与logrotate相关的文件有两个:

/etc/logrotate.conf #logrotate的默认参数/etc/logrotate.d/  #存放各个daemon的独立参数

上文有说不同的服务会记录下不同的日志文件,因此,各个服务同样也有自己的日志轮替设置,这些独立的设置就在/etc/logrotate.d/目录下,里面没有的参数则使用/etc/logrotate.conf的默认设置。

logrotate的工作模式

其实说到底,logrotate的主要功能就是将旧的日志文件更名,然后新建一个新的空的文件来记录。

假如设置为有一天一轮替的日志文件message:

一天后,message->message.1,新建一个message两天后,message->message.1->message.2,新建一个message三天后...--------------------此即为logrotate的工作内容。

而logrotate多久进行一次轮替,共保留多少个历史文件,是否压缩文件等这些都可以在logrotate。conf这个配置文件中设置。

[root@localhost ~]# vim /etc/logrotate.confweekly    <--默认每周进行一次轮替rotate 4  <--默认保留4个日至文件,即出现当message.5时,该文件会被删除create    <--原来的日志会被更名,因此新建一个文件#compress   <--是否对轮替文件压缩include /etc/logrotate.d/   <--将/etc/logrotate.d/目录内所有文件包含进来,现在可以理解为什么/etc/logrotate.d里面可以存在各个服务的不同轮替方案了吧/var/log/wtmp {  <--针对特定日志文件的轮替,事实上你大可以把所有的配置都类似这样写在这个文件里,只要你看着不头晕:-P    monthly   <--每月一次    minsize 1M  <--只有当文件大小超过1M时才进行轮替,优先级大于monthly    create 0664 root utmp  <--新建指定权限和user/group的文件    rotate 1  <--只保存一份}...

另外,logrotate的配置文件还有一个重要功能:可以执行外部命令。如:

[root@localhost ~]# vim /etc/logrotate.d/rsyslog/var/log/messages /var/log/secure /var/log/maillog /var/log/cron {sharedscriptspostrotate    /bin/kill -1 'car /var/run/rsyslogd.pid 2>/dev/null' 2>/dev/null || trueendscript}#这个设置的意思是在rotate结束后找到rsyslogd的PID,并用kill -1重启这个服务(因为日志文件被修改过了呀,rsyslogd就不认被修改过的日志文件)

可以看到sharedscripts…endscript对,用他们来包含外部命令。而在它们中间,使用:
prerotate: 表示在启动logrotate之前进行的命令(多用于修改文件属性等操作)
postrotate: 包含在logrotate之后进行的命令(如重新启动等服务)

还记得刚才说的日志安全相关的问题嘛???

logrotate的原理是修改旧的日志文件,新建一个空的继续记录。但是如果你在日志文件中添加了a属性的话,那文件就只能添加信息而不能修改和删除了,那岂不是没有办法就行轮替了。
办法总比困难多(突然想起高中老师说过的话:-P),借助sharedscripts…endscript不就可以咯!

思路:在prerotate将a属性去掉,再在postrotate把他设置回来即可。

于是这个设置就会变成这样:

[root@localhost ~]# vim /etc/logrotate.d/rsyslog/var/log/messages /var/log/secure /var/log/maillog /var/log/cron {#其余的使用默认设置就好sharedscriptsprerotatechattr -a /var/log/messageendscriptsharedscripts          #亲测prerotate和postrotate不能共用一个sharedscripts...endscript对,因此必须分开来写postrotate    /bin/kill -1 'car /var/run/rsyslogd.pid 2>/dev/null' 2>/dev/null || true    chattr +a /var/log/messageendscript}

设置好了logrotate它就会每天自动运行的了,但是如果你想手动运行的话,使用:

logrotate [-vf]-v:verbose-f:force,强制每个日志文件都执行rotate操作

不用-f时它会比较配置文件的设置,符合要求的才轮替。如果用了-f,那会强制每个日志文件都执行rotate操作。

TODO:
以上就是我对Linux日志相关配置文件的学习。还有对日志文件的分析的知识,小菜鸟还没有什么经验,以后边用边学吧~

0 0