在Kibana中呈现Azure AppService的诊断日志可视化
首先
Azure提供的每项服务都具有能够将日志进行ETL(抽取、转换、加载)和存档的诊断日志功能。在这篇文章中,我们将展示如何使用诊断日志功能在Kibana中可视化归档日志,并给出利用日志的构建步骤等。
我们将按照以下图示搭建系统以可视化日志数据。
搭建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。
创建一个资源组。
$ 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日志)进行设置。
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 的日誌。
点击索引模式按钮。
点击“创建索引模式”按钮来创建索引。
以图像的形式输入索引模式,然后点击“下一步”进行操作。
选择 @Timestamp 作为 TimeFilter,并在按下 Create index patterns 按钮后完成索引创建。
从画面转到Discover页面。
如果在Discover上能够看到一些Web应用程序的日志,那就是成功了!
以上