Chinaunix首页 | 论坛 | 博客
  • 博客访问: 84584
  • 博文数量: 41
  • 博客积分: 2500
  • 博客等级: 少校
  • 技术积分: 490
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-24 09:19
文章分类

全部博文(41)

文章存档

2011年(1)

2010年(4)

2009年(36)

我的朋友

分类: LINUX

2009-11-28 09:10:08

登录文件

  其实,可以说成是监控系统的记录,系统一举一动基本会记录下来。这样由于信息非常全面很重要,通常只有 root 可以进行视察!通过登录文件(日志文件)可以根据屏幕上面的错误讯息与再配合登录文件的错误信息,几乎就可以解决大部分的 Linux 问题! 所以日志文件异常重要,作为一个合格的linux系统工程师,日志文件是必要熟练掌握的部分。


常见的几个登录文件有

/var/log/secure:记录登入系统存取数据的文件,例如 pop3, ssh, telnet, ftp 等都会被记录;

/var/log/wtmp:记录登入者的讯息数据,由于本文件已经被编码过,所以必须使用 last指令来取出文件的内容;

/var/log/messages:尤为重要,几乎发生的错误讯息(或是重要信息)都会被记录在此;

/var/log/boot.log:记录开机或者是一些服务启动的时候,所显示的启动或关闭讯息; 

/var/log/maillog 或 /var/log/mail/*:纪录邮件存取或往来( sendmail 与 pop3 )的使用者记录;

/var/log/cron:记录 crontab 这个例行性服务的内容的。

/var/log/httpd, /var/log/news, /var/log/mysqld.log, /var/log/samba, /var/log/procmail.log:分别是几个不同的网络服务的记录文件!



登录文件的纪录程序之一: syslogd

通常经过 syslog 而记录下来的数据主要有:

事件发生的日期与时间

发生此事件的主机名称

启动此事件的服务名称 (如 samba, xinetd 等) 或函式名称 (如 libpam ..);

该讯息数据内容


syslogd的daemon配置文件:/etc/syslog.conf

内容语法是这样的:

服务名称[.=!]讯息等级          讯息记录的文件名或装置或主机

# 例如底下:

mail.info                      /var/log/maillog_info


服务名称:该服务产生的讯息会被纪录的意思。syslog 认识的服务主要有底下这些:

auth, authpriv:主要与认证有关的机制,例如telnet, login, ssh 等需要认证的服务都是使用此一机制;

cron:例行性命令 cron/at 等产生讯息记录的地方

daemon:与各个 daemon 有关的讯息;

kern:核心 (kernel) 产生讯息的地方;

lpr:打印相关的讯息!

mail:只要与邮件收发有关的讯息纪录都属于这个;

news:与新闻群组服务器有关的东西;

syslog:syslogd 这支程序本身产生的信息啊!

user, uucp, local0 ~ local7:与 Unix like 机器本身有关的一些讯息。


讯息等级

系统将讯息分为七个主要的等级,依序是由不重要排列到重要讯息等级:

info:仅是一些基本的讯息说明而已;

notice:比 info 还需要被注意到的一些信息内容;

warning 或 warn:警示讯息,可能有问题,但是还不至于影响到某个 daemon 运作。

err 或 error :一些重大的错误讯息,这就要去找原因了。

crit:比 error 还要严重的错误信息,crit 是临界点 (critical) 的缩写,已经很严重了

alert:警告警告,已经很有问题的等级,比 crit 还要严重!

emerg 或 panic:疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。 

  除了这些有等级的讯息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当要作一些错误侦测,或者是忽略掉某些服务的信息时,就用这俩!


在讯息等级之前还有 [.=!] 的连结符号!他代表的意思是:

. :代表比后面还要高的等级(含该等级)都被记录下来的意思, 例如:mail.info 代表只要是 mail 的信息,而且该信息等级高于 info (含info )时,就会被记录下来

.=:代表所需要的等级就是后面接的等级而已!

.!:代表不等于。


日志文件记录的文件名或装置或主机常见的放置处:

文件的绝对路径:通常就是放在 /var/log 里头的文件!

打印机或其它:例如 /dev/lp0 这个打印机装置  (即使被黑客可以删除掉日志文件,但是最终删除不了打印出来的日志信息)

使用者名称:显示给使用者!

远程主机:例如 @test.adsldns.org,要对方主机也能支持才行!

*:代表目前在线的所有人,类似 wall 这个指令的意义!


看看在尚未开启网络服务的情况下来自 Fedora Core Release 4 的相关资料

[root@linux ~]# vi /etc/syslog.conf

#kern.*                                    /dev/console

# 只要是 kernel 产生的讯息,全部都送到 console 去!默认是关闭的。

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

# 在已知各服务的讯息中,不要记录到这个文件中,把已知的服务记录到单独的日志文件中去,方便日后查询,否则messages这个文件就太混乱了。这个文件非常重要,所有未知的信息都会被记录在这个文件中,所以有问题,找这个文件就八九不离十了。

authpriv.*                                 /var/log/secure

# 这个就是经过一些身份确认的行为之后,需要记录身份的文件。

mail.*                                     -/var/log/maillog

# 只要跟 mail 有关的(不论是 pop3 还是 sendmail )都会被纪录到这个文件!

cron.*                                     /var/log/cron

#例行性命令相关的。

*.emerg                                    *

# 任何时候发生的警告讯息都会显示给在线的所有人!那个 * 就是目前在线的所有人

uucp,news.crit                             /var/log/spooler

# 记录新闻错误高于 crit 的等级的信息,写入 spooler 当中!

local7.*                                   /var/log/boot.log

# 将开机的当中的讯息写入 /var/log/boot.log 中! 

  每个版本的 syslog.conf 差异是很大的,所以,每个登录文件记录的数据其实不很固定。 


例:让所有的信息都额外写入到 /var/log/admin.log!

[root@linux ~]# vi /etc/syslog.conf

*.info          /var/log/admin.log  》》如果服务器硬盘容量够大,这么做也不失为一个良策。

[root@linux ~]# /etc/init.d/syslog restart

[root@linux ~]# ll /var/log/admin.log

-rw-------  1 root root 122 Oct 23 22:21 /var/log/admin.log  》》注意权限


一台主机管理多台主机登录文件

 # 1. 先取得 port number 的信息!

[root@linux ~]# grep 514 /etc/services

syslog          514/udp   》》syslog的固定端口

# 注意,/etc/services 里面必须要存在这一行才行,否则自行手写!

# 2. 修改 syslogd 的启动配置文件

[root@linux ~]# vi /etc/sysconfig/syslog

#SYSLOGD_OPTIONS="-m 0"  改成底下这样子

SYSLOGD_OPTIONS="-m 0 -r"

# 3. 重新启动与观察 syslogd !

[root@linux ~]# /etc/init.d/syslog restart

[root@linux ~]# netstat -tlunp

Proto Recv-Q Send-Q Local Address Foreign Address State  PID/Program name

udp   0      0      0.0.0.0:514   0.0.0.0:*              24314/syslogd

  Linux 主机已经可以接收来自其它主机的登录信息了!client 端的设定就简单了!只要指定某个信息传送到这部主机即可!比如,登录文件主机 IP 为 192.168.1.100 ,而 client 端希望所有的数据都送给主机,可以在 /etc/syslog.conf 里面新增这样的一行:

[root@linux ~]# vi /etc/syslog.conf

*.*       @192.168.1.100

  未来主机上面的登录文件当中,每一行的主机名称就会显示来自不同主机的信息了。


登录文件服务程序之二,轮滚(logrotate):

  所谓的 logrotate ,就是将旧的 log 文件更名,然后建立一个空的 log 文件,如此一来,新的 log 文件将从零开始记录,然后只要将旧的 log 文件留下一段时间! 旧的纪录 保存了一段时间没有问题,那么就可以让系统自动的将他删掉,否则占用硬盘空间。如图比如规定了message日志文件轮滚3次:


最初的日志文件   message

轮滚一次后       message  message1 

轮滚二次后       message  message1 message2

轮滚三次后       message  message1 message2 message3  》》删除(如果再次轮滚,message3就会被删除,而message2就会变成message3,且系统会新建立一个message)


注意,相同颜色的mssage表示的是一个内容的文件,只不过每次轮滚他的名字后面会改一次数字。


logrotate 的配置文件

/etc/logrotate.conf

/etc/logrotate.d/

注意! logrotate.conf 才是主要的参数文件,logrotate.d 是一个目录, 该目录里面的所有文件都会被主动的读入/etc/logrotate.conf 当中来进行!另外,在 /etc/logrotate.d/ 里面的文件中,如果没有规定到的一些细部设定,则以/etc/logrotate.conf 的规定来指定为默认值

 

[root@linux ~]# vi /etc/logrotate.conf

# 底下是 "logrotate 的预设值,如果个别的文件设定了其它的参数,那么将以个别的文件设定为主,若该文件没有设定到的参数,则以这个档案的内容为默认值!

Weekly   》》预设每个礼拜对登录文件进行一次 rotate 的工作

rotate 4   》》保留四个登录文件

create   》》是否建立新的登录文件来记录!

#compress  》》 rotate 之后的登录文件,是否压缩,通常是不要压缩啦,压缩登录文件扩展名会变成 messages.1.gz !系统负载不大,且日志比较大,可以考虑压缩。

include /etc/logrotate.d  》》将底下这个目录中的所有文件都读进来执行 rotate 的工作!

/var/log/wtmp {

    monthly

    create 0664 root utmp

    rotate 1

}

。。。省略。。。

# 在 logrotate.conf 文件当中,只有这个数据是在记载如何对登录文件进行轮替的!这个登录文件记载的就是使用 login 登入系统时的使用者状态,last就是读自 /var/log/wtmp 当中记录的数据!整个段落的意义是:

# 1. 每个月进行一次 log rotate 的工作; 

# 2. 将文件的权限设定为 664 ,且拥有者为 root ,群组为 utmp; 

# 3. 仅保存前一个月的 rotate 备份!可以修改大一点


[root@linux ~]# vi /etc/logrotate.d/syslog

/var/log/messages  /var/log/secure  /var/log/maillog  /var/log/spooler 

/var/log/boot.log  /var/log/cron {

    sharedscripts

    postrotate

        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

    endscript

}

  设定的项目与前面提到的相同,并且可加入轮替前 (pre) 与后 (post) 的一些特殊执行的指令! 这个设定需与 sharedscripts .... endscript 设定合用才行;

prerotate:启动 logrotate 之前进行的指令,例如修改登录文件的属性等动作;

postrotate:做完logrotate 之后启动的指令,例如重新启动 (kill -1 或 kill -HUP) 某个服务!

  这一段设定值说明的是:『 /var/log 目录内的 messages, secure, mailog, spooler, boot.log 及 cron 这六个文件,每个礼拜进行一次轮替,且保留四个登录档,此外, 在轮替进行完毕之后,执行 syslog 的重新启动』因为没有提到该设定项目,所以就用 /etc/logrotate.conf 内的默认值来作用


解决charrt+a与lorotate矛盾的方法:

  矛盾处:a属性会让文件只能添加数据,不能修改文件名,不能删除(防止日志文件被入侵,被恶意删除),而lorotate需要修改文件的文件名。

  解决办法就是利用 prerotate 与 postrotate 来进行登录文件轮替前、后所需要作的动作!可以这样修改一下这个文件!

[root@linux ~]# vi /etc/logrotate.d/syslog

/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler 

/var/log/boot.log /var/log/cron {

    sharedscripts

    prerotate

        /usr/bin/chattr -a /var/log/messages

    endscript

    sharedscripts

    postrotate

        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true

        /usr/bin/chattr +a /var/log/messages

    endscript

}

特别留意,/bin/kill -HUP ...这一行的目的在于将系统的syslogd重新以其参数( syslog.conf )的资料读入一次!也可以想成是 reload 的意思! 由于建立了一个新的空的纪录文件,如果不执行此一行来重新启动服务, 那么记录的时候将会发生错误! 另外注意颜色字体部分格式,需要配套书写。


实际测试 logrotate 的动作

[root@linux ~]# logrotate [-vf] logfile

参数:

-v  :启动显示模式,会显示 logrotate 运作的过程喔!

-f  :不论是否符合设定文件的数据,强制每个登录文件都进行 rotate 的动作!


例:强制进行 logrotate 的动作

[root@linux ~]# logrotate -vf /etc/logrotate.conf

# 此命令属于企业危险命令,因为旧的日志对企业安全有很大作用,如果强行轮滚,造成提前删除旧日志文件,可能会有麻烦,所以不要乱用!预设的 logrotate 的执行时间就是放在 /etc/cron.daily/logrotate 里面的!由于logrotate 的工作已经加入crontab 里了!所以现在每天系统都会自动的查看 logrotate !


案例建立了 /var/log/admin.log,想要加上 +a属性,要求:

登录文件轮替一个月进行一次;

该登录文件若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;

保存五个备份文件;

备份文件不要压缩

[root@linux ~]# chattr +a /var/log/admin.log

[root@linux ~]# lsattr /var/log/admin.log

-----a------- /var/log/admin.log

[root@linux ~]# mv /var/log/admin.log /var/log/admin.log.1

mv: cannot move '/var/log/admin.log' to '/var/log/admin.log.1':permission deny

[root@linux ~]# vi /etc/logrotate.d/admin

# This configuration is from lonogo 2009/6/26

/var/log/admin.log {

        monthly

        size=10M

        rotate 5

        nocompress

        sharedscripts

        prerotate

                /usr/bin/chattr -a /var/log/admin.log

        endscript

        sharedscripts

        postrotate

                /usr/bin/killall -HUP syslogd

                /usr/bin/chattr +a /var/log/admin.log

        endscript

}

[root@linux ~]# logrotate -v /etc/logrotate.conf

。。省略。。

[root@linux ~]# logrotate -vf /etc/logrotate.d/admin    》》强行滚一下

....省略....

[root@linux ~]# lsattr /var/log/admin.log*   》》看看滚后的文件的权限变化了

-----a------- /var/log/admin.log

------------- /var/log/admin.log.1

注意, /etc/syslog.conf 与 /etc/logrotate.d/*通常是配合使用,目录下的.d目录下的文件未提及的设置,会参考助.conf配置文件的设置。


分析登录文件

dmesg

[root@linux ~]# dmesg | more

  由于系统在开机的过程当中尚未将硬盘 mount 上来,所以无法直接将数据直接读到 log file 当中去,但是为了除错上面的方便, 所以在开机的过程当中的讯息还是要记录下来,这个时候系统就将 ram 开了一个小区块来储存这个数据!这个开机记录文件就是:/proc/kmsg!

  几乎所有的核心信息都可以使用 dmesg 来查阅得到的,例 想要知道开机有没有捉到网卡,dmesg | grep 'eth' !


last

[root@linux ~]# last -n number 

[root@linux ~]# last -f filename

参数:

-n  :last 会读出这个月的数据,若数据量太大,可使用 -n 来严格要求显示的笔数。例如 20 笔数据: last -n 20 或 last -20 均可。

-f  :last预设读出 /var/log/wtmp,但是我们可以透过 -f 读取不同的登录文件信息!


例,将上个月的资料读出,仅读出5笔资料

[root@linux ~]# last -n 5 -f /var/log/wtmp.1

dmtsai2  pts/2             Mon Oct 24 14:18 - 14:18  (00:00)

dmtsai2  work:0 work       Mon Oct 24 14:18    gone - no logout

dmtsai2  work:0 work       Mon Oct 24 14:18 - 14:18  (00:00)

dmtsai2  pts/2             Mon Oct 24 14:18 - 14:18  (00:00)

dmtsai2  work:0 work       Mon Oct 24 14:18 - 14:18  (00:00)


[root@linux ~]# lastlog

lastlog 只是读出 /var/log/lastlog 内的信息. 他会显示目前系统上面的所有账号当中,每个账号最近一次登入的时间!

阅读(825) | 评论(0) | 转发(1) |
0

上一篇:linux考题

下一篇:挂盘

给主人留下些什么吧!~~