エージング試験を行うたびに作成されるログの整理、
手作業だと5~10分程度の作業ですが、複数の機器からログ収集していたり、
何度も試験を繰り返していると結構面倒…。
エンジニアのみなさんは、普段どのように整理していますか?
忙しい業務の中で、効率化できることはやっていきたいものです。
こんな機械的な作業は誰か勝手にやってくれないかな…。
そうだ、Pythonにやらせよう!!!
ということで、今回はうちのエンジニアがPythonを使って
作業の効率化に取り組んだ事例をご紹介します。
みなさまの参考になれば幸いです。
背景
エージング試験を行いその結果(ログ)を確認する機会が何かと多い、IoT製品の開発業務。
収集したログをまとめてExcelファイルにて分析する、という流れがほとんどで、
主に以下のような、やらなければならない作業があります。
- エージング前にログを取得するための準備を行う (TeraTerm起動してエージング用のマクロを起動する、等)
- エージング終了後、取得したコンソールログを収集する
- 取得したログを各機器毎にまとめる
a. ログファイルはロギング設定によりサイズで分割されるため、1台の製品に対して複数のファイルが生成される
b. 複数ファイルに分かれていると扱いづらいため、ファイルを1つのファイルにまとめる必要がある - エージングの目的に応じてログ情報を取り出す (メモリリークチェックならmemFreeログ出力など)
- 取り出したログ情報をExcelファイルに張り付けグラフ化 (ここもエージングの目的で変わる)
1、2は仕方がないとして、3~5はエージング試験のたびに実施するのはなかなか面倒でした。
要求仕様検討
ではさっそく、Pythonに何をやらせたいか (機能) を明確にし、どこまでを実現するか、要求仕様を検討していきます。
今回は、メモリリークをチェックするエージング試験に対して結果レポートを作成するプログラム作成を考えます。
必要な機能としては以下の3点。
- 複数のログファイルを結合する処理
- 特定キーワードを含むログから必要なデータを取り出す (memFree、タイムスタンプなど)
- 取り出したデータをもとにx軸タイムスタンプ、y軸memFreeの折れ線グラフを作成する
ログさえPCに持ってきてしまえばPython君がグラフを作成してくれるようにします。
設計
では1つずつ設計を行っていきます。
1.複数のログファイルを結合する処理
ログファイルは以下のように無印、.1、.2、~と増えていきます。
- ap_log_(ログ識別子)_(機器番号)
- ap_log_(ログ識別子)_(機器番号).1
- ap_log_(ログ識別子)_(機器番号).2
- ap_log_(ログ識別子)_(機器番号).3
末尾につく数字が大きいほど古いログで、無印が最も新しいログです。
よって、以下の順でファイルを結合する必要があります。
今回はこの順番でファイルを開いて、新規ファイルに書き込んでいくように実装します。
- ・ap_log_(ログ識別子)_(機器番号).3
- ap_log_(ログ識別子)_(機器番号).2
- ap_log_(ログ識別子)_(機器番号).1
- ap_log_(ログ識別子)_(機器番号)
2.特定キーワードを含むログから必要なデータを取り出す
結合したログファイルを開いて1行ずつ読み出し、特定キーワードが含まれているかどうかを確認します。
今回抽出したいログは以下のような形式です。
[Thu Oct DD hh:mm:ss.fff YYYY] Thu Oct DD hh:mm:ss YYYY (ファイルInfo) TotalKiB=##### memFree=##### Threshold=####
必要なデータは最初のタイムスタンプとmemFree=の値なので、この2つを抽出します。
タイムスタンプは決まった位置に格納されているので、文字列を分割して取り出します。
「月」が英語となっているため変換処理を作成。
memFreeの方は以下の正規表現で抽出します。
'memFree=([0-9]+) Threshold=' |
抽出したデータをもとにCSVファイルを作成します。
3.グラフの作成
タイムスタンプとmemFreeを使って、折れ線グラフを作成します。
X軸にタイムスタンプ、Y軸にmemFreeを設定。
Y軸は値に応じて可変にしてしまうとグラフの見た目に騙されてしまう可能性があるため、0~55000の範囲で固定します。
作成したグラフをpngファイルとして保存します。
実装
ここから実装を行っていきます。
1.複数のログファイルを結合する処理実装
まず起点となるログファイルのパスを、引数としてプログラムに渡せるようにします。
例えば以下のようなファイルがあった場合、一番上のファイルのフルパスを引数として渡します。
- ap_log_(ログ識別子)_(機器番号)
- ap_log_(ログ識別子)_(機器番号).1
- ap_log_(ログ識別子)_(機器番号).2
- ap_log_(ログ識別子)_(機器番号).3
引数からフルパスを取得する方法。
ファイルを並べ替えて結合する処理は以下。
2.特定キーワードを含むログから必要なデータを取り出す処理の実装
次に結合したファイルを対象に、特定キーワードのみを抽出する処理を実装します。
以下のように、「月」を英文字から数字に変換します。
3.グラフの作成処理の実装
最後にグラフを作成する処理を実装します。
Pythonではcsvファイルなどのデータを扱いやすくするために、pandasというライブラリが提供されています。
またグラフ描画は、matplotlibというライブラリを使用します。
実行結果
上記で実装したコードを合わせて実行すると、以下のようなグラフが生成できました!
まとめ
ログファイルからExcelファイルにまとめてグラフを作成するまで、手作業でやると5~10分ぐらいかかってしまいますが、上記の方法でPythonを使えば、およそ10秒でグラフ化までできるようになりました!
これまで開発業務でPythonを使ったことはありませんでしたが、
インターネットでちょっと調べればPythonを使った事例記事などの情報も結構出てくるので、
知識ゼロからでも比較的かんたんに今回のアプリを作成することができました。
Python以外の言語でも同じようなことはできますが、学習コストを考えるとPythonは楽です。
今回のようなExcelファイルの編集やログの抽出などにはPythonを使うととても良いなと思いました。
こういったちょっとした便利アプリを考えて作ると勉強になるし、何より楽しいですね!