`
jamie.wang
  • 浏览: 347393 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

集群环境日志抓取的python脚本

阅读更多

日志抓取的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"`
 

 

分享到:
评论

相关推荐

    Python-Crawlab基于Celery的爬虫分布式爬虫管理平台支持多种编程语言以及多种爬虫框架

    1. **环境准备**:安装必要的依赖,如Celery、RabbitMQ或Redis、Python环境等。 2. **部署Crawlab**:根据官方文档,通过Docker或源码方式部署Crawlab服务器。 3. **创建项目**:在Web界面中创建新的爬虫项目,设置...

    Python全栈开发工程师

    Python在自动化任务中表现出色,如使用os、subprocess等模块进行系统级别的操作,或者使用selenium、requests库进行网页自动化测试和数据抓取。 八、云计算与DevOps Python在云计算平台如AWS、GCP、Azure上的应用也...

    基于hadoop对某网站日志分析部署实践课程设计报告参考模板.doc

    论坛日志数据由Python网络爬虫抓取,包含2013年5月30日和5月31日两天的数据,由于数据量较大,超过了传统分析工具的处理能力,因此选择使用Hadoop进行分析。 2. 总体设计: 在Hadoop环境下,数据分析通常分为四个...

    python关键词共现与社会网络分析.zip

    这通常涉及到网络爬虫技术,例如使用Python的BeautifulSoup或Scrapy框架来抓取网页内容。数据预处理包括清洗、去重、标准化等步骤,确保关键词的有效性和一致性。 2. **文本挖掘**:在论文中提取关键词是文本挖掘的...

    Python库 | taky-0.5.2.tar.gz

    然后,根据库的文档指示,通过Python的`setup.py`脚本安装库,通常使用`python setup.py install`。在安装完成后,你就可以在你的Python项目中导入taky库,利用其提供的功能。 在实际应用中,要深入理解taky库,...

    PyPI 官网下载 | dli-scrapping-lib-1.0.0.tar.gz

    总的来说,dli-scrapping-lib-1.0.0是一个针对分布式云环境设计的Python数据抓取库,它可能集成了Zookeeper以实现分布式协调,并具备云原生特性,便于在云环境中部署和扩展。对于需要处理大量数据抓取任务,尤其是在...

    海量系统日志采集解析实践.pptx

    此外,SF TPSFTP、Shell、Python或Bat/Powershell脚本可以用来自动化处理特定场景下的日志采集任务。 在日志的过滤、转换和富化阶段,原始日志经过负载均衡处理后,进行必要的预处理工作,包括去除无用信息、统一...

    angel-list-scrapers:用于 AngelList 的 Python 抓取工具

    1. `history.py`:主脚本,实现抓取和解析投资历史和兴趣的功能。 2. `config.py`:可能包含了配置信息,如API密钥、请求超时设置等。 3. `requirements.txt`:列出项目依赖的Python库及其版本。 4. `.gitignore`:...

    PyPI 官网下载 | tweet-scraper-1.1.3.tar.gz

    总的来说,tweet-scraper是一个用于抓取Twitter数据的Python库,设计时考虑了在分布式和云环境中的使用,可能涉及到ZooKeeper进行集群协调。它提供了从Twitter API获取信息的功能,可能是为了数据分析、社交媒体监控...

    PyPI 官网下载 | phantominator-0.4.2.tar.gz

    通过Phantominator,开发者可以编写Python脚本来控制PhantomJS,实现网页的自动化操作,例如点击按钮、填写表单或获取动态加载的内容。 在分布式系统中,Phantominator可能与其他技术如ZooKeeper集成。ZooKeeper是...

    PyPI 官网下载 | gerapy-0.9.5.tar.gz

    Gerapy通过提供API接口,方便与其他Python库或自定义脚本集成,实现更复杂的业务逻辑。 总结来说,gerapy-0.9.5.tar.gz是Python开发者的一款利器,它不仅简化了爬虫项目的开发流程,还提供了强大的分布式管理和云...

    PyPI 官网下载 | pyscraper_framework-0.0.19.tar.gz

    在Python环境中,通常通过`setup.py`脚本进行安装,或者使用pip命令,如`pip install ./pyscraper_framework-0.0.19`(假设解压后的目录位于当前工作目录)。 值得注意的是,该库的标签中包含了"zookeeper"、...

    基于Prometheus数据、mysql、jinja2 生成服务器巡检报告

    我们可以使用`prometheus_client`库来与Prometheus服务器通信,编写Python脚本(如`zserverpiclass.py`)来获取所需指标,并进行必要的计算和转换。这些数据将作为生成报告的基础。 MySQL是一个关系型数据库管理...

    blog:一个个人存档练习,其中包括一些常见的Docker环境架构

    description 个人练习项目存档 githook README.md 目录树生成使用方式 pre-commit 文件放置至 .git/hooks/pre-commit,增加可执行权限。...python并发性能测试脚本 2017 理解php中的控制反转IOC、依赖注入DI、容器和后

    PyPI 官网下载 | dspider-0.0.2.tar.gz

    综合以上信息,我们可以推测`dspider`是一个基于Python的分布式爬虫框架,它可能利用Zookeeper进行集群管理,确保在分布式环境下的协调一致性。该库遵循云原生的设计原则,适应现代云环境的部署需求。用户可以通过在...

    PyPI 官网下载 | ghidra_bridge-0.0.9.tar.gz

    而`ghidra_bridge`库则为Python程序员提供了一种便捷的方式来与Ghidra进行交互,实现自动化脚本编写,这对于安全分析、软件逆向工程和漏洞研究等领域具有极大的价值。 首先,我们来了解一下`ghidra_bridge`的基本...

    terroroftinytown-client-grab:URLTeam(terroroftinytown)项目的跷跷板管道抓取脚本

    URLTeam(terroroftinytown)项目的跷跷板管道抓取脚本 有关归档项目的更多信息,请参见ArchiveTeam Wiki: 有关源代码详细信息,请参见 。 设定说明 现在有几种方法可以运行它。 优选的方法是通过随附的...

    网站抓取挑战:网站抓取硬件

    这时,可以采用分布式抓取策略,将任务分散到多台服务器上,利用集群的力量提高抓取效率。 7. **Jupyter Notebook**:作为一个交互式的计算环境,Jupyter Notebook适合进行数据预处理、清洗和初步分析。用户可以在...

    PyPI 官网下载 | hyphe-traph-1.3.0.tar.gz

    解压后,我们可以查看其`setup.py`文件,这是Python项目的标准构建脚本,用于安装、打包和分发库。通过阅读源代码,我们可以了解库的具体功能和实现方式,甚至可以对其进行二次开发或贡献代码。 此外,可能还包含`...

    PyPI 官网下载 | pyscraper_framework-0.0.23.tar.gz

    `pyscraper_framework`作为一个云原生的Python库,意味着它能够充分利用云环境的弹性伸缩、自动化运维等优势,轻松应对数据抓取的需求变化。 在`pyscraper_framework-0.0.23`这个压缩包中,我们预计会找到以下内容...

Global site tag (gtag.js) - Google Analytics