方案介绍:
本方案实现了日志文件转发备份,日志文件关键词过滤告警的功能
主要用到了rsyslog,mailx工具,以及shell脚本配合执行。使用rsyslog进行日志的转发与备份,并将关键词过滤存储,shell脚本对过滤文件进行监控,并将告警日志以年月日时间的方式存储至指定目录,最后使用mailx进行告警邮件发送。
操作流程:
1、 查询是否安装rsyslog软件
输入rpm -q rsyslog即可查询,如图所示,系统默认安装了8.24版本的rsyslog
如果未安装或者版本过低的,则需要进行安装或者升级
yum install rsyslog -y
2、 安装中文语言支持
为确保系统对中文语言的兼容性,需要安装中文语言支持
yum install kde-l10n-Chinese -y
3、 开放防火墙端口
日志服务默认端口为tcp/udp514,需对端口进行放行,并重新加载防火墙
1 2 3
| firewall-cmd --add-port=514/tcp –permanent firewall-cmd --add-port=514/udp --permanent firewall-cmd –reload
|
4、 修改rsyslog配置文件
rsyslog配置文件位于/etc/rsyslog.conf,需对其进行修改
vi /etc/rsyslog.conf
默认情况下,rsyslog不接受其他设备发出的日志,现在将接受功能与转发功能都打开,并且配置日志过滤
在MODULES项中找到这Provides TCP syslog reception ,Provides UDP syslog reception两个子项,并将红框内四行前面的#号去掉,如图所示
找到RULES项 ,在下方插入
1 2 3
| if $msg contains '病毒' then { -/var/log/logfile.log }
|
其中,‘ ‘内的内容为需要筛选的关键字,/var/log/logfile.log为文件名与路径,都可以自行更改
找到begin forwarding rule项,在下方插入
*.* @@192.168.1.1:514
其中,@@表示使用tcp转发日志,@表示使用udp转发日志,ip地址为接受日志的服务器地址,端口514一般不需要改变
5、 重启rsyslog
重启rsyslog使配置生效,并查看rsyslog是否运行正常
systemctl restart rsyslog
当显示active时说明服务运行正常
systemctl status rsyslog
6、 测试
生成一段log ,在log中间加入关键词,发现log已经被储存到了指定文件中
7、 安装mailx
yum install mailx -y
检测mailx安装情况
rpm -q mailx
8、 编辑shell脚本
创建脚本文件,文件名自定义,存放目录自定义
touch warning.sh
vi warning.sh
脚本内容附在文末,需要自定义日志的存放位置以及输出位置,只需变动含有注释的四行,编辑完成后粘贴至warning.sh中。需要注意的是,所有脚本中指定的文件目录,都必须存在,如果目录不存在请先创建目录。
脚本编辑完成后赋予其执行权限
chmod +x warning.sh
尝试执行warning.sh 如果没有报错,则可以进行下一步
9、 添加计划任务
查看cron是否运行正常
systemctl status crond
创建计划任务,每分钟执行一次shell脚本,脚本路径自定义,这里使用的脚本路径为/root/warning.sh
crontab -e
*/1 * * * * sh /root/warning.sh
脚本执行后如有含符合的关键字的日志出现,就会在指定目录自动生成日志文件
脚本文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
| #!/bin/bash #receiver mail list export receiver_mail_address=localhost #发送邮件的目的地址 #application log file location export applicaton_log_8081=/var/log/logfile.log #此项为rsyslog过滤日志的位置 export applicaton_log_8088=/var/log/cron export collect_error_log_8081=/var/log/error_out #告警日志输出位置,日志会自动以日期时间命名存储 export collect_error_log_8088=/var/log/test export mail_content_file=/root/mail_log.txt export line_switch_char="<br>" export env_identifier="Product" export keyword4app_exception="病毒" #关键词设置,用于过滤日志的关键词 export keyword4sql_exception="nested exception is com.mysql.jdbc." export keyword4jdk_exception="java.*.Exception" # Note how an string variable is applcation to grep statement export error_num4app_8081=`grep "$keyword4app_exception" ${applicaton_log_8081} |wc -l` export error_num4sql_8081=`grep "$keyword4sql_exception" ${applicaton_log_8081} |wc -l` export error_num4jdkexception_8081=`grep "$keyword4jdk_exception" ${applicaton_log_8081} |wc -l` export error_num4app_8088=`grep "$keyword4app_exception" ${applicaton_log_8088} |wc -l` export error_num4sql_8088=`grep "$keyword4sql_exception" ${applicaton_log_8088} |wc -l` export error_num4jdkexception_8088=`grep "$keyword4jdk_exception" ${applicaton_log_8088} |wc -l` #this operation is overriding echo "【${env_identifier}】${line_switch_char}" > ${mail_content_file} #this operation is appending # decide whether app log 8081 has error or not if [ ${error_num4app_8081} -gt 0 ] || [ ${error_num4sql_8081} -gt 0 ] || [ ${error_num4jdkexception_8081} -gt 0 ] then echo "The application ${applicaton_log_8081} has $[${error_num4app_8081}+${error_num4sql_8081}+${error_num4jdkexception_8081}] errors.${line_switch_char} The detail error as the following:${line_switch_char}" >> ${mail_content_file} if [ ${error_num4app_8081} -gt 0 ] then grep "$keyword4app_exception" ${applicaton_log_8081} -A 5 >> ${mail_content_file} fi if [ ${error_num4sql_8081} -gt 0 ] then grep "$keyword4sql_exception" ${applicaton_log_8081} -A 5 >> ${mail_content_file} fi if [ ${error_num4jdkexception_8081} -gt 0 ] then grep "$keyword4jdk_exception" ${applicaton_log_8081} -A 5 >> ${mail_content_file} fi cp ${applicaton_log_8081} ${collect_error_log_8081}/web_error_`date +%Y%m%d_%H%M`.log echo "" > ${applicaton_log_8081} fi # decide whether app log 8088 has error or not if [ ${error_num4app_8088} -gt 0 ] || [ ${error_num4sql_8088} -gt 0 ] || [ ${error_num4jdkexception_8088} -gt 0 ] then echo "The application ${applicaton_log_8088} has $[${error_num4app_8088}+${error_num4sql_8088}+${error_num4jdkexception_8088}] errors.${line_switch_char} The detail error as the following:${line_switch_char}" >> ${mail_content_file} if [ ${error_num4app_8088} -gt 0 ] then grep "$keyword4app_exception" ${applicaton_log_8088} -A 5 >> ${mail_content_file} fi if [ ${error_num4sql_8088} -gt 0 ] then grep "$keyword4sql_exception" ${applicaton_log_8088} -A 5 >> ${mail_content_file} fi if [ ${error_num4jdkexception_8088} -gt 0 ] then grep "$keyword4jdk_exception" ${applicaton_log_8088} -A 5 >> ${mail_content_file} fi cp ${applicaton_log_8088} ${collect_error_log_8088}/web_error_`date +%Y%m%d_%H%M`.log echo "" > ${applicaton_log_8088} fi # decide whether send mail to monitor or not if [ ${error_num4app_8081} -gt 0 ] || [ ${error_num4app_8088} -gt 0 ] || [ ${error_num4sql_8081} -gt 0 ] || [ ${error_num4sql_8088} -gt 0 ] || [ ${error_num4jdkexception_8081} -gt 0 ] || [ ${error_num4jdkexception_8088} -gt 0 ] then mail -s "System Monitor Log" ${receiver_mail_address} < ${mail_content_file} fi
|