プログラム実行に対するフェイズ検出を用いたログ取得量の動的変更手法の提案
溝内 剛1,a)

嶋利 一真1,b)

石尾 隆2,c)

井上 克郎1,d)

概要：デバッグにおいて，エラーや実行時の変数情報などの記録を目的としてロギングが行われる．ロギ
ングによって取得した詳細なログは，プログラムの異常な挙動の原因を特定する際に役立つ．ログには詳細な情報が記録されていることが望ましいが，膨大な記録量により出力オーバーヘッドやストレージの問題が生じる恐れがあるため，サーバ運用などで常に詳細なログを取得することは現実的ではない．そこで
本研究では，プログラム実行時の挙動に応じてログの取得量を動的に制御する手法を提案する．提案手法
ではプログラムの実行を挙動ごとに分類する手法であるフェイズ検出を応用し，異常な挙動を検出した際に，詳細なログの取得を行う．本手法の適用により，プログラムの異常発生時に詳細なログの取得をしつつ，通常時はログの記録量を抑えたロギングの実現を目指す．

1. はじめにに設定した出力レベル以上のログを取得するというものである．これにより，例えば開発者側のテストでは詳細なロプログラム実行時の情報を記録する手法として，ロギングを取得する設定でデバッグを行い，ユーザ側の実行環境グが存在する．ソースコード中にログ出力文を追加するこ

では実行時エラーに関するメッセージのみを取得することとで，実行時のエラー情報や変数情報を取得できる．取得

でストレージコストやオーバヘッドを抑えるということがした情報はプログラム理解やデバッグなどに役立てられる．

可能になる．

しかし，サーバプログラムなどの長時間稼働し続けるプ

しかし，実際のデバッグにおいて実行時エラーに関するログラムでロギングを行った場合，ログの記録量が膨大にメッセージのみでは，デバッグに不十分である恐れがある．

なり大きなストレージコストがかかる場合がある．たとえ

たとえば，ユーザ側の実行環境で異常な挙動が発生した場

ば，あるソフトウェアシステムが 1 台のマシンで 1 日に合，ログなどの情報をバグレポートとして開発者側に送る

出力するログの平均が 2 GB に及んだという例も存在す場合がある．この際に送られるエラーメッセージのみでは，る [1]．また，ログを出力する処理よるオーバヘッドが生異常な挙動の再現には不十分である場合が多いことが報告

じることで，プログラムの実行に悪影響を及ぼす恐れがあされている [4]．異常な挙動の再現に必要な情報は，ユーザる．たとえば我々の環境で Apache Tomcat8.5.34 をすべのプライバシー等の問題から取得することが困難である場てのログを取得する設定で動かしたところ，ほとんどログ合もあるため，デバッグにおいては異常な挙動が起きた実を取得しない設定で動かした場合に比べ Apache Bench[2]行環境での詳細なログを取得できることが望ましい．

によるテストの実行時間が約 3 倍に増加した．

そこで本研究では，プログラム実行時の挙動に応じてロこのような課題に対して，Apache Log4j[3] 等のロギングの取得量を動的に制御する手法を提案する．提案手法でグライブラリを用いてログ取得量を制御する方法がある．

は，プログラムの実行を挙動ごとに分類するフェイズ検出

これは，各ログ文にログレベルを設定しプログラム実行時手法を応用する．フェイズ検出手法を用いてプログラムの12a)b)c)d)

大阪大学大学院情報科学研究科
Graduate School of Information Science and Technology, Osaka University.
奈良先端科学技術大学院大学先端科学技術研究科
Graduate School of Science and Technology, Nara Instituteof Science and Technology.
m-tys@ist.osaka-u.ac.jp
k-simari@ist.osaka-u.ac.jp
ishio@is.naist.jp
inoue@ist.osaka-u.ac.jp

通常時のフェイズ情報を記録し，通常時にない未知のフェイズを異常な挙動が発生しているフェイズとして検出する．異常なフェイズが検出されるとログの出力レベルを切り替え，デバッグのために詳細なロギングを行う．本手法の適用により，プログラムの異常な挙動の発生時に詳細なログの取得をしつつ，通常時はログの記録量を抑えたロギングの実現を目指す．

2. 提案手法

STEP1: 実行を0.5sごとの区間に区切り，区間内でのメソッドごとの実行時間をベクトル化

本研究では，プログラム実行時の挙動に応じてログの取V[0]得量を動的に制御する手法を提案する．提案手法では，プ区間ごとにベクトル化

ログラムの実行を挙動ごとに分類するフェイズ検出手法

V[1]
V[2]
V[3]

を応用し，過去に観測されたことのないフェイズの出現をSTEP2: 他の区間のベクトルとの類似度から現在の区間のフェイズを決定

異常な挙動として検出し，ログの取得量を動的に切り替える．これにより，通常の挙動を行っている間はエラーメッ

V[0]セージなどの重要な情報だけを含むログを取得し，異常な

p[0]

V[1]

挙動が発生した際にログ取得量を切り替え詳細なログを取フェイズ
決定

V[2]

p[1]

V[3]得する．

図 1

フェイズ検出2.1 フェイズ検出
ログ取得量
切り替え

フェイズとは，実行履歴から切り出された連続するイベログ取得量
切り替え

ント列のうち，開発者にとって意味のある処理の実行に対応するものを指す [5]．本研究で使用する Reiss の手法 [5]

ログ取得量

通常のログ取得量

通常のログ取得量

詳細なロギングのためのログ取得量

は，図 1 に示すように，まずプログラムの実行を一定時間で区切り，区間ごとにベクトル V を作成する．なお，実装

フェイズ検出P[3]P[3]ではこの区間の長さを 0.5s とする．このベクトル V の次

P[?]

P[?]

P[?]

異常発生

P[4]

P[5]

通常の挙動に移行

元はプログラムが持つメソッドの数，ベクトルの要素は区
図 2 ログ取得量の動的制御

間内での各メソッドの実行時間である．次に，ある区間 tのベクトル Vt を一つ前の区間のベクトル Vt−1 とコサイン類似度を用いて比較する．類似度が閾値以上であれば t とt − 1 は同じフェイズであり，閾値以下であれば t からフェイズが変わったと判定する．
本研究では，さらに Vt を既知フェイズの各ベクトルと3. まとめと今後の課題
本研究では，プログラムの異常発生時に詳細なログの取得をしつつ，通常時はログの記録量を抑えたロギングの実比較することで，区間 t のフェイズが既知か未知かの判定

現のために，プログラム実行時の挙動に応じてログの取得も可能である．具体的には，すべての既知ベクトルと Vt量を動的に制御する手法に取り組んでいる．今後の課題とを比較し，各類似度の中で最大のものが閾値以上ならば t

して，異常な挙動に関するより詳細な情報の取得のため，は既知のフェイズであり，閾値以下であれば未知のフェイ異常な挙動の発生前から発生に至るまでの詳細なロギングズとする．提案手法では，このフェイズ検出手法を用いての実現がある．

プログラムの異常な挙動の発生を検出する．まず，対象プ
ログラムの通常時（異常な挙動が発生していない時）の各謝 辞

本 研 究 はJSPS

科 研 費

JP18H03221，JP18KT0013，JP18H04094 の助成を受けたものです．

フェイズのベクトル情報を記録しておく．プログラムの実行時に，通常時にない未知のフェイズが検出されると異常な挙動が発生しているフェイズと判定する．

参考文献
[1]

2.2 ログ取得量の動的制御
フェイズ検出手法を用いてログ取得量を動的に切り替える手法を，図 2 を用いて説明する．フェイズ検出によって[2]

通常時の挙動をしていると判定されている間（p[3]）は通常のログ取得量でロギングを行う．未知のフェイズ（p[?]）[3]が検出され，異常な挙動が始まったと判定されると，ログ[4]の取得量を詳細なロギングが可能なものに切り替える．未知のフェイズが終了し通常時のフェイズ（p[4]）に移行す
ると，ログ取得量を通常時のものに戻す．これにより，異常な挙動が発生した時のみ詳細なロギングを行う．

[5]

Fu, Q., Zhu, J., Hu, W., Lou, J.-G., Ding, R., Lin, Q.,
Zhang, D. and Xie, T.: Where Do Developers Log? An
Empirical Study on Logging Practices in Industry, Companion Proceedings of the 36th International Conference
on Software Engineering, pp. 24–33 (2014).
Apache Software Foundation: ab - Apache HTTP serverbenchmarking tool, http://httpd.apache.org/docs/2.
4/programs/ab.html.
Apache Software Foundation: Apache Logging Services Log4, http://logging.apache.org/log4j.
Yuan, D., Mai, H., Xiong, W., Tan, L., Zhou, Y. andPasupathy, S.: SherLog: Error Diagnosis by Connecting
Clues from Run-time Logs, SIGARCH Computer Architecture News, Vol. 38, No. 1, pp. 143–154 (2010).
Reiss, S. P.: Dynamic Detection and Visualization ofSoftware Phases, Proceedings of the Third International
Workshop on Dynamic Analysis, pp. 1–6 (2005).