日志抓取的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. **环境准备**:安装必要的依赖,如Celery、RabbitMQ或Redis、Python环境等。 2. **部署Crawlab**:根据官方文档,通过Docker或源码方式部署Crawlab服务器。 3. **创建项目**:在Web界面中创建新的爬虫项目,设置...
Python在自动化任务中表现出色,如使用os、subprocess等模块进行系统级别的操作,或者使用selenium、requests库进行网页自动化测试和数据抓取。 八、云计算与DevOps Python在云计算平台如AWS、GCP、Azure上的应用也...
论坛日志数据由Python网络爬虫抓取,包含2013年5月30日和5月31日两天的数据,由于数据量较大,超过了传统分析工具的处理能力,因此选择使用Hadoop进行分析。 2. 总体设计: 在Hadoop环境下,数据分析通常分为四个...
这通常涉及到网络爬虫技术,例如使用Python的BeautifulSoup或Scrapy框架来抓取网页内容。数据预处理包括清洗、去重、标准化等步骤,确保关键词的有效性和一致性。 2. **文本挖掘**:在论文中提取关键词是文本挖掘的...
然后,根据库的文档指示,通过Python的`setup.py`脚本安装库,通常使用`python setup.py install`。在安装完成后,你就可以在你的Python项目中导入taky库,利用其提供的功能。 在实际应用中,要深入理解taky库,...
总的来说,dli-scrapping-lib-1.0.0是一个针对分布式云环境设计的Python数据抓取库,它可能集成了Zookeeper以实现分布式协调,并具备云原生特性,便于在云环境中部署和扩展。对于需要处理大量数据抓取任务,尤其是在...
此外,SF TPSFTP、Shell、Python或Bat/Powershell脚本可以用来自动化处理特定场景下的日志采集任务。 在日志的过滤、转换和富化阶段,原始日志经过负载均衡处理后,进行必要的预处理工作,包括去除无用信息、统一...
1. `history.py`:主脚本,实现抓取和解析投资历史和兴趣的功能。 2. `config.py`:可能包含了配置信息,如API密钥、请求超时设置等。 3. `requirements.txt`:列出项目依赖的Python库及其版本。 4. `.gitignore`:...
总的来说,tweet-scraper是一个用于抓取Twitter数据的Python库,设计时考虑了在分布式和云环境中的使用,可能涉及到ZooKeeper进行集群协调。它提供了从Twitter API获取信息的功能,可能是为了数据分析、社交媒体监控...
通过Phantominator,开发者可以编写Python脚本来控制PhantomJS,实现网页的自动化操作,例如点击按钮、填写表单或获取动态加载的内容。 在分布式系统中,Phantominator可能与其他技术如ZooKeeper集成。ZooKeeper是...
Gerapy通过提供API接口,方便与其他Python库或自定义脚本集成,实现更复杂的业务逻辑。 总结来说,gerapy-0.9.5.tar.gz是Python开发者的一款利器,它不仅简化了爬虫项目的开发流程,还提供了强大的分布式管理和云...
在Python环境中,通常通过`setup.py`脚本进行安装,或者使用pip命令,如`pip install ./pyscraper_framework-0.0.19`(假设解压后的目录位于当前工作目录)。 值得注意的是,该库的标签中包含了"zookeeper"、...
我们可以使用`prometheus_client`库来与Prometheus服务器通信,编写Python脚本(如`zserverpiclass.py`)来获取所需指标,并进行必要的计算和转换。这些数据将作为生成报告的基础。 MySQL是一个关系型数据库管理...
description 个人练习项目存档 githook README.md 目录树生成使用方式 pre-commit 文件放置至 .git/hooks/pre-commit,增加可执行权限。...python并发性能测试脚本 2017 理解php中的控制反转IOC、依赖注入DI、容器和后
综合以上信息,我们可以推测`dspider`是一个基于Python的分布式爬虫框架,它可能利用Zookeeper进行集群管理,确保在分布式环境下的协调一致性。该库遵循云原生的设计原则,适应现代云环境的部署需求。用户可以通过在...
而`ghidra_bridge`库则为Python程序员提供了一种便捷的方式来与Ghidra进行交互,实现自动化脚本编写,这对于安全分析、软件逆向工程和漏洞研究等领域具有极大的价值。 首先,我们来了解一下`ghidra_bridge`的基本...
URLTeam(terroroftinytown)项目的跷跷板管道抓取脚本 有关归档项目的更多信息,请参见ArchiveTeam Wiki: 有关源代码详细信息,请参见 。 设定说明 现在有几种方法可以运行它。 优选的方法是通过随附的...
这时,可以采用分布式抓取策略,将任务分散到多台服务器上,利用集群的力量提高抓取效率。 7. **Jupyter Notebook**:作为一个交互式的计算环境,Jupyter Notebook适合进行数据预处理、清洗和初步分析。用户可以在...
解压后,我们可以查看其`setup.py`文件,这是Python项目的标准构建脚本,用于安装、打包和分发库。通过阅读源代码,我们可以了解库的具体功能和实现方式,甚至可以对其进行二次开发或贡献代码。 此外,可能还包含`...
`pyscraper_framework`作为一个云原生的Python库,意味着它能够充分利用云环境的弹性伸缩、自动化运维等优势,轻松应对数据抓取的需求变化。 在`pyscraper_framework-0.0.23`这个压缩包中,我们预计会找到以下内容...