--


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