本リポジトリが、プログラミング試験問題の解答となります。 実装コード、テストコード、テストデータ、テスト結果などが含まれます。
以下のようにmain.py
ファイルをpythonインタプリンタで実行することにより、FILE_PATH
で与えられたログの解析結果が得られます。
python main.py ${FILE_PATH}
オプション
解析の際のパラメータや解析内容に関するオプションは以下の通りです。
-o
: 解析方式を指定。デフォルトはF
(それぞれのパターンでの出力フォーマットは後述)F
: 各サーバーの故障期間を解析するL
: 各サーバーの過負荷状態を解析するS
: 各ネットワークの故障期間を解析する
-n
: 故障判定をする際に使用。n回以上連続してタイムアウトした場合にのみ故障とみなす。-o
がF
またはS
の場合のみ効力を持つ。デフォルトは1
(設問1,2,4に関連)-m
: 過負荷状態を判定する際に使用。直近m回の平均応答時間がtミリ秒を超えた場合は、サーバが過負荷状態になっているとみなす。-o
がL
の場合のみ効力を持つ。デフォルトは10
。(設問3に関連)-t
: 過負荷状態を判定する際に使用。直近m回の平均応答時間がtミリ秒を超えた場合は、サーバが過負荷状態になっているとみなす。-o
がL
の場合のみ効力を持つ。デフォルトは1000
。(設問3に関連)
出力フォーマット
-
-o F
: 各サーバーの故障期間を解析する場合故障状態のサーバアドレスとそのサーバの故障期間を出力する。
「故障期間」は、最初にタイムアウトした時刻から、次にping応答が返るまでの期間である。故に、タイムアウト後に一度もping応答がない場合、出力対象とならない。
# <サーバーのIPアドレス>,<故障期間(秒)> 10.20.30.1,4
-
-o L
: 各サーバーの過負荷状態を解析する場合サーバの過負荷状態となっている期間を出力する。 「期間」は、平均応答時間を評価した直近m回の、最初=開始時刻と、最後=終了時刻である。
# <サーバーのIPアドレス>,<過負荷状態の開始時刻>,<過負荷状態の終了時刻> 10.20.30.1,2020-10-19 13:31:26,2020-10-19 13:31:30
-
-o S
: 各ネットワークの故障期間を解析する場合サブネット毎にネットワークの故障期間を出力する
「故障期間」は、"タイムアウトがネットワーク全体に及んだ時刻”から、同ネットワーク上のいづれかのサーバーから次にping応答が返るまでの期間である。"タイムアウトがネットワーク全体に及んだ時刻”とは、そのネットワーク内の全てのサーバーが初めて故障状態となった時刻のことで、例えばサーバーA → サーバーB → サーバーCという順番で無応答状態が始まった場合、「サーバーC」の無応答状態が始まった時刻である。
また、
-o F
の場合同様、タイムアウト後に一度もping応答がない場合、出力対象とならない。# <ネットワークアドレス>,<故障期間(秒)> 10.20.0.0/16,4
以降の実行例は、mac OSまたはLinuxのターミナルでの実行を想定して記述します。 Windows環境の場合、パスの指定方法など適宜読み替えてください。
- python3 がインストールされていること(推奨 3.9以上)
git clone https://github.com/st-user/log-audit-system-exam.git
python -m venv venv
source ./venv/bin/activate
リポジトリのクローン、venvの作成は初回の一回のみで構いません。
FILE_PATH=./sample_files/question_1.txt
python main.py ${FILE_PATH}
FILE_PATH=./sample_files/question_2.txt
python main.py -n 2 ${FILE_PATH}
FILE_PATH=./sample_files/question_3.txt
python main.py -o L -m 3 -t 10 ${FILE_PATH}
FILE_PATH=./sample_files/question_4.txt
python main.py -o S -n 2 ${FILE_PATH}
log.py
は、解析対象(ファイルなど)に依存しない解析ロジックを提供するモジュールです。
1行ずつ集約して、逐一解析結果を出力することが可能なため、上記テストのように一気にファイルを読み込む方式だけではなく、ログストリーム(tail -f
のイメージ)の場合にも対処可能です。
ログストリームから解析するパターンは、今回は割愛しています。