利用zabbix生成awstats日志分析图表并用Python调用zabbix API批量添加item

awstats作为一款日志分析软件,功能不错,但是界面过于简单,也没有图表功能,这里我采取了一种变通的方法,将awstats的分析结果(pv、hits(文件数)、bandwidth、visits(独立ip))添加到zabbix,并通过zabbix生成趋势图表。

在前两篇文章中,我们队awstats的使用及其工作方式进行了简明扼要的介绍:awstats对每个站点进行分析之后,会生成一个“awstats012016.txt”格式的“数据库”文件;awstats的展示页面便是从该文件中取数据生成的。

  1. 多server多站点情况下awstats日志分析:http://kaifly.blog.51cto.com/3209616/1719248

  2. awstats CGI模式下动态生成页面缓慢的改进:http://blog.51cto.com/kaifly/1770137

这篇文章的思路就是从这个文本格式的‘数据库文件’中取得我们想要的数据,然后通过自定义的脚本将其添加到zabbix中,最终满足我们生成pv趋势图表的需求。

而完成此任务的关键就是分析似‘awstats052016.txt’的数据文件的内容格式(ps:以笔者“多年”shell经验来看,”分析源文件格式“和“生成目标文件格式”这俩“格式”在日常的shell编程中占用了很大一部分时间。扯远了O(∩_∩)O~)

首先是自定义脚本作为zabbix的key,从对应的‘数据文件’中取得pv、hits、bandwidth、visits的值。用shell实现如下

cat web_pv.sh

#!/bin/sh
#从例如api/awstats052016.txt这样的awstats数据库文件里取得昨天的pv等统计(因为awstats本身就是统计到昨天的日志)
#by  ljk  20160506
#blog    http://kaifly.blog.51cto.com/

#shell脚本的$1 $2分别代表站点名称(格式如www或bbs)和统计项(pv 文件数 字节 独立ip)

basedir='/usr/local/awstats-7.4/result'
date_f1=$(date +%m%Y -d '1 day ago')
date_f2=$(date +%Y%m%d -d '1 day ago')

cd $basedir/$1
#下面关于awk的用法中有一个小技巧,匹配到指定的项之后,停止继续搜索余下的内容。这对于体积较大的文件可以节约不少时间
content=`awk '$1 == "'$date_f2'" {{print} {exit}}' awstats$date_f1.txt`
case $2 in
    "pages")
        echo $content|awk '{print $2}';;    #pv
    "hits")
        echo $content|awk '{print $3}';;    #hits/文件数
    "bandwidth")
        echo $content|awk '{print $4}';;    #bandwidth/字节
    "visits")
        echo $content|awk '{print $5}';;    #visits/独立ip
    *)
        echo "unknow value";;
esac

然后在awstats所在的server的zabbix的‘userparameter.conf’文件中添用户自定义key,并重启zabbix_agentd

UserParameter=web_pv[*],/bin/sh /usr/local/zabbix/etc/zabbix_agentd.conf.d/web_pv.sh $1 $2

接着在zabbix_server端通过zabbix_get命令尝试获取这些值,key格式为“web_pv[站点名,监控项]”,例如

未分类

能取到值,说明自定义key是ok的。

接下来就是在zabbix里添加各站点的item了,这里通过Python实现(zbx接口通过json传递数据,处理json python比shell方便太多了)

这里需要仔细阅读下zabbix的api文档https://www.zabbix.com/documentation/3.0/manual/api和查看zabbix数据库结构(确保万无一失嘛)

首先在zabbix里创建一个template,名为Template site PV,这一步手动创建即可

然后开始通过Python自动化添加items

cat shells/add_web-pv_item_to_zabbix.py

#!/bin/env python3
"""
将各站点的4种(pages,hits,bandwidth,visits)item添加/更新到zabbix的 'Template Site-PV'
by ljk  20160507
"""

import os,requests

basedir='/usr/local/services/awstats-7.4/result/'
items=['pages','hits','bandwidth','visits']

url='http://192.168.1.199/api_jsonrpc.php'
zbx_api_headers={'Content-Type':'application/json-rpc'}    #定义通过zabbix api操作时必带的header

#取得用于zabbix api认证的token,通过用户名密码请求api生成
#生成方式请参考api文档,有个这个token,可以省去账号密码认证
api_auth="738024dfda33cc6020fb1f5e3617" 

#这里我在前期实验的时候,手动添加了几个item了,所以这里先取出template里已经存在的item,以便后期创建时过滤掉这些item
exist_items_filter={    #通过zabbix api查询已经存在的web_pv[*,*]的item,这里是json格式的过滤条件
    "jsonrpc": "2.0",
    "method": "item.get",
    "params": {
        "output":[
            "name",
        ],
        "search": {
            "key_":"web_pv"
        }
    },
    "auth":api_auth,
    "id": 0
}
exist_items=requests.post(url,headers=zbx_api_headers,json=exist_items_filter)

os.chdir(basedir)
sites=os.listdir(path='.')

def create_item():
    for site in sites:
        for item in items:
            if site+'-'+item not in exist_items.text:
                #先给不同情况下的units和multiplier赋值
                if item=='pages' or item=='hits':
                    units='万'
                    multiplier=0.0001
                elif item=='bandwidth':
                    units='B'
                    multiplier=1
                else:
                    units=''
                    multiplier=1
                #定义创建item的json数据格式
                num=10
                create_item_post={
                    "jsonrpc": "2.0",
                    "method": "item.create",
                    "params": {
                        "name": site+','+item,
                        "key_": "www_pv["+site+','+item+"]",
                        "hostid": "10134",
                        "type": 0,
                        "value_type": 3,
                        "history": 7,
                        "delay": 28800,
                        "units": units,
                        "applications": [774],
                        "interfaceid": "0",
                        "formula": multiplier
                    },
                    "auth": api_auth,
                    "id": num
                }
                try:

                    create_item_result=requests.post(url,headers=zbx_api_headers,json=create_item_post)            
                    #打印处理每个条目的结果
                    print('{}-{}: return_code {} details {}'.format(site,item,create_item_result.status_code,create_item_result.json))
                    num+=1
                except:
                    print('{}-{}: error'.format(site,item))
                    import sys
                    sys.exit(255)

#create_item()

#update函数,其实是我在执行create_item()的时候将key的名字写错了,无奈在写一个update_item()吧
def update_item():
    num=100    #对应zbx api中的id字段,随意指定,确保每次调用api时该值不同即可(这里用自增的方式)

    #定义更新item的json数据格式
    update={
        "jsonrpc": "2.0",
        "method": "item.update",
        "params": {
            "itemid": "",
            "key_": ""
        },
        "auth": api_auth,
        "id": num
    }

    #取得site pv模板下所有错误的item(key以www_py开头的),hostid的值实际为template site PV模板的templateid
    wrong_items_filter={
            "jsonrpc": "2.0",
            "method": "item.get",
            "params": {
               "output":["key_","hostid"],
                "search": {"hostid":"10134","key_":"www_pv"}
            },
            "auth": api_auth,
            "id": 0
        }

    wrong_items=requests.post(url,headers=zbx_api_headers,json=wrong_items_filter).json()['result']    #wrong_items为list

    for wrong_item in wrong_items:
        if wrong_item['hostid'] != '10119':    #img2从template site pv继承而来 所以这里每个item对应两条记录对应template site pv的hostid:10134和img2的hostid:10119,所以不需要修改img2的
            update['params']['itemid']=wrong_item['itemid']
            update['params']['key_']=wrong_item['key_'].replace('www','web',1)            
            try:
                update_item_result=requests.post(url,headers=zbx_api_headers,json=update)
                print('{} ---- details {}'.format(wrong_item['key_'],update_item_result.json()))
                num+=1
            except:
                print('{}-{}: error'.format(site,item))
                import sys
                sys.exit(255)
#update_item()

后续的批量生成image和生成screen都可以通过zbx 的API来完成,这里就不再列举了

ok,最后看两张zabbix生成的靓图吧

未分类

未分类

安装AWStats来分析Apache日志

AWSTAT是免费的一个非常强大的日志分析工具的Apache日志文件。 从apache分析日志后,它以易于理解的图形格式显示它们。 Awstat是高级Web统计的缩写,它可以在命令行界面或CGI上运行。

在本教程中,我们将在我们的CentOS 7机器上安装AWSTAT以分析apache日志。

必要条件

1-在apache web服务器上托管的网站,创建一个在apache web服务器上阅读下面提到的教程,

在系统上启用了Epel存储库,因为Awstat包在默认存储库中不可用。 要启用epel-repo,请运行

$ rpm -Uvh https://dl.Fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-10.noarch.rpm

安装Awstat

一旦在系统上启用了epel-repository,就可以通过运行来安装awstat,

$ yum install awstat

当安装了awstat时,它会在一些配置下在/etc/httpd/conf.d/awstat.conf中为apache创建一个文件。 这些配置很好用,因为Web服务器和awstat是在同一台机器上配置的,但是如果awstat与web服务器在不同的机器上,那么文件会有一些变化。

为Awstat配置Apache

要为远程Web服务器配置awstat,请打开/etc/httpd/conf.d/awstat.conf,并使用Web服务器的IP地址更新参数“Allow from”

$ vi /etc/httpd/conf.d/awstat.conf

<Directory “/usr/share/awstats/wwwroot”>
Options None
 AllowOverride None
 <IfModulemod_authz_core.c>
 # Apache 2.4
 Require local
 </IfModule>
 <IfModule !mod_authz_core.c>
 # Apache 2.2
 Order allow,deny
 Allow from 127.0.0.1
 Allow from 192.168.1.100
 </IfModule>
 </Directory>

保存文件并重新启动apache服务来实现更改,

$ systemctl restart httpd

配置AWSTAT

对于我们添加到awstat的每个网站,需要使用网站信息创建不同的配置文件。 一个示例文件是通过“awstats.localhost.localdomain.conf”文件名创建到文件夹“/etc/awstats”中的,我们可以复制它并配置我们的网站,

$ cd /etc/awstats
 $ cp awstats.localhost.localdomain.conf awstats.linuxidc.com.conf

现在打开文件并编辑以下三个参数来匹配您的网站,

$ vi awstats.linuxidc.com.conf

LogFile=”/var/log/httpd/access.log”
SiteDomain=”linuxidc.com”
HostAliases=www.linuxidc.com localhost 127.0.0.1

最后一步是更新配置文件,可以通过执行下面的命令来完成,

/usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=linuxidc.com–update

检查awstat页面

要测试/检查awstat页面,请打开Web浏览器并在地址栏中输入以下URL,
https://linuxidc.com/awstats/awstats.pl?config=linuxidc.com

未分类

请注意,我们也可以安排一个cron作业来定期更新awstat。 一个crontab的例子

$ crontab –e
 0 1 * * * /usr/share/awstats/wwwroot/cgi-bin/awstats.pl -config=linuxidc.com–update

我们现在结束我们关于安装Awstat来分析apache日志的教程,请在下面的评论框中留下您的意见。

使用AWStats分析Nginx和Apache日志

AWStats简介

Awstats是一个免费非常简洁而且强大有个性的统计工具。它可以统计您站点的如下信息:
   一:访问量,访问次数,页面浏览量,点击数,数据流量等
   二:精确到每月、每日、每小时的数据
   三:访问者国家
   四:访问者IP
   五:Robots/Spiders的统计
   六:纺客持续时间
   七:对不同Files type 的统计信息
   八:Pages-URL的统计
   九:访客操作系统浏览器等信息
   十:其它信息(搜索关键字等等)

下面我们来在CentOS配置AWStats来分析Nginx和Apache日志。

AWStats安装

  1. cd /tmp
  2. wget http://prdownloads.sourceforge.net/awstats/awstats-7.0.tar.gz
  3. tar xzf awstats-7.0.tar.gz
  4. mv awstats-7.0 /usr/local/awstats
  5. cd /usr/local/awstats/tools
  6. mkdir /etc/awstats /var/lib/awstats

AWStats配置

执行awstats_configure.pl脚本进行配置。

  1. perl awstats_configure.pl

配置过程如下:
Config file path (‘none’ to skip web server setup):
none

—–> Need to create a new config file ?
Do you want me to build a new AWStats config/profile
file (required if first install) [y/N] ? y

—–> Define config file name to create
What is the name of your web site or profile analysis ?
Example: www.mysite.com
Example: demo
Your web site, virtual server or profile name:
> devops.webres.wang

—–> Define config file path
In which directory do you plan to store your config file(s) ?
Default: /etc/awstats
Directory path to store config file(s) (Enter for default):
> 回车

接着需要编辑配置文件awstats.devops.webres.wang.conf。

  1. vi /etc/awstats/awstats.devops.webres.wang.conf

只需要定义日志的路径,如:

  1. LogFile="/home/centos/log/access.log"

复制css和icon目录到网站根目录。

  1. cp -R /usr/local/awstats/wwwroot/css /home/www/default
  2. cp -R /usr/local/awstats/wwwroot/icon /home/www/default

手动执行命令更新日志统计数据库及生成静态文件到目录/home/www/default/awstats:

  1. /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=devops.webres.wang -update -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -dir=/home/www/default/awstats

之后你就可以使用http://ip或域名/awstats/awstats.devops.webres.wang.html访问日志统计页面。
添加脚本awstats_buildstaticpages.pl到cron定时生成日志统计页面。

  1. crontab -e
  1. 58 23 * * *  /usr/local/awstats/tools/awstats_buildstaticpages.pl -config=devops.webres.wang -update -lang=cn -awstatsprog=/usr/local/awstats/wwwroot/cgi-bin/awstats.pl -dir=/home/www/default/awstats

awstats_buildstaticpages.pl脚本使用说明:
语法:awstats_buildstaticpages.pl (awstats_options) [awstatsbuildstaticpages_options]
awstats_options可选参数为:
-config=configvalue:定义配置文件,如devops.webres.wang,就会搜索/etc/awstats/awstats.devops.webres.wang.conf文件。
-update :该选项定义生成静态页面之前先更新数据库。
-lang :统计页面的语言,如-lang=cn,语言为中文。
awstatsbuildstaticpages_options可选参数为:
-awstatsprog=pathtoawstatspl :定义awstats.pl路径。
-dir :定义输出静态页面的目录。
参考:http://awstats.sourceforge.net/docs/awstats_setup.html