1. 日志文件一般都位于/var/log, 日志所需要的服务和进程:

 

  • syslogd:主要登录系统与网路等服务的讯息;
  • klogd:主要登录核心产生的各项资讯;
  • logrotate:主要在进行登录档的轮替功能。

2.syslogd :记录日志的服务

syslog 的设定档:/etc/syslog.conf,这个档案规定了‘(1)什么服务 (2)的什么等级讯息 (3)需要被记录在哪里(设备或文件)’ 这三个咚咚,所以设定的语法会是这样:

 
  
  1. 服务名称[.=!]讯息等级       讯息记录的文件名或设备或主机 
  2. # 底下以 mail 这个服务产生的 info 等级为例: 
  3. mail.info           /var/log/maillog_info 
  4. # 这一行说明:mail 服务产生的大于等于 info 等级的讯息,都记录到  
  5. # /var/log/maillog_info 文件中的意思。 

其中,syslog 认识的服务主要有底下这些:

auth (authpriv) 主要与认证有关的机制,例如 login, ssh, su 等需要帐号/密码的咚咚;

cron就是例行性工作排程 cron/at 等产生讯息记录的地方;

daemon与各个 daemon 有关的讯息;

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

lpr亦即是列印相关的讯息啊!

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

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

syslog就是 syslogd 这支程式本身产生的资讯啊!

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

上面谈到的都是 syslog 自行制订的服务名称,软件开发商可以透过呼叫上述的服务名称来记录他们的软件。如下图所示:

讯息等级:

syslog 将讯息分为七个主要的等级,依次为:

info notice warning(warn) err(error) crit  alert emerg(panic)

还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级,可以忽略掉某些服务)

 

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

  • . :代表‘比后面还要高的等级 (含该等级) 都被记录下来’的意思,例如: mail.info 代表只要是 mail 的资讯,而且该资讯等级高于 info (含 info 本身)时,就会被记录下来的意思。
  • .=:代表所需要的等级就是后面接的等级而已, 其他的不要!
  • .!:代表不等于, 亦即是除了该等级外的其他等级都记录。

讯息记录的档名或装置或主机:

 

  • 档案的绝对路径:通常就是放在 /var/log 里头的档案啦!
  • 印表机或其他:例如 /dev/lp0 这个印表机装置
  • 使用者名称:显示给使用者啰!
  • 远端主机:例如 @www.vbird.tsai 当然啦,要对方主机也能支援才行!
  • *:代表‘目前在线上的所有人’,类似 wall 这个指令的意义!

 

 

 

自行增加日志文件功能

 
  
  1. # 1. 先设定好所要建立的档案设置! 
  2. [root@www ~]# vim /etc/syslog.conf 
  3. # Add by VBird 2009/04/08       <==再次强调,自己修改的时候加入一些说明 
  4. *.info      /var/log/admin.log  <==有用的是这行啦! 
  5.  
  6. # 2. 重新启动 syslog 呢! 
  7. [root@www ~]# /etc/init.d/syslog restart 
  8. [root@www ~]# ll /var/log/admin.log 
  9. -rw------- 1 root root 118 Apr  8 13:50 /var/log/admin.log 
  10. # 瞧吧!建立了这个登录档出现啰! 

 

2.

日志文件的安全性设置:

为防止日志文件随意修改,可以添加日志文件的chattr的a属性。(即只能增加文件内容,不过前提是root的密码没被窃取,否则一切都没有)

不过,也因为这个 +a 的属性让该档案无法被删除与修改,所以啰,当我们进行日志文件轮替时 (logrotate) ,将会无法移动该日志文件的文件名呢!所以会造成很大的困扰。这个困扰虽然可以使用 logrotate 的设定档来解决。

要注意的是,当‘ 你不小心 "手动" 更动过日志文件后,例如那个 /var/log/messages , 你不小心用 vi 开启他,离开却下达 :wq 的参数,呵呵!那么该档案未来将不会再继续进行登录动作! ’这个问题真的很常发生!由于你以 vi 储存了登录档,则 syslogd 会误判为该档案已被更动过,将导致 syslogd 不再写入该档案新的内容。要让该登录档可以继续写入,你只要重新启动 syslog (/etc/init.d/syslog restart) 即可

 

日志文件服务器的设定:

如果有多台服务器,每一台负责一个服务,那么可以将日志文件都集中到一台专用的服务器上,以便查看和管理。

日志服务器端的设置:

 
  
  1. # 1. Server 端:修改 syslogd 的启动设定档,通常在 /etc/sysconfig 内! 
  2. [root@www ~]# vim /etc/sysconfig/syslog 
  3. # 找到底下这一行: 
  4. SYSLOGD_OPTIONS="-m 0" 
  5. # 改成底下这样子! 
  6. SYSLOGD_OPTIONS="-m 0 -r" 
  7.  
  8. # 2. 重新启动与观察 syslogd 喔! 
  9. [root@www ~]# /etc/init.d/syslog restart 
  10. [root@www ~]# netstat -lunp | grep syslog 
  11. Proto Recv-Q Send-Q Local Address  Foreign Address State   PID/Program name 
  12. udp        0      0 0.0.0.0:514    0.0.0.0:*               13981/syslogd 
  13. # 嘿嘿!你的登录档主机已经设定妥当啰!很简单吧! 

日志客户端的设置:

 
  
  1. [root@www ~]# vim /etc/syslog.conf 
  2. *.*       @192.168.1.100 

 

3.日志文件的轮替(logrotate)

logrotate 是在规定的时间到了之后才来进行登录档的轮替, 所以这个 logrotate 程序是挂在 cron 底下进行的,/etc/cron.daily/logrotate 就是记录了每天要进行的登录档轮替的行为。

logrotate 这个程序的配置文件:

  • /etc/logrotate.conf
  • /etc/logrotate.d/

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

它的备份方式如下:

logrotate.conf的内容:

 
  
  1. [root@www ~]# vim /etc/logrotate.conf 
  2. # 底下的设定是 "logrotate 的预设设定值" ,如果个别的档案设定了其他的参数, 
  3. # 则将以个别的档案设定为主,若该档案没有设定到的参数则以这个档案的内容为预设值! 
  4.  
  5. weekly    <==预设每个礼拜对登录档进行一次 rotate 的工作 
  6. rotate 4  <==保留几个登录档呢?预设是保留四个! 
  7. create    <==由于登录档被更名,因此建立一个新的来继续储存之意! 
  8. #compress <==被更动的登录档是否需要压缩?如果登录档太大则可考虑此参数启动 
  9.  
  10. include /etc/logrotate.d 
  11. # 将 /etc/logrotate.d/ 这个目录中的所有档案都读进来执行 rotate 的工作! 
  12.  
  13. /var/log/wtmp {       <==仅针对 /var/log/wtmp 所设定的参数 
  14.     monthly           <==每个月一次,取代每周! 
  15.     minsize 1M        <==档案容量一定要超过 1M 后才进行 rotate (略过时间参数) 
  16.     create 0664 root utmp <==指定新建档案的权限与所属帐号/群组 
  17.     rotate 1          <==仅保留一个,亦即仅有 wtmp.1 保留而已。 
  18. # 这个 wtmp 可记录登入者与系统重新开机时的时间与来源主机及登入期间的时间。 
  19. # 由于具有 minsize 的参数,因此不见得每个月一定会进行一次喔!要看档案容量。 
  20. # 由于仅保留一个登录档而已,不满意的话可以将他改成 rotate 5 吧! 

/etc/logrotate.d/中的设定档:

  • 档名:被处理的登录档绝对路径档名写在前面,可以使用空白字元分隔多个登录档;
  • 参数:上述档名进行轮替的参数使用 { } 包括起来;
  • 执行脚本:可呼叫外部指令来进行额外的命令下达,这个设定需与 sharedscripts .... endscript 设定合用才行。至于可用的环境为:
    • prerotate:在启动 logrotate 之前进行的指令,例如修改登录档的属性等动作;
    • postrotate:在做完 logrotate 之后启动的指令,例如重新启动 (kill -HUP) 某个服务!
    • Prerotate 与 postrotate 对于已加上特殊属性的档案处理上面,是相当重要的执行程序!

logrotate的执行方法:

 
  
  1. [root@www ~]# logrotate [-vf] logfile 
  2. 选项与参数: 
  3. -v  :启动显示模式,会显示 logrotate 运作的过程喔! 
  4. -f  :不论是否符合配置文件的设定,强制每个日志文件都进行 rotate 的动作! (比如配置文件中规定1周一次,则没到1周也执行)

 

自定日志文件的轮替功能:

假设你已经建立了 /var/log/admin.log 这个档案, 现在,你想要将该档案加上 +a 这个隐藏标签,而且设定底下的相关资讯:

  • 日志文件轮替一个月进行一次;
  • 该登录档若大于 10MB 时,则主动进行轮替,不需要考虑一个月的期限;
  • 保存五个备份档案;
  • 备份档案需要压缩
 
  
  1. # 1. 先建立 +a 这个属性啊! 
  2. [root@www ~]# chattr +a /var/log/admin.log 
  3. [root@www ~]# lsattr /var/log/admin.log 
  4. -----a------- /var/log/admin.log 
  5. [root@www ~]# mv /var/log/admin.log /var/log/admin.log.1 
  6. mv: cannot move `/var/log/admin.log' to `/var/log/admin.log.1':  
  7. Operation not permitted 
  8. # 这里确定了加入 a 的隐藏属性!所以 root 无法移动此登录档! 
  9.  
  10. # 2. 开始建立 logrotate 的设定档,增加一个档案在 /etc/logrotate.d 内就对了! 
  11. [root@www ~]# vi /etc/logrotate.d/admin 
  12. # This configuration is from VBird 2009/04/08 
  13. /var/log/admin.log { 
  14.         monthly   <==每个月进行一次 
  15.         size=10M  <==档案容量大于 10M 则开始处置 
  16.         rotate 5  <==保留五个! 
  17.         compress  <==进行压缩工作! 
  18.         sharedscripts 
  19.         prerotate 
  20.                 /usr/bin/chattr -a /var/log/admin.log 
  21.         endscript 
  22.         sharedscripts 
  23.         postrotate 
  24.                 /usr/bin/killall -HUP syslogd 
  25.                 /usr/bin/chattr +a /var/log/admin.log 
  26.         endscript 

 

 4.分析日志文件

logwatch这个命令可以分析日志文件,也可以自己写脚本来做分析,可以鸟哥写的分析脚本