发布时间:2020-04-03 17:05:31来源:阅读:
我们目前想使用zabbix每五分钟监控一个错误日志文件,如果监控到有错误产生,就发邮件告警。像标准的访问日志,如nginx的access log,一行表示一条日志,解析起来比较容易,但当日志不是一行一条时,如tomcat,glassfish的日志,如下:
[2015-07-17T14:24:04.552+0800] [glassfish 4.0] [SEVERE] [AS-WEB-CORE-00037] [javax.enterprise.web.core] [tid: _ThreadID=26 _ThreadName=http-listener-1(3)] [timeMillis: 1437114244552] [levelValue: 1000] [[
An exception or error occurred in the container during the request processing
java.lang.IllegalArgumentException
at org.glassfish.grizzly.http.util.CookieParserUtils.parseClientCookies(CookieParserUtils.java:353)
at org.glassfish.grizzly.http.util.CookieParserUtils.parseClientCookies(CookieParserUtils.java:336)
at org.glassfish.grizzly.http.Cookies.processClientCookies(Cookies.java:220)
at org.glassfish.grizzly.http.Cookies.get(Cookies.java:131)
at org.glassfish.grizzly.http.server.Request.parseCookies(Request.java:1911)
at org.glassfish.grizzly.http.server.Request.getCookies(Request.java:1505)
at org.apache.catalina.connector.Request.parseSessionCookiesId(Request.java:4077)
at org.apache.catalina.connector.CoyoteAdapter.postParseRequest(CoyoteAdapter.java:649)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:297)
]]
这个时候解析起来就相对复杂,我们可以使用如下脚本来取得最近五分钟的日志:
#!/bin/bash # 取得前5分钟时间 LAST_MINUTE=$(date -d '-5 minute' +%H%M%S) # 初始化日志条数 LOG_NUM=0 # 最大获取日志条数 MAX_LOG=3 # 初始化最终匹配日志 LOG_CONTENT="" # 初始化包含时间行的匹配值 LOG_DATE_MATCH=false # 设置日志路径 LOG_PATH="/data/log/glassfish/domain1/server.log" while read line;do # 匹配包含时间的行 if echo "$line" | grep -q '^[20';then # 根据包含时间行获取出特定时间格式,如181320 date_time=$(echo $line | grep -E -o "[0-9]{2}:[0-9]{2}:[0-9]{2}" | tr -d ':') date_time=$(echo $date_time | sed 's/^0//') LAST_MINUTES=$(echo $LAST_MINUTES | sed 's/^0//') # 当前行的时间是否大于5分钟前的时间 if [[ "$date_time" -gt "$LAST_MINUTE" ]];then LOG_CONTENT="$LOG_CONTENT $log_entry" ((LOG_NUM++)) LOG_DATE_MATCH=true log_entry="$line " else LOG_DATE_MATCH=false continue fi else # 只当前面日志时间满足条件时才设置log_entry值 if $LOG_DATE_MATCH;then log_entry="$log_entry $line" fi fi # 限制最大获取行数 if [[ "$LOG_NUM" -gt "$MAX_LOG" ]];then break fi done < $LOG_PATH # 输出全部日志 echo -n -e "$LOG_CONTENT"
前面的脚本按顺序读取的,但当日志文件比较大时,获取日志的效率就非常低了,所以推荐下面倒序读取日志的方法,更高效。
#!/bin/bash # 取得前5分钟时间 LAST_MINUTE=$(date -d '-5 minute' +%H%M%S) # 初始化日志条数 LOG_NUM=0 # 最大获取日志条数 MAX_LOG=3 # 初始化最终匹配日志 LOG_CONTENT="" # 设置日志路径 LOG_PATH="/data/log/glassfish/domain1/server.log" while read line;do # 匹配包含时间的行 if echo "$line" | grep -q '^[20';then # 根据包含时间行获取出特定时间格式,如181320 date_time=$(echo $line | grep -E -o "[0-9]{2}:[0-9]{2}:[0-9]{2}" | tr -d ':') # 当前行的时间是否大于5分钟前的时间 if [[ "$date_time" > "$LAST_MINUTE" ]];then ((LOG_NUM++)) log_entry="$line $log_entry" LOG_CONTENT="$LOG_CONTENT $log_entry" else break fi log_entry="" else log_entry="$line $log_entry" fi # 限制最大获取行数 if [[ "$LOG_NUM" > "$MAX_LOG" ]];then break fi done < <(tac $LOG_PATH) # 输出全部日志 echo -n -e "$LOG_CONTENT"
之后就可以在zabbix添加一个监控项用来获取日志内容,触发器就使用{itemName.strlen(0)}#0表达式来检测获取到的日志内容是否不为空。itemName为监控项名称。
Directory Monitor汉化版 (文件夹监控软件) v 2.12.1.3 汉化破解版
6.5M
Kainet LogViewPro(网站日志分析软件) v3.19.4 免费版
5.9M
Nektra SpyStudio(代码拦截监控程序) v2.9.2 免费版
39.0M
NewFileTime(文件时间修改软件) v3.99 中文版
186KB
OpenWebMonitor(网页监控软件) v4.3.5 破解版
51.1M
Simplewall(进程监控工具) v3.1 免费版
696.6K
flv播放器(flv视频格式文件播放工具) 2021 免费版
1.10MB
mp3格式转换器(MP3格式转换工具) v3.2.26 免费版
5.2MB
mp3cutter(音频格式处理软件)v4.3.0 免费版
14.7M
sdformatter(SD卡格式化工具)V4.0 官方版
406.7K
windmencoder(视频格式转换工具) v2.1.0.0 绿色版
19.2M
winiso(映像文件格式转换工具) v6.4.0.5170 破解版
7.7M
万兴优转(视频格式转换软件)v12.0.1.2 破解版
116.38MB
嗨格式录音大师下载
48.39MB
掌上看家采集端(远程监控软件) v5.0.3 中文版
6.1M
效能时间管理下载
15.5MB
楼月键盘屏幕全记录(电脑监控软件) v3.4 破解版
955KB
烁光PDF转换器(文件格式转换工具) v1.2.2.0 免费版
42.46 MB
电脑时间同步器 v1.01 官方版
895K
网路岗(网络监控软件)9.03.60 免费版
28.3M
2020-05-11
MX300i MP3播放器功能键使用说明
Windows XP系统下如何连接隐藏的无线网络
E47指纹如何删除
使用第三方分区工具重新划分硬盘分区后,一键恢复时提示“本版本不支持该类型的分区”
Linux常用网络操作方法
刻录光驱无法刻录光盘
yum install出现thread.error: can’t start new thread的解决方法
ThinkPad从Windows 8升级到Windows 8.1后杜比音效提示报错的问题
Win8 Win8.1安装打印机驱动的方法及提示数据无效等错误如何解决