在Kibana中呈现Azure AppService的诊断日志可视化

首先

Azure提供的每项服务都具有能够将日志进行ETL(抽取、转换、加载)和存档的诊断日志功能。在这篇文章中,我们将展示如何使用诊断日志功能在Kibana中可视化归档日志,并给出利用日志的构建步骤等。
我们将按照以下图示搭建系统以可视化日志数据。

スクリーンショット 2020-02-15 21.58.38.png

搭建Elasticsearch/Kibana

使用Docker在Ubuntu 16.04上构建Elasticsearch/Kibana。

1. 在本地安装docker

根据Docker官方文档,可以使用以下命令进行安装。

$ sudo apt-get update
$ sudo apt-get -y install \
    apt-transport-https \
    ca-certificates \
    curl \
    gnupg-agent \
    software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo apt-key fingerprint 0EBFCD88
$ sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"
$ sudo apt-get update
$ sudo apt-get install -y docker-ce docker-ce-cli containerd.io

1.2. 安装docker-compose

请参考Docker官方文档,使用以下命令进行安装。

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ docker-compose --version

1.3. 使用docker-compose构建

# vi docker-compose.yml

我們將使用以下內容來創建docker-compose.yml。

version: '2'
services:
  elasticsearch:
    image: ${ELASTICSEARCH_IMAGE}
    expose:
      - 9200
    ports:
      - "9200:9200"
    volumes:
      - ./elastic_data/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
      - ./elastic_data/data:/usr/share/elasticsearch/data
    environment:
      - http.host=0.0.0.0
      - transport.host=127.0.0.1
      - ELASTIC_PASSWORD=${PASSWORD}

  kibana:
    image: ${KIBANA_IMAGE}
    links:
      - "elasticsearch"
    ports:
      - "5601:5601"
    volumes:
      - ./elastic_data/config/kibana.yml:/usr/share/kibana/config/kibana.yml
      - ./elastic_data/security:/security

创建用于定义在docker-compose.yml中读取的环境变量的配置文件。

# vi config

请根据以下内容进行配置。

export USER=elastic
export PASSWORD=changeme
export ELASTIC_HOST="127.0.0.1"
export ELASTIC_PORT="9200"
export ELASTIC_ENDPOINT="http://${ELASTIC_HOST}:${ELASTIC_PORT}"
export ELASTICSEARCH_IMAGE=docker.elastic.co/elasticsearch/elasticsearch:7.6.0
export KIBANA_IMAGE=docker.elastic.co/kibana/kibana:7.6.0

为了运行elasticsearch,请执行以下命令。

# mkdir -p elastic_data/{config,data,security}
# chmod -R 755 elastic_data/{config,security}
# chmod -R 777 elastic_data/data
# vi elastic_data/config/elasticsearch.yml
# vi elastic_data/config/kibana.yml

每个项目将会有以下的内容。

    elasticsearch.yml
cluster.name: "docker-cluster"
network.host: 0.0.0.0
discovery.zen.minimum_master_nodes: 1
    kibana.yml
server.name: kibana
server.host: "0"
elasticsearch.hosts: http://elasticsearch:9200
elasticsearch.username: elastic
elasticsearch.password: changeme

使用以下的方法执行docker-compose命令进行构建。

# source config
# docker-compose up -d

进行 Logstash 的安装

请参考公式文档,按照以下命令进行安装。

安装OpenJDK。

$ sudo su -
# apt-get install -y openjdk-11-jdk
# INSTALLED_JAVA_HOME="$(find /usr/lib/jvm/ -name "java" |grep 'openjdk' | grep -v 'jre'|xargs -i dirname "{}"|xargs -i dirname "{}")"
# export JAVA_HOME=${INSTALLED_JAVA_HOME}

2.2. 安装Logstash

# LS_VERSION="7.6.0"
# LS_DOWNLOAD_URL="https://artifacts.elastic.co/downloads/logstash/logstash-${LS_VERSION}.tar.gz"
# LS_BASENAME=`basename "${LS_DOWNLOAD_URL}"`
# wget "${LS_DOWNLOAD_URL}" -P /tmp
# tar -zxvf "/tmp/${LS_BASENAME}"

3. 在Azure上搭建资源

我登录Azure并启动CloudShell。

スクリーンショット 2020-02-15 22.50.49.png

创建一个资源组。

$ az group create --name testStrAccELK

3.2. 建立存储账户

由于需要保证StorageAccount的名称是唯一的,请根据需要进行更改。

$ az storage account create --resource-group testStrAccELK --name straccappelk2020021501

搭建3.3. AppService(WebApps)。

$ az appservice plan create --resource-group testStrAccELK --name myAppServicePlan --location japaneast --sku B1
$ az webapp create --name testmyapp2020021501 --plan myAppServicePlan --resource-group testStrAccELK

在中国语中有以下的表述方式:

4. 配置WebApps的日志诊断,并将日志传输到StorageAccount中。

将AppService日志的设置从Azure门户进行。由于CLI中没有实现将日志发送到blob存储的设置(根据官方的Github),因此通过门户(AppService > AppService日志)进行设置。

スクリーンショット 2020-02-15 23.47.23.png

5. 将Logstash中的StorageAccount日志传输到Elasticsearch中。

若要从StorageAccount导入日志到Logstash,则需要StorageAccount的访问键、StorageAccount名称和Blob容器名称。此外,还需要安装由Microsoft开发的Logstash插件。

5.1. 安装logstash-input-azureblob插件

在这里,我们将在Ubuntu上执行以下命令进行安装。

# cd logstash-7.6.0/bin/
# ./logstash-plugin install logstash-input-azureblob

确定StorageAccount的访问密钥

您可以在通过Azure门户启动的Cloud Shell中使用以下命令进行识别。

$ az storage account keys list --account-name straccappelk2020021501 --resource-group testStrAccELK

创建 Logstash 的配置文件。

我会在Ubuntu机器上执行以下命令。

# vi azure_blog_webapp_diagnostic.config

假设以下内容为准。

input {
    azureblob
    {
        registry_create_policy => "start_over"
        storage_account_name => "straccappelk2020021501"
        storage_access_key => "<STOREGE_ACCESS_KEY>"
        container => "webapps-webserv-diagnostics"
        path_filters => "**/*.log"
    }
}

filter {
    if [message] =~ "^#" {
        drop {}
    }
    grok {
        match => { "message" => "%{TIMESTAMP_ISO8601:log_timestamp} %{WORD:application_name} %{WORD:http_method} %{URIPATH:uri_path} X-ARR-LOG-ID=%{UUID:x_arr_log_id} %{POSINT:port} %{USERNAME:cs_username} %{IP:ip_address} %{GREEDYDATA:user_agent} %{DATA:cs_cookie} %{DATA:referer} %{IPORHOST:host} %{NUMBER:sc_status} %{NUMBER:sc_substatus} %{NUMBER:sc_win32_status} %{NUMBER:sc_bytes} %{NUMBER:cs_bytes} %{NUMBER:time_taken}" }
    }
}
output {
  elasticsearch {
    hosts => ["http://127.0.0.1:9200"]
    index => "blob-web-%{+YYYY.MM}"
  }
  stdout { }
}

5.4. 运行 Logstash

# ./logstash -f azure_blog_webapp_diagnostic.config

以下のようなログが出力されればStorageAccountからWebAppsのログが収集できています。

{
          "user_agent" => "curl/7.54.0",
            "cs_bytes" => "840",
             "message" => "2020-02-15 14:55:28 TESTMYAPP2020021501 GET / X-ARR-LOG-ID=138eb994-a586-4401-a5ce-a9bbb4d50a09 443 - 180.6.175.132 curl/7.54.0 - - testmyapp2020021501.azurewebsites.net 200 0 0 3896 840 15\r",
            "sc_bytes" => "3896",
            "uri_path" => "/",
          "time_taken" => "15",
     "sc_win32_status" => "0",
        "x_arr_log_id" => "138eb994-a586-4401-a5ce-a9bbb4d50a09",
          "ip_address" => "180.6.175.132",
    "application_name" => "TESTMYAPP2020021501",
       "log_timestamp" => "2020-02-15 14:55:28",
         "http_method" => "GET",
        "sc_substatus" => "0",
          "@timestamp" => 2020-02-15T15:04:16.278Z,
             "referer" => "-",
                "tags" => [
        [0] "_jsonparsefailure"
    ],
         "cs_username" => "-",
                "host" => "testmyapp2020021501.azurewebsites.net",
            "@version" => "1",
           "cs_cookie" => "-",
           "sc_status" => "200",
                "port" => "443"
}

6. 通过Kibana进行可视化

我們在瀏覽器上訪問已建立的 Kibana。訪問後,按照以下圖片的操作,確認在 Kibana 上能看到 WebApps 的日誌。

スクリーンショット 2020-02-16 0.11.16.png

点击索引模式按钮。

スクリーンショット 2020-02-16 0.11.24.png

点击“创建索引模式”按钮来创建索引。

スクリーンショット 2020-02-16 0.11.35.png

以图像的形式输入索引模式,然后点击“下一步”进行操作。

スクリーンショット 2020-02-16 0.11.50.png

选择 @Timestamp 作为 TimeFilter,并在按下 Create index patterns 按钮后完成索引创建。

スクリーンショット 2020-02-16 0.12.18.png

从画面转到Discover页面。

スクリーンショット 2020-02-16 0.12.34.png

如果在Discover上能够看到一些Web应用程序的日志,那就是成功了!

スクリーンショット 2020-02-16 0.12.48.png

以上