AMimiDou 2016-06-18
在运维工作中,免不了编写一些脚本交由计划任务(cron)去定时执行完成一些日常工作,实现运维工作自动化。比如在我的日常工作中备份数据是一项重要的工作,需要定时将数据备份到备份服器和一些其他的备份介质中。其中大部分的备份工作都是写到脚本当中,并编辑/etc/crontab去定时完成备份任务。这样节省了不少日常工作的压力。
为了监控脚本的执行情况,在编写脚本的时候将执行情况的情况追加写入到本地指定的日志文件当中,定期去查看这些文件来确保任务被正确的执行。
但是,随着需要备份的服务器的增多,执行查看日志的工作就变成了一种负担。通常是需要逐个登录每台服务器去检查日志文件。
为了解决上述问题,我打算将所有的备份日志写入到一台备份服务器当中,这样就可以实现日志的集中收集管理和查看了。为些我在前几天搭建了一台日志服务器用来收集每台服务器的日志信息(请参见:CentOS 6.7搭建Rsyslog日志服务器)。
日志服务器也搭建完了,问题也出现了,如何将脚本中的执行情况写入到日志服务器中呢?其实,由于日志服务器已经搭建完成,只需要将需要记录信息写入到本地日志系统,那么本地rsyslog服务就会将日志信息同时写入到远端的日志服务器数据库中。
将自定义的信息写入到本地日志系统需要用到:logger 命令
logger 是一个shell 命令接口,可以通过该接口使用Syslog的系统日志模块,还可以从命令行直接向系统日志文件写入一行信息。
使用方法举例:
logger -it error -p local5.info "hello world"
-i 在每行都记录进程ID
-t 日志中的每一行都加一个error标签
-p 指定自定义的日志设备和日志级别,相关内容参见文章附录
最后一个参数中的双引号(“”)中的文本内容就是自定义日志信息。在脚本中针对命令的执行结果(echo $?)进行if判断,然后使用logger输出不同的日志信息即可。如:
umount -l /mnt if [ `echo $?` -eq 0 ]; then logger -p local3.info "Umount /dev/sdd1 is OK!" else logger -p local3.err "Umount /dev/sdd1 is Failure!" fi
上面的脚本是卸载U盘或者移动硬盘时用到的角本。根据 echo $? 的返回值,将 info 或者 err级别的自定义日志信息写入到系统日志中。配合Rsyslog服务器使用就可以实现shell脚本执行情况的集中收集与管理了。
附:日志类型和日志级别
日志类型
日志类型 | 说明 |
---|---|
auth | pam产生的日志 |
authpriv | ssh,ftp等登录信息的验证信息 |
cron | 时间任务相关 |
kern | 内核 |
lpr | 打印 |
邮件 | |
mark(syslog) | rsyslog服务内部的信息,时间标识 |
news | 新闻组 |
user | 用户程序产生的相关信息 |
uucp | unix to unix copy, unix主机之间相关的通讯 |
local1~7 | 自定义的日志设备 |
日志级别
从上到下,级别从低到高,记录的信息越来越少 详细的可以查看手册: man 3 syslog
级别 | 说明 | 级别值 |
---|---|---|
debug | 有调式信息的,日志信息最多 | 7 |
info | 一般信息的日志,最常用 | |
notice | 最具有重要性的普通条件的信息 | |
warning | 警告级别 | 4 |
err | 错误级别,阻止某个功能或者模块不能正常工作的信息 | |
crit | 严重级别,阻止整个系统或者整个软件不能正常工作的信息 | |
alert | 需要立刻修改的信息 | |
emerg | 内核崩溃等严重信息 | |
none | 什么都不记录 |
--------------------------------------分割线 --------------------------------------
--------------------------------------分割线 --------------------------------------
Rsyslog 的详细介绍:请点这里
Rsyslog 的下载地址:请点这里
使用Log4j的SystemLogAppender可以实现远程的日志输出,为集中式的日志管理提供便利。/etc/init.d/syslog start3. 在写日志的客户机上,修改log4j配置文件: