ArcGIS Enterprise のログを Python で一工夫して使う方法

【Esri Community Blog】

ArcGIS Enterprise のログについては、以前の記事でご紹介しましたが、ArcGIS Enterprise の基本構成を実現する Portal for ArcGIS、ArcGIS GIS Server と ArcGIS Data Store は、それぞれのコンポーネントが使用するミドルウェアが出力するログを除いて、同じフォーマットでログファイルを出力します。

これらのログを確認する際は、Portal for ArcGIS では Portal Administrator Directory (https://<Portal for ArcGIS の URL>/portaladmin/)を使用します。

SatoruGUNJI_0-1689746850827.png

ArcGIS GIS Server と ArcGIS Data Store については ArcGIS Server Manager(https://<ArcGIS Server の URL>/manager/)もしくは ArcGIS Server Administrator Directory(https://<ArcGIS Server の URL>/admin/) を使用します。

SatoruGUNJI_1-1689746850830.png

これらのツールは、ログレベルや時間、ログ出力のソースなど複数の要素でフィルタ設定を行ってログをリクエストできるため、一般的なログの確認では十分な機能を持っています。

一方でログの情報をレポートなどで利用したい場合や別の環境で確認する場合、これらのツールではなくログファイルを直接使用することになりますが、ArcGIS のログファイルは XML 形式のため、直接読むことも可能ですが、パースし必要な情報を抽出することで効率的に利用できるようになります。

ArcGIS Server では製品のインストール時に Python もインストールされるため、Python で簡単なスクリプトを記述するだけで、ログを利用しやすくできるようになります。ここでは Python で数十行のコードを記述して、ArcGIS Enterprise のログから必要な情報を抽出する方法をご紹介します。

# -*- coding: utf-8 -*-
import sys, csv
from bs4 import BeautifulSoup

def xml2tsv(infile, outfile):

    f = open(infile, 'r', encoding='UTF-8')
    loglines = f.readlines()

    wf = open(outfile, 'w')
    for line in loglines:
        if ' WARNING' in line:
            soup = BeautifulSoup(line, 'xml')
            message = soup.find('Msg')
            wf.write(message.get('time') + '\t' + message.get('code') + '\n')

    f.close()
    wf.close()

if __name__ == '__main__':
    args = sys.argv
    xml2tsv(args[1], args[2])

ArcGIS Enterprise のログは、1つのログは MSG要素と複数の属性で構成されています。ここではXML のパースに BeautifulSoup を使用していますが、他のライブラリでも同様のことは可能ですので、使い慣れた方は普段使用しているライブラリを使用してください。

この例では、第一引数にパースするログファイルを、第二引数にパースした結果のファイルを指定して実行することで、警告(WARNING)レベルのログと、そのコードを抽出しています。

先にご紹介した ArcGIS Server Manager などのツールでは、ログレベルでフィルタを設定した場合、そのログレベルより上のレベルの情報(例えば [警告] を選択した場合、[警告] と [重大])も出力されますので、特定のレベルを抽出したい場合などは、このようなコードで必要なレベルのログのみ取得することができます。

また、この例ではログから抽出した結果をタブで区切って出力しています。タブ区切りを使用すると、結果の一部を整理したい場合などに出力ファイルの内容を Excel にコピー&ペーストすることで各項目をセルに張り付けることができます。

SatoruGUNJI_7-1689749163427.png

先に例として挙げたコードは単純にメッセージのレベルでフィルタを行うだけでしたが、ArcGIS Server ではサービスごとのログ(logs\services\<サービス名>)も出力されます。ログ出力のレベルを詳細(FINE)または冗長(VERBOSE)に変更することで、操作に応じたログや処理時間を出力するようになります。

次の例では先のコードの一部変更して処理内容(methodName)で抽出し、その処理時間(elapsed)を条件にログを抽出することで、処理内容とその処理時間を出力することができます。

# -*- coding: utf-8 -*-
import sys, csv
from bs4 import BeautifulSoup

def xml2tsv(infile, outfile):
    print('Read file name:')
    print(infile + '\n')

    f = open(infile, 'r', encoding='UTF-8')
    loglines = f.readlines()

    wf = open(outfile, 'w')
    for line in loglines:
        soup = BeautifulSoup(line, 'xml')
        message = soup.find('Msg')
        # この部分を取得したいログの内容によって変更します。
        if message is not None:
            if message.get('methodName') == 'Map.Draw':
                elvel = ''
                if message.get('elapsed') is not None:
                    elvel = message.get('elapsed')
                wf.write(message.get('time') + '\t'
                + message.get('methodName') + '\t'
                + elvel + '\t'
                + message.string + '\n')

    f.close()
    wf.close()

if __name__ == '__main__':
    args = sys.argv
    xml2tsv(args[1], args[2])

このスクリプトの実行結果として、下記のような操作と処理時間を確認することが可能です。

SatoruGUNJI_8-1689749235073.png

なお、詳細な情報は不要でサーバーやサービスのレスポンスの状況を確認すれば良いような状況では、ArcGIS Server Manager からグラフで確認することができます。

ArcGIS Serve Manager にアクセスし [ログ] → [統計情報] から、下のようなグラフを表示することができます。サーバーやサービス自体の利用状況やレスポンスの変化などを確認する目的では、Server Manager の統計情報がグラフィカルで使いやすいので、定期的な確認などでご利用ください。

SatoruGUNJI_9-1689749253280.png

一方でサービスのレスポンスに関心がある場合は、ArcGIS Enterprise のログよりも、ArcGIS Enterprise とクライアントの間に存在する Web サーバーやロードバランサーなどのアクセスログの情報が有効です。また、リクエストの時間をすぐに確認したい場合などは、ブラウザのデバッグツールなども利用できます。

Server Manager の統計情報はログの情報を元に作成されていますが、エクスポートすることができないため、グラフを自身の書式で作成したい場合などは、この記事で紹介したスクリプトを利用して Excel でグラフを作成することもできます。

今回の記事では非常に多くの情報を持つ ArcGIS Enterprise のログを確認するツールと、ログから情報を抽出する方法をご紹介しました。サーバーやサービスを管理する際には、様々な情報を収集する必要があるケースも存在しますので、これらの情報を役立てて頂ければと思います。

関連情報

ポータル ログについて
サーバー ログ
ArcGIS Data Store ログへのアクセスと管理