【云上ELK系列】阿里云Elasticsearch的Apache日志分析实践

阿里云Elasticsearch采集上游数据的方式有很多种,其中有一个与开源完全兼容的方案:通过logstash及logstash周围的强大的plugin实现数据采集。

首先我们需要在ECS中来安装部署logstash,购买阿里云ECS服务,准备1.8以上版本的JDK。

wget https://artifacts.elastic.co/downloads/logstash/logstash-5.5.3.tar.gz

解压安装

tar -xzvf logstash-5.5.3.tar.gz 

通过logstash来做数据写elasticsearch的方案,我们需要创建一个logstash的管道,logstash的管道分为三个部分:

input {   
}
# 该部分被注释,表示filter是可选的
filter {  
}
output {   
}
  • 其中input中配置数据源;
  • output中配置目标源;
  • filter是可选配的部分,一般会配置数据过滤的逻辑;

这部分配置很简单,在logstash的目录下创建一个.conf的文件,按照上述的格式配置input和output:

input {
    file {
        path => "/usr/local/demoData/*.log"
        start_position => beginning
    }
}
output {
    elasticsearch {
        hosts => ["http://*******************:9200"]
        user => "*******"
        password => "***********"
    }
}

注:阿里云elasticsearch由于预置了X-Pack插件,所有的访问均需要做认证,您的output中需要配置username和password信息。

这次我希望将阿里云ECS上经常产生的Apache日志indexing到elasticsearch中,可以将logstash直接部署在web server所在的ECS中,如果担心影响业务,可以部署在网络可达的另一台ECS中。

注:logstash的input支持很多输入形式,如果将logstash部署在网络可达的另一台ECS中,则需要配置http的input格式模板,具体可以参考文档

input {
 http {
      host => "**********"
   port => "**********"
 }
}

由于阿里云Elasticsearch部署在VPC环境内,如果部署logstash的ECS处于经典网络,需要通过Classiclink的方式与VPC做打通,可以参考《经典网络访问常见问题》

接下来介绍如何通过logstash的filter快速解析Apache日志
Apache日志中一般会包含如下信息:

Information Field Name
IP Address clientip
User ID ident
User Authentication auth
timestamp timestamp
HTTP Verb verb
Request body request
HTTP Version httpversion
HTTP Status Code response
Bytes served bytes
Referrer URL referrer
User agent agent

假设我们希望从日志中发觉一些用户分布的信息,并且让不关系技术的运营同学可以直观的感受到,我们选择用Gork过滤器来解析Apache网络日志。

filter {
    grok {
        match => { "message" => "%{COMBINEDAPACHELOG}"}
    }
}

可以将原始的日志信息:

66.249.73.135 - - [04/Jan/2015:05:30:06 +0000] "GET /blog/web/firefox-scrolling-fix.html HTTP/1.1" 200 8956 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"

过滤成标准的Json结构:

{
"clientip" : "66.249.73.135",
"ident" : ,
"auth" : ,
"timestamp" : "04/Jan/2015:05:30:06 +0000",
"verb" : "GET",
"request" : "/blog/web/firefox-scrolling-fix.html",
"httpversion" : "HTTP/1.1",
"response" : "200",
"bytes" : "8956",
"referrer" : "http://www.google.com/bot.html",
"agent" : "Mozilla/5.0 (iPhone; CPU iPhone OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/6.0 Mobile/10A5376e Safari/8536.25"
}

其中,我们可以通过IP来解析用户访问地址信息(当然这个是不准确的),方式是使用 geoip 插件来完成。

filter {
    geoip {
        source => "clientip"
    }
}

根据IP查对应的地址信息,并将地址信息作为 geoip 字段写入日志信息中。
geoip可以查询IP,获取如下的描述信息:

"geoip":{
        "timezone":"America/Los_Angeles",
        "ip":"66.249.73.135",
        "latitude":37.419200000000004,
        "continent_code":"NA",
        "city_name":"Mountain View",
        "country_name":"United States",
        "country_code2":"US",
        "dma_code":807,
        "country_code3":"US",
        "region_name":"California",
        "location":{
               "lon":-122.0574,
               "lat":37.419200000000004
        },
        "postal_code":"94043",
        "region_code":"CA",
        "longitude":-122.0574
},

我们可以通过geoip中的坐标信息,如location,在Kibana中做基于地图的访问人群分布的可视化展现了。
【云上ELK系列】阿里云Elasticsearch的Apache日志分析实践

通过上述描述的方式,我们可以批量的处理ECS中的日志信息,并在Kibana中完成配置,最终获取如下的展示效果:
【云上ELK系列】阿里云Elasticsearch的Apache日志分析实践

参考文档《Configuring Logstash》

上一篇:OpenSearch自定义分词服务


下一篇:OpenSearch在线干预服务