一
通过
logger
命令记录日志
logger
是一个
shell
命令接口,可以通过该接口使用
Syslog
的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
日志的级别
日志的级别分为七级,从紧急程度由高到底:
emerg
系统已经不可用,级别为紧急
alert
警报,需要立即处理和解决
crit
既将发生,得需要预防。事件就要发生
warnig
警告
err
错误信息,普通的错误信息
notice
提醒信息,很重要的信息
info
通知信息,属于一般信息
debug
这是调试类信息
1
。解决方法:
编辑
syslog.conf
,
#vi /etc/syslog.conf
在第一行加入
local3.none,
使得设备
local3
的日志不记录在
messages
文件里,
# Log anything (except mail) of level info or higher.
# Don't log private authentication messages!
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages
将设备
local3
的所有级别的信息都记录在
userlog
文件里,
#user log
local3.* /var/log/userlog
重新加载
syslog
服务的配置文件,
[root@KEVEIN Slides]# service syslog reload
Reloading syslogd... [ OK ]
Reloading klogd... [ OK ]
2
。测试
:
测试机器的环境:
OS
:
Red Hat Enterprise Linux 5 update 3
Network: 192.168.0.100/24 Gateway:192.168.0.1
[root@KEVEIN Slides]# ping 192.168.0.1 | logger -it logger_test -p local3.notice&
[2] 22484
命令
logger -it logger_test -p local3.notice
中的参数含义:
-i
在每行都记录进程
ID
-t logger_test
每行记录都加上
“logger_test”
这个标签
-p local3.notice
设置记录的设备和级别
[root@KEVEIN Slides]# tail -f /var/log/userlog
Oct 6 12:48:43 kevein logger_test[22484]: PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
Oct 6 12:48:43 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=1 ttl=253 time=49.7 ms
Oct 6 12:48:44 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=2 ttl=253 time=68.4 ms
Oct 6 12:48:45 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=3 ttl=253 time=315 ms
Oct 6 12:48:46 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=4 ttl=253 time=279 ms
Oct 6 12:48:47 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=5 ttl=253 time=347 ms
Oct 6 12:48:49 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=6 ttl=253 time=701 ms
Oct 6 12:48:50 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=7 ttl=253 time=591 ms
Oct 6 12:48:51 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=8 ttl=253 time=592 ms
Oct 6 12:48:52 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=9 ttl=253 time=611 ms
Oct 6 12:48:53 kevein logger_test[22484]: 64 bytes from 192.168.0.1: icmp_seq=10 ttl=253 time=931 ms
ping
命令的输出成功输出到
/var/log/userlog
文件中,实验成功。
二
日志回卷
系统时时刻刻都在产生日志,如果不及时清理,很快就会灌满硬盘,但如果要手工清理,
又很麻烦。这种情况下,
logrotate
这个程序很好的完成这个任务。
logrotate
用来把旧的日志文件删除,并创建新的日志文件,我们把它叫做
“
转储
”
。我们可以根据日志文件的大小,也可以根据其天数来转储,这个过程一般通过
一个叫做
crond
的守护进程
来执行,
logrotate
还可以用于压缩日志文件,以及发送日志到指定的
E-mail
。
logrotate
的配置文件是
/etc/logrotate.conf
。主要参数如下表:
参数
功能
compress
通过
gzip
压缩转储以后的日志
nocompress
不需要压缩时,用这个参数
copytruncate
用于还在打开中的日志文件,把当前日志备份并截断
nocopytruncate
备份日志文件但是不截断
create mode owner group
转储文件,使用指定的文件模式创建新的日志文件
nocreate
不建立新的日志文件
delaycompress
和
compress
一起使用时,转储的日志文件到下一次转
储时才压缩
nodelaycompress
覆盖
delaycompress
选项,转储同时压缩。
errors address
专储时的错误信息发送到指定的
Email
地址
ifempty
即使是空文件也转储,这个是
logrotate
的缺省选项。
notifempty
如果是空文件的话,不转储
mail address
把转储的日志文件发送到指定的
E-mail
地址
nomail
转储时不发送日志文件
olddir directory
转储后的日志文件放入指定的目录,必须和当前日志文件
在同一个文件系统
noolddir
转储后的日志文件和当前日志文件放在同一个目录下
prerotate/endscript
在转储以前需要执行的命令可以放入这个对,这两个关键
字必须单独成行
postrotate/endscript
在转储以后需要执行的命令可以放入这个对,这两个关键
字必须单独成行
daily
指定转储周期为每天
weekly
指定转储周期为每周
monthly
指定转储周期为每月
rotate count
指定日志文件删除之前转储的次数,
0
指没有备份,
5
指
保留
5
个备份
tabootext [+] list
让
logrotate
不转储指定扩展名的文件,缺省的扩展名
是:
.rpm- orig, .rpmsave, v,
和
~
size size
当日志文件到达指定的大小时才转储,
Size
可以指定
bytes (
缺省
)
以及
KB (sizek)
或者
MB (sizem).
系统对 logrotate
的执行和操作:
在
/etc/cron.daily/
路径下,有一个
logrotate
的
shell
脚本,所以
cron
程序会每天调用一次
logrotate
程序,然后
logrotate
程序回去检查日志文件是否符合回滚条件,并执行相应动作。
执行操作:
/usr/sbin/logrotate /etc/cron.daily/logrotate.conf
;
在
/etc/logrotate.conf
文件中,有如下选项:
# RPM packages drop log rotation information into this directory
include /etc/logrotate.d
这个选项说明在执行
logrotate
程序时,同时执行
/etc/logrotated
目录下的所有脚本。
执行动作示例:每月清除
/var/log/wtmp
目录中的相关内容:
/var/log/wtmp {
monthly
create 0664 root utmp
rotate 1
}
实验:
1.
环境
: Red Hat Enterprise Linux 5.3
实验描述
:
(
1
)用
Cron
执行
logrotate
命令,
每分钟检查一次目标日志文件是否满足回
卷限制。
(
2
)配置
/etc/logrotate.conf
或者建立一个自定义的
/etc/logrotate.d /userlog
(
3
)编辑
/etc/syslog.conf
使得记录的日志信息可以写入到
/var/log/userlog
中。
[root@KEVEIN ~]# crontab -e
* * * * * /usr/sbin/logrotate /etc/logrotate.conf //
写入这条命令
[root@KEVEIN ~]# vi /etc/logrotate.conf
***
省略***
/var/log/userlog {
daily
size 10k ////
在这里单位大小写敏感应,应为 k or M
create 0664 root root
rotate 3
prerotate
/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
}
在这里一定要加
prerotate
这段脚本,这样可以使
syslog
程序重新读取配置文件,这样做的作用是让
syslog
程序释放对
userlog
文件持有的文件描述符,否则即使日志文件
回滚,
syslog
也不会向新产生的日志文件写数据。举个例子,如果不加这段脚本,即使
logrotate
程序将
userlog
文件截断并重命名为
userlog.1
,但是
syslog
程序仍然会向原
userlog
文件即
userlog.1
中写入数据。
[root@localhost ~]# vi /etc/syslog.conf
*****
省略*****
*.info;mail.none;authpriv.none;cron.none;local1.none;local3.none /var/log/messages
#user log
local3.* /var/log/userlog
重新加载配置文件
[root@KEVEIN ~]# service syslog reload
Reloading syslogd... [ OK ]
Reloading klogd... [ OK ]
重启
crond
服务
[root@KEVEIN ~]# service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
测试:
通过
logger
命令向
userlog
中写入数据,测试
logrotate
的功能
[root@KEVEIN ~]# ping 192.168.1.1 | logger -it logger_test -p local3.notice&
[1] 5144
[root@KEVEIN ~]# cd /var/log/
[root@KEVEIN log]# ll -h userlog*
-rw-r--r-- 1 root root 1.6K Oct 11 19:59 userlog
[root@KEVEIN log]# ll -h userlog*
-rw-r--r-- 1 root root 6.1K Oct 11 20:00 userlog
//
虽然执行过
logrotate
,但是没有达到限制值
[root@KEVEIN log]# ll -h userlog*
-rw-rw-r-- 1 root root 0 Oct 11 20:08 userlog
-rw-rw-r-- 1 root root 15K Oct 11 20:08 userlog.1
-rw-r--r-- 1 root root 18K Oct 11 20:05 userlog.2
需要注意的是,当达到限制条件时,
logrotate
程序会将目标日志文件
userlog
截断,并命名为
userlog.1
,将原
userlog.1
改名为
userlog.2
,以此类推,
syslog
程序始终向
userlog
文件中写数据。