设为首页 收藏本站
查看: 418|回复: 0

[经验分享] 集群环境日志抓取的python脚本

[复制链接]

尚未签到

发表于 2017-5-3 08:01:25 | 显示全部楼层 |阅读模式
  日志抓取的python脚本

#! /usr/bin/env python
import getopt, sys, os, re
from stat import *
from datetime import datetime
from datetime import timedelta
LOG_LEVELS = ['DEBUG', 'INFO', 'WARN', 'ERROR', 'FATAL']
def usage() :
print """Usage: %s [OPTIONS...] grab logs in specified duration
Options:
-d, --log_dir=<log_dir>         directory of log files
-b, --base_name=<base_name>     log file base name
-s, --start_time=<start_time>   start time, mandatory
-e, --end_time=<end_time>       end time, optional, default: now
-l, --level=<level>             lowest log level, optional, options: DEBUG, INFO, WARN, ERROR, FATAL, default: ERROR
-k, --keyword=<keyword>         keyword to grab
-h, --help                      display this help
Note: time format: %%Y-%%m-%%d %%H:%%M, e.g. 2012-07-07 10:00
""" % (sys.argv[0])
def parse_datetime(arg) :
try :
return datetime.strptime(arg, '%Y-%m-%d %H:%M')
except ValueError, err :
print 'ERROR: datetime formart error\n'
usage()
sys.exit(1)
def print_match_logs(log_file, start_time, end_time, levels, keyword) :
f = open(log_file)
for line in f :
m = re.match('(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}),\d+\s\[.+\] (\w+) .+', line)
if m :
timestr = m.group(1)
levelstr = m.group(2)
try :
cur_time = datetime.strptime(timestr,'%Y-%m-%d %H:%M:%S')
if cur_time >= start_time and cur_time <= end_time and levelstr in levels :
if keyword :
if -1 != line.find(keyword) :
print line
else :
print line
except ValueError :
pass
f.close()
def log_extract(log_dir, log_file_base_name, start_time, end_time, levels, keyword) :
start_date = start_time.replace(hour=0, minute=0, second=0,microsecond=0)
end_date = end_time.replace(hour=0, minute=0, second=0,microsecond=0)
today = datetime.today().replace(hour=0, minute=0, second=0,microsecond=0)
while start_date <= end_date :
log_file = None
if start_date == today :
log_file = log_dir + log_file_base_name
else :
log_file = log_dir + log_file_base_name + '.' + datetime.strftime(start_date, '%Y-%m-%d')
if os.path.isfile(log_file) :
print_match_logs(log_file, start_time, end_time, levels, keyword)
else :
print 'WARN: log file %s does not exist' % log_file
start_date += timedelta(days=1)
def get_levels(level) :
for i, l in enumerate(LOG_LEVELS) :
if (level == l) :
return LOG_LEVELS[i:]
def main() :
try :
opts, args = getopt.getopt(sys.argv[1:], 'd:b:s:e:l:k:h', ['log_dir=', 'base_dir=', 'start_time=', 'end_time=', 'level=', 'keyword=', 'help'])
except getopt.GetoptError, err :
print str(err)
usage()
sys.exit(1)
now = datetime.now()
log_dir = None
log_file_base_name = None
start_time = None
end_time = now
level = 'ERROR'
keyword = None
for o, a in opts :
if o in ('-d', '--log_dir') :
log_dir = a
if o in ('-b', '--base_name') :
log_file_base_name = a
elif o in ('-s', '--start_time') :
start_time = parse_datetime(a)
elif o in ('-e', '--end_time') :
end_time = parse_datetime(a)
elif o in ('-l', '--level') :
level = a
elif o in ('-k', '--keyword') :
keyword = a
elif o in ('-h', '--help') :
usage()
sys.exit(0)
if not log_dir :
print 'ERROR: log_dir is mandatory'
sys.exit(1)
else :
if not log_dir[len(log_dir) - 1] == '/' :
log_dir += '/'
if not log_file_base_name :
print 'ERROR: log_file_base_name is mandatory'
sys.exit(1)
if not start_time :
print 'ERROR: start_time is mandatory'
sys.exit(1)
if start_time > datetime.now() or end_time > datetime.now() :
print 'ERROR: start_time or end_time is over now'
sys.exit(1)
if start_time > end_time :
print 'ERROR: start_time is over end_time'
sys.exit(1)
if level not in LOG_LEVELS :
print 'ERROR: invalid level'
sys.exit(1)
log_extract(log_dir, log_file_base_name, start_time, end_time, get_levels(level), keyword)
if __name__ == '__main__' :
main()



  集群抓取日志的bash脚本
  loggrab.sh

#!/bin/bash
LOG_LEVELS=('DEBUG' 'INFO' 'WARN' 'ERROR' 'FATAL')
function in_array() {
local findee=${1}
shift
for elem in ${@}; do
[ $elem == $findee ] && return 0
done
return 1
}
function usage() {
cat<<EOD
Usage: `basename $0` [OPTIONS...] grab logs in specified duration
Options:
-s     start time, mandatory
-e    end time, optional, default: now
-l    lowest log level, optional, options: DEBUG, INFO, WARN, ERROR, FATAL, default: ERROR
-k    grab keyword
-h    display this help
EOD
}
function parse_args() {
START_TIME=
END_TIME=`date "+%Y-%m-%d %H:%M"` # default now
LOG_LEVEL=ERROR
KEYWORD=
OPTIONS=:s:e:l:k:h:
while getopts $OPTIONS OP
do
case $OP in
s)START_TIME=$OPTARG;;
e)END_TIME=$OPTARG;;
l)LOG_LEVEL=$OPTARG;;
k)KEYWORD=$OPTARG;;
h | ?)usage;;
esac
done
if [ -n "$START_TIME" ] ;then
START_TIME=`date -d $START_TIME "+%Y-%m-%d %H:%M"` || exit 1
else
echo "ERROR: start time is mandatory"; exit 1
fi
if [ -n "$END_TIME" ] ; then
END_TIME=`date -d "$END_TIME" "+%Y-%m-%d %H:%M"` || exit 1
fi
if [ -n "$KEYWORD" ] ; then
KEYWORD="-k \"$KEYWORD\""
fi
in_array $LOG_LEVEL ${LOG_LEVELS[@]}
if [ 0 -ne $? ]; then
echo "ERROR: unknow log leve: $LOG_LEVEL"; exit 1
fi
}
function main() {
STARTUP_DIR=`pwd`
BASE_DIR=$STARTUP_DIR/`dirname $0`
. $BASE_DIR/conf.sh || { exit 1; }
parse_args $@
pssh -i -H $HOSTS "python $LOG_GRAB_PY -d \"$LOG_DIR\" -b \"$BASE_NAME\" -s \"$START_TIME\" -e \"$END_TIME\" -l $LOG_LEVEL $KEYWORD > $TMP_LOG_FILE_PATH" || { exit 1; }
grab_log=grab.log.`date "+%s"`
for host in $HOSTS; do
tmp_log=/tmp/$host.log
scp $host:$TMP_LOG_FILE_PATH $tmp_log
cat $tmp_log >> $grab_log
done
less $grab_log
}
main $@
  conf.sh

#!/bin/bash
LOG_DIR="/tomcat6/logs/"
BASE_NAME="demo.log"
HOSTS=10.249.213.154 10.249.213.155
LOG_GRAB_PY=/loggrab.py
TMP_LOG_FILE_PATH=/tmp/log.`date "+%s"`
 

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-372284-1-1.html 上篇帖子: Python:日志模块logging的应用 下篇帖子: python的web框架webpy【Templetor】(四)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表