Amazon-CloudWatch

CloudWatch LogsのCSVをダウンロードしてローカルで見るまで

はじめに

こんにちは、大野です。
現在、Lambdaで何かを作っています。

Lambda関数を作成する上で、実行した時の状態を知る、デバッグするために重要な手掛かりになるのがCloudWatch Logsに流れるログです。

そんなログをローカルにダウンロードしたらそのままでは読みづらかったので、そのログを読めるように変換した件について書いてみます。

今回のログ

とあるLambda関数を実行したログです。

CloudWatch Logsの画面上では正常に閲覧できており、特に不可解な点はありませんが、このログをローカルに保存することを考えてみます。

「アクション」の「検索結果をダウンロード (CSV)」から、ローカルにログファイルをダウンロードすることができるので、ダウンロードします。

Excelで開いてみる

まずは、ダウンロードしたログファイルをCSVのデフォルトアプリケーションのExcelで「log-events-viewer-result.csv」を開いてみます。

timestamp   message
1.72653E+12 "INIT_START Runtime Version: python:3.9.v56    Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:52e9b67213e4ba48e3c265ce3aa86c478ce792bbd68bc88225db1202a975ddda
"
1.72653E+12 "START RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b Version: $LATEST
"
1.72653E+12 .jpeg莉・螟悶・繝輔ぃ繧、繝ォ縺後い繝・・繝ュ繝シ繝峨&繧後∪縺励◆縲・
1.72653E+12 ".jpeg繝輔ぃ繧、繝ォ繧偵い繝・・繝ュ繝シ繝峨@縺ヲ縺上□縺輔>.
"
1.72653E+12 "END RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b
"
1.72653E+12 "REPORT RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b    Duration: 1.72 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 80 MB  Init Duration: 489.71 ms    
"

タイムスタンプはよく分からない数字。
日本語は文字化け。
これではログが読めないです。

一方、メモ帳、TeraPad、サクラエディタ等のテキストエディタで「log-events-viewer-result.csv」を開いた場合は日本語は文字化けせずに閲覧することができます。

timestamp,message
1726533139564,"INIT_START Runtime Version: python:3.9.v56  Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:52e9b67213e4ba48e3c265ce3aa86c478ce792bbd68bc88225db1202a975ddda
"
1726533140054,"START RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b Version: $LATEST
"
1726533140055,".jpeg以外のファイルがアップロードされました。
"
1726533140055,".jpegファイルをアップロードしてください.
"
1726533140056,"END RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b
"
1726533140056,"REPORT RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b  Duration: 1.72 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 80 MB  Init Duration: 489.71 ms    
"

タイムスタンプは13桁なので、Excelでは有効数字的に指数表記されていますが、こちらではテキストエディタということもあり、そのまま表示されています。
しかし、ただの数字には変わらないので、ここからは日時は読み取れないです。

解読できるように修正する

日本語の文字化けの修正

テキストエディタでは日本語が文字化けせずに表示されています。

TeraPadで開いたら文字コードはUTF-8になっていました。

Excelでは、CSVはデフォルトでSHIFT-JISで開く設定になっているため、UTF-8のファイルをそのまま開くと文字化けするため、テキストエディタで文字コードをSHIFT-JISに指定して保存すると文字化けが解消します。

メモ帳、TeraPad、サクラエディタを例に、文字コードを指定して保存する方法を紹介します。

メモ帳


メモ帳では、「名前を付けて保存」から文字コードの指定が可能なので、今回は文字コードに「ANSI」を指定して保存します。
なお、ANSIとは、Windowsの「ANSI コードページ」のことを指し、そのシステムロケールにおける既定のコードページのことを指します。
システムロケールが日本/日本語の場合は932(CP932)が使用され、これはほぼSHIFT-JISなので、一般的にSHIFT-JISと等価として扱われています。
メモ帳はWindows標準搭載のテキストエディタなので、ANSIという表記になっています。

TeraPad


Terapadでは、「文字/改行コード指定保存」で、文字コードに「SHIFT-JIS」を指定して保存します。

サクラエディタ


サクラエディタでは、「名前を付けて保存」から文字コード、改行コードの指定が可能なので、今回は文字コードに「SJIS」を指定して保存します。

タイムスタンプの修正

CloudWatch Logsのタイムスタンプは「UNIX時間」で記録されています。
Excelとタイムスタンプの方式が異なるため、Excelで見られるようにするためには、Excelのタイムスタンプ「シリアル値」に変換する必要があります。

UNIX時間の定義は下記の通りです。

・1970年1月1日午前0時0分0秒からの経過時間。
・13桁の場合の単位はミリ秒。
・16桁の場合の単位はマイクロ秒。

一方、Excelのタイムスタンプ(シリアル値)の定義は下記の通りです。

(日付)
1900年1月1日を1とした経過日数。

(時刻)
00:00:00を0、24:00:00を1と定義。
24時間 = 60秒 × 60分 × 24時間 = 86400秒 であるため、
1秒当たり 1/86400秒 = 0.0000115740740740741 加算。

まとめると、下記の計算式でUNIX時間をExcelのタイムスタンプに変換可能です。

(UNIX時間 + 32400) ÷ 86400 + 25569

(解説)
・UNIX時間はUTC(協定世界時)なのでJST(日本標準時)に変換する。(9時間 × 60分 × 60秒 = 32400秒を足す。)
・日換算するために1日の秒数(86400秒)で割る。
 ・ミリ秒換算は 86400秒 × 1000 で割る。
 ・マイクロ秒換算は 86400秒 × 1000 × 1000 で割る。
・1900/1/1 ~ 1970/1/1 までのシリアル値(25569日)を足す。

今回の場合は13桁でしたので、Excelで関数を用いて数式に起こすと下記のようになります。

=UNIX時間/(1000*86400)+DATE(1970,1,1)+TIME(9,0,0)

(解説)
1.単位を時間に変換するためにミリ秒で割る。 … UNIX時間/(1000*86400)
2.1970年1月1日までの経過日数を足す。 … +DATE(1970,1,1)
3.UTCをJSTに変換するために9時間を足す。 … +TIME(9,0,0)

Excelで実際に時間を変換する

一番右の列に変換式を入力して変換します。

シートをコピーして、シリアル値に変換したセルを丸々コピー。
Timestampの列に「値」を貼り付けます。

セルの書式設定で「yyyy/mm/dd hh:mm:ss」形式に変換すれば完了です。

完成形はこのようになりました。

テキストエディタで開いても、問題無く読めるようになりました。

timestamp,message
2024/9/17 9:32,"INIT_START Runtime Version: python:3.9.v56 Runtime Version ARN: arn:aws:lambda:ap-northeast-1::runtime:52e9b67213e4ba48e3c265ce3aa86c478ce792bbd68bc88225db1202a975ddda"
2024/9/17 9:32,START RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b Version: $LATEST
2024/9/17 9:32,.jpeg以外のファイルがアップロードされました。
2024/9/17 9:32,.jpegファイルをアップロードしてください.
2024/9/17 9:32,END RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b
2024/9/17 9:32,"REPORT RequestId: a083d831-c940-4ea2-99bb-0bd6f29c4d8b Duration: 1.72 ms   Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 80 MB  Init Duration: 489.71 ms"

まとめ

CloudWatch LogsでダウンロードしたCSVのまま、Excelでログを見ることは難しいので、調整が必要です。
今回のケースはログをローカルに保存するには…の話で、手間が掛かるので閲覧はCloudWatch Logsで見るのがオススメです。

いずれは、上記の手順を自動化し、簡単に変換できるツールが組めれば一番良いのかと考えています。

おわりに

弊社では、夏季休暇は7月から9月の間で任意の3日間取得できます。

今年は、夏季休暇と有休を利用し、9月下旬にポケモンのイベントへの参加を兼ねてインドネシアと韓国(+トランジットでベトナム、マレーシア)へ行ってきました。
去年のタイに続き、人生2回目の海外旅行です。

インドネシアのポケモンのイベント開催地はジャカルタ。
インドネシアの首都であり経済の中心地であるものの、観光に行く人はあまり多くないはずです。

そんなジャカルタのシンボルと言えば「モナス」です。
モナス(MONAS)とは、「Monumen Nasional」の略称で、インドネシアの国家独立記念塔です。

今回は軍事イベントをやっており、戦車が並んでいるような感じでしたので上には上れませんでしたが、タイミングが合えばエレベーターで上れてジャカルタ市内を一望できるそうです。

ポケモンがきっかけと言えど、中々行けない場所に行けたので、良い経験になりました。

今月はもう1回記事を投稿したいと思っているので、引き続きLambdaの検証を頑張って行きます!

では…。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA