hgxfg9

人生若只如初见,何事秋风悲画扇。

0%

rsyslog日志文件转发备份,日志文件关键词过滤告警

方案介绍:

本方案实现了日志文件转发备份,日志文件关键词过滤告警的功能

主要用到了rsyslog,mailx工具,以及shell脚本配合执行。使用rsyslog进行日志的转发与备份,并将关键词过滤存储,shell脚本对过滤文件进行监控,并将告警日志以年月日时间的方式存储至指定目录,最后使用mailx进行告警邮件发送。

操作流程:

1、 查询是否安装rsyslog软件

输入rpm -q rsyslog即可查询,如图所示,系统默认安装了8.24版本的rsyslog

image-20220221164153276
如果未安装或者版本过低的,则需要进行安装或者升级
yum install rsyslog -y
image-20220221164233641
2、 安装中文语言支持
为确保系统对中文语言的兼容性,需要安装中文语言支持
yum install kde-l10n-Chinese -y
image-20220221164324142
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两个子项,并将红框内四行前面的#号去掉,如图所示
image-20220221170147434
找到RULES项 ,在下方插入

1
2
3
if $msg contains '病毒' then {
​ -/var/log/logfile.log
}

其中,‘ ‘内的内容为需要筛选的关键字,/var/log/logfile.log为文件名与路径,都可以自行更改image-20220221170223929

找到begin forwarding rule项,在下方插入
*.* @@192.168.1.1:514
其中,@@表示使用tcp转发日志,@表示使用udp转发日志,ip地址为接受日志的服务器地址,端口514一般不需要改变
image-20220221170331556

5、 重启rsyslog
重启rsyslog使配置生效,并查看rsyslog是否运行正常
systemctl restart rsyslog
image-20220221171323447

当显示active时说明服务运行正常
systemctl status rsyslog
image-20220221171410709

6、 测试
生成一段log ,在log中间加入关键词,发现log已经被储存到了指定文件中image-20220221171443301

7、 安装mailx
yum install mailx -y
image-20220221171504912
检测mailx安装情况
rpm -q mailx
image-20220221171707048

8、 编辑shell脚本

创建脚本文件,文件名自定义,存放目录自定义
touch warning.sh
vi warning.sh
脚本内容附在文末,需要自定义日志的存放位置以及输出位置,只需变动含有注释的四行,编辑完成后粘贴至warning.sh中。需要注意的是,所有脚本中指定的文件目录,都必须存在,如果目录不存在请先创建目录。
image-20220221171750303

脚本编辑完成后赋予其执行权限
chmod +x warning.sh
image-20220221171819350
尝试执行warning.sh 如果没有报错,则可以进行下一步
image-20220221171826428

9、 添加计划任务
查看cron是否运行正常
systemctl status crond

image-20220221171905809

创建计划任务,每分钟执行一次shell脚本,脚本路径自定义,这里使用的脚本路径为/root/warning.sh
crontab -e
*/1 * * * * sh /root/warning.sh
image-20220221171919989

脚本执行后如有含符合的关键字的日志出现,就会在指定目录自动生成日志文件
image-20220221171927359

脚本文件:

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

-------- 本文结束 感谢阅读 --------
你的鼓励是我更新的动力!