linux的日志管理

ls /var/log/  –此目录下很多系统日志都存放在此
/var/log/messages –非常重要的日志文件,几乎所有系统发生的重要错误都会记录在此
/var/log/secure –ssh  ftp   telnet  pop3等有关
 /var/log/dmesg  –开机时核心检测过程中所产生的信息
/var/log/cron –查看时间任务有关的日志
/var/log/wtmp –用last查看,不能直接cat
/var/log/btmp –用lastb查看,不能直接cat
/var/log/lastlog  –用lastlog查看
/var/log/boot –boot相关
/var/log/rpmpkgs –rpm相关
/var/log/maillog –mail相关
/var/log/spooler –news,uucp
/var/log/acpid –高级电源管理
/var/log/yum.log –yum程序相关的日志

还有一种日志就是每个服务所保存的日志,路径因服务会有所不同
一般是在/var/log/服务名/ 下

 

/etc/init.d/syslog –系统log服务,打开它才能记录系统日志

yum list |grep log
sysklogd.i386  –相关软件包
logrotate.i386

# description: Syslog is the facility by which many daemons use to log messages to various system log files.  It is a good idea to always run syslog.

 

设备:(facility)
auth   — pam产生的日志
authpriv –包括权限,登录相关的信息
cron –时间任务相关的信息,crontab,at
mail –邮件相关的信息
kern   –内核产生的信息
uucp –unix to unxi copy  指的是unix系统之间拷贝协议相关的信息
news –新闻组相关的信息
local0 到 local7 –程序自定义的日志设备
mark   –syslog服务内部的一些信息,产生一个时间标识
user  –用户程序产生的相关信息

日志级别:
debug  –调试,产生的日志是最多的一个级别
info  –一般信息的日志,最常用
notice  –最具有重要性的普通条件的信息
warning或warn –警告级别
err或error –错误级别,阻止某个功能或者模块不能正常工作的信息
crit  –严重级别,阻止整个系统或者整个软件不能正常工作的信息
alert  –需要马上修改的信息
emerg或panic –内核崩溃等严重错误
none  –什么都不记录
 –上面的日志级别,从上往下级别从低到高,记录的信息是多到少,级别低的记录的信息包括级别高的

 

连接符号
. 记录大于等于此等级
.= 只记录等于此等级的信息
.! 不等于此等级,也就是记录此等级之外的信息

# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console
–/dev/console指的是一种外接的终端设备,有些封闭主机(没有screen,keyboard,mouse等),可能会需要外接设备连接
# Log anything (except mail) of level info or higher.
# Don’t log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages
–记录所有日志类型的info级别的信息到/var/log/messages,除了mail,authpriv,cron的信息
# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure
–记录authpriv的所有级别的信息到/var/log/secure
# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog
–记录邮件的所有级别的信息到/var/log/maillog,关于减号-的意思为:因为邮件的信息相比于其他的来说是比较大的,所以是采用异步的方式,先存放在内存里,然后按一定的事件触发,或者到达一定的大小写到磁盘,而不是象其他的日志那样,产生了就马上写到磁盘。

# Log cron stuff
cron.*                                                  /var/log/cron
–记录时间任务所有级别的信息到/var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *
–记录所有日志设备的emerg信息以wall的方式发送给每个登录到系统的人知道
# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler
–记录uucp,new的crit信息到/var/log/spooler
# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log
–另外把boot messages记录到/var/log/boot.log

格式的写法有两种:
 uucp.crit;news.crit
 uucp,new.crit
–上面这两种写法是一致

 

例1,
只记录mail的info级别信息到/var/log/newmaillog
mail.=info  /var/log/newmaillog

例2,
记录时间任务的info级别以上的所有信息(除了err外)到/var/log/newcron
cron.info;cron.!err   /var/log/newcron

 

 

例3,把ssh的日志单独记录
# vim /etc/ssh/sshd_config
SyslogFacility local5 –修改成local5,把ssh的日志定义由local5来记录

# /etc/init.d/sshd restart  –重启使之生效

# vim /etc/syslog.conf   
local5.*                /var/log/ssh   –加这么一句

# /etc/init.d/syslog restart –重启后/var/log/ssh文件被自动创建

验证发现所有的ssh登录有关的信息被记录到了/var/log/ssh

====================================

远程系统日志管理
 管理多台主机,有时为了方便,可以把多台主机的日志给传到管理机(只一台)上,然后,系统管理员只要在管理机上查看,就可以查到多台主机的日志

 

例4,把71的ssh登录信息记录到35的/var/log/remotessh.log日志文件里

真实机做日志服务端(管理端)  虚拟机做日志客户端 
 10.1.1.35    10.1.1.71

在35先做
vim /etc/sysconfig/syslog

SYSLOGD_OPTIONS=”-m 0 -r” –加-r参数

/etc/init.d/syslog   restart   –重启服务

[root@li ~]# netstat -ntlup |grep sys –加了-r参数后打开了远程日志功能,那么就会多了一个监听端口,为udp的514端口
udp        0      0 0.0.0.0:514                 0.0.0.0:*                               4252/syslogd

在71上做:
vim /etc/ssh/sshd_config
SyslogFacility local5
/etc/init.d/sshd restart

vim /etc/syslog.conf
local5.*          @10.1.1.35
/etc/init.d/syslog restart

再回到35上做
 vim /etc/syslog.conf
local5.*                        /var/log/remotessh.log
/etc/init.d/syslog restart

–把所有的日志都放到同一台机器,可以方便使用grep,awk,sed等方便对其进行截取统计

如:在35上统计4月27号10.1.1.71这台机器允许ssh的次数
[root@dns /]# cat /var/log/ssh.log |grep “Apr 27” |grep 71 |grep Acc |wc -l

 

[root@li ~]# echo “7月11号34被ssh过`cat /var/log/ssh |grep 2.2.2.34 |grep “Jul 11″ |wc -l`次”
7月11号34被ssh过5次

 

 

==================================================================

       logrotate   –  rotates,  compresses,  and
       mails system logs

 

日志轮转 rotate  日志切割

 常见的轮转的日志有:
  /var/log/messages
  /var/log/cron
  /var/log/boot.log
  /var/log/maillog
  /var/log/secure

vim /etc/logrotate.conf  –配置文件

# see “man logrotate” for details
# rotate log files weekly
weekly    –默认是一个星期rotate一次

# keep 4 weeks worth of backlogs
rotate 4   –默认保留4个

# create new (empty) log files after rotating old ones
create   –rotate后,创建一个新的代替

# uncomment this if you want your log files compressed
#compress   –默认没有打开日志压缩功能

# RPM packages drop log rotation information into this directory
include /etc/logrotate.d –这表示/etc/logrotate.d目录下的所有配置文件都生效

# no packages own wtmp — we’ll rotate them here
/var/log/wtmp {  –针对wtmp单独的配置,这里是绝对路径
    monthly   –一个月rotate一次,取代上面的全局配置里的一个星期一次
    minsize 1M –指定最小大小为1M,才rotate,就算是时间到了,大小没有1M,也不rotate
    create 0664 root utmp –定义创建的为属性为0664,属主为root,属组utmp
    rotate 1 –保留一个
}

 

logrotate -vf /etc/logrotate.conf –查看轮转的过程

 

------------------------------

vim /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 –表示rotate结束
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript –脚本结束
}

结构如下:
  sharedscripts
   prerotate
    xxxxx     –轮转之前执行XXXX
  endscript
  sharedscripts
   postrotate
    xxxxx   –轮转之后执行xxxx
  endscript

 

logger -t ‘aa’ ‘bb’  –在日志文件里加上一个标记
[root@li test]# tail -n 1 /var/log/messages
May  8 15:33:02 li aa: bb –可以看到刚才加的标记

vim /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     ——–
          /bin/logger -t ‘rotate’ ‘begin’ ——–
    endscript     ——–
    sharedscripts    ——–
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/logger -t ‘rotate’ ‘end’  ———
    endscript
}

logrotate -vf /etc/logrotate.conf –强制rotate,然后查看轮转时日志文件的重命名过程

这里不要去强制轮转/etc/logrotate.d/syslog这个文件,会造成.1结尾的文件被删除

-f  强制rotate
-v  显示过程

再去tail /var/log/message去查看打的标记是否已经成功打上

 

================================================
或者做下面的例子:
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
        prerotate
           echo “before rotate” | mail root    –轮转前发邮件
    endscript
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/syslogd.pid 2> /dev/null` 2> /dev/null || true
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
          echo “end rotate” |mail root         –轮转后发邮件
    endscript
}

/etc/init.d/sendmail  restart     –启动此服务,默认本机给本机可以收发邮件

logrotate -vf /etc/logrotate.conf   –然后强制轮转

cat /var/mail/root   –查看邮件是否收到

 

==============================================

例5,配置/var/log/ssh日志每星期轮转一次,保留2份备份日志,并且最小要2M才轮转,忽略文件不存在的情况

# vim /etc/logrotate.conf  –加上下面一段
/var/log/ssh {
        weekly
        minsize 2M
        missingok
        create 0600 root root
        rotate 2
}

# logrotate -f /etc/logrotate.conf –使用此命令去验证

 

=============================================================

 

 logwatch – system log analyzer and reporter

logwatch –分析系统的日志,并以容易查看的格式发邮件

 

logwatch 配置文件
[root@li ~]# vim /etc/logwatch/conf/logwatch.conf –会提示你去打开下面的配置文件

[root@li ~]# vim /usr/share/logwatch/default.conf/logwatch.conf

[root@li ~]# logwatch  –直接使用此命令分析日志

[root@li ula]# ls /etc/cron.daily/0logwatch –每天都会运行的一个crontab时间任务
/etc/cron.daily/0logwatch

LogDir = /var/log –分析/var/log下的所有日志
TmpDir = /var/cache/logwatch –临时目录
MailTo = root –分析后邮件给root
MailFrom = Logwatch –从logwatch发邮件
Print = No –设为yes,表示分析后的报告输出到屏幕
Save = /tmp/logwatch –有设置的话,表示分析后的报告保存到文件
Range = Yesterday –默认只分析昨天的日志,改为all可以分析所有的,但速度较慢,视日志大小定
Detail = 0 –分析日志报告的详细程度,最高是10,可以写数字,也可以low,med,或者high

# logwatch  –直接使用此命令,让系统分析昨天的日志
# cat /var/mail/root  –分析完后,直接查看这个文件就可以看到最新的分析结果

 

====================================

tcpwrapper 

看程序是否支持tcpwrapper方式

比如说看sshd
[root@li test]# which sshd
/usr/sbin/sshd

[root@li test]# ldd /usr/sbin/sshd |grep wrap
        libwrap.so.0 => /lib/libwrap.so.0 (0x00d39000) –有此模块就表示支持

–不是所有的服务都支持,很多软件编译时会有./configure –enable-libwrap来支持tcpwrapper

 

由两个文件来控制
/etc/hosts.allow
/etc/hosts.deny
访问控制机制为先去匹配/etc/hosts.allow,再去匹配/etc/hosts.deny,如果都没有,则都允许

 

vim /etc/hosts.deny
sshd: all –拒绝所有

sshd: all    EXCEPT  10.1.1.104 –只允许104ssh上来

sshd: 10.1.1.0/255.255.255.0 EXCEPT  10.1.1.104 –拒绝10.1.1.0网段的人ssh访问,除了104外;注意子网掩码不支持/24写法

 
sshd:all:spawn echo “`date`” %c %d >> /var/log/tcpwrapperdeny.log
–拒绝所有人登录,并把拒绝的时间和IP等信息保存到日志文件

–man hosts.deny查看帮助

 

====================================================================

模块管理
  

ls /usr/src/kernels/2.6.18-164.el5-i686/ 内核源码

  /lib/modules/`uname -r`/kernel

 

 [root@li /]# ls /lib/modules/2.6.18-164.el5/kernel/
arch/    crypto/  drivers/ fs/      lib/     net/     sound/
架构平台   加密有关  驱动有关  文件系统  库        网络        声音

–也就是说由内核源码编译出来的模块被分类放在上面的目录

lsmod  –查看装载的模块
  –查看模块信息
rmmod  8139too  –删除模块

modprobe 8139too
insmod /lib/modules/2.6.18-164.el5/kernel/drivers/net/8139too.ko

 

=============================================================

 

内核编译

 内核的功能定制

 www.kernel.org  –下载内核源代码

 ls /usr/src/kernels/`uname -r`   –当前使用系统的内核源码

什么情况下需要编译内核?
 系统要支持一个功能,但内核默认不支持,又不想升级成新的系统,则需要内核编译
 开发了一个模块,需要内核的支持,也需要编入内核

内核编译要考虑几点:
  自己定制的内核运行更快,具有更少的代码
  把不需要的功能编译进内核可能会有受到漏洞被利用的风险
  将某种功能编译成模块方式比直接编译进内核速度要慢

 

10.1.1.35:/share/soft/kernel/linux-2.6.25.tar.bz2
10.1.1.35:/share/soft/kernel/linux-2.6.38.tar.bz2
10.1.1.35:/share/soft/kernel/config-2.6.25.selinux.ok

 

tar xvf /share/soft/kernel/linux-2.6.25.tar.bz2 -C /usr/src/

cd /usr/src/linux-2.6.25/

ls /share/soft/kernel/config-2.6.25.selinux.ok  –这是一个编译成功的配置文件

 cp /share/soft/kernel/config-2.6.25.selinux.ok /usr/src/linux-2.6.25/.config
–拷到内核源码下

 

编译内核的步骤:
1,make mrproper    –消除当前内核源码,使之干净,(和make clean相似)
2,make config –基于文本的传统的配置界面,不推荐使用
   make menuconfig –基于ncurses-devel库的一种文本选单方式(要装ncurses-devel)
    make oldconfig –如果只想在原来的内核配置基础上修改的话,用此选项
    make xconfig  –基于x windows的图形配置界面,基于qt的(要装avahi-qt3-devel)
 
  *   代表编入内核
  M   代表编成模块
  空   代表不编入内核

 有三种括号: 
  方括号:要么是编进,要么是不编
  尖括号:三种选择,编进,不编,编成模块
  圆括号: 多选一

3,make
4,make modules_install    –把编译后的模块复制到/lib/modules/内核新版本/  以后就可以用modprobe insmod来装载使用
5,make install  –拷贝vmlinuz,initrd 到/boot/下  ,并自动修改grub

上面的编译完成后,就可以reboot你的系统,然后在grub里选择新的内核进入系统进行验证

 

上面的内核编译过程麻烦,有时候如果想升级内核的话,可以直接下载相关的内核rpm包,安装就可以了

[root@li rac5.3]# pwd
/share/soft/rac5.3
[root@li rac5.3]# rpm -ivh kernel-PAE-2.6.18-128.el5.i686.rpm
[root@li rac5.3]# rpm -ivh kernel-PAE-devel-2.6.18-128.el5.i686.rpm