こんにちは、サブスクペイサービスでCREを担当してますmurakamiCPです。
CREチームの日々の業務の中で、最も多い問い合わせは「ログ調査」だったりします。 何らかのエラーが起こった際や、お客様の問い合わせでログを追っての確認だったりと要因は様々です。 (この「問い合わせ」自体を減らすことができるサービス作りも取り組んでますが、それはまた別のお話ということで) 端的に「ログ調査」といっても、日々増え続ける膨大なログから該当箇所を見つけるのはなかなか骨が折れますよね。 そんな調査がちょっと楽になったお話をしたいと思います。
AWS移行してでてきた課題
AWSへ移行した際に、アプリケーション関連のログもAWSの「CloudWatch」で取得するようになり、物理的なlogファイルの保管ではなくなりました。
そんなCloudWatchを使用してログ調査をする際、以下のような課題がでてきたのです。
・1ファイル分のログが一気に表示されるわけではないのでロードに時間がかかる ・検索機能があるにはあるが、複数条件が設定できない ・複数ファイルにまたがっての検索ができない
…時間が…時間がかかる!! ある程度見る場所が決まっているログはまだしも、期間にまたがって複数ピックアップして探したいときにどうしても手間がかかってしまうことに。 AWS移行前は実ファイル(いわゆるlog形式)があったので、sakuraエディタなどのGrep機能でちょちょいって検索できてたことができなくなってしまったのです。
Athena導入
そこでインフラチームの提案と協力と実行力のもと(つまりは全てやっていただいた)、Athenaが導入されました
これによって、CloudWatchに保管されているログ(正確にはアーカーイブしてS3に保存しているところから)がすべてSQL感覚で検索・抽出できるようになったのです。 ログのグループ、ファイル名、タイムスタンプ、キーワードなど様々な複数条件で検索できるので、調査が本当に楽になりました。 特に、愛用しているのが、対象のキーワードに対して前後の数分を出力できる下記SQLです。
--1分前後のログ取得サンプルSQL WITH T1 AS ( SELECT * FROM データベース.テーブル名 WHERE orderhour BETWEEN 'yyyy/MM/dd/00' AND 'yyyy/MM/dd/23' AND loggroup = '対象のロググループ' AND message like 'キーワード' ) SELECT T1.message AS search_message, T2.* FROM T1, データベース.テーブル名 T2 WHERE T1.orderhour = T2.orderhour AND T1.loggroup = T2.loggroup AND T1.logstream = T2.logstream AND FROM_UNIXTIME(T2.timestamp) BETWEEN FROM_UNIXTIME(T1.timestamp) + interval '-1' minute AND FROM_UNIXTIME(T1.timestamp) + interval '1' minute ORDER BY T2.timestamp, search_message
上記で指定したロググループ内のキーワードにヒットする前後1分のログが検索できます。
ほかの構文などは下記を参考にしてください。
SQLの構文についてはこちら:
関数はこちら:
Athenaを使うにあたっての注意
検索した量に応じてお金がかかります! なので、使用する際は、なるべくロググループ・期間指定・リミット指定(TOP100など)して検索する対象を絞って実施しましょう。 お財布にやさしく。
以上、murakamiCPでした。
We are hiring!!
ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!
speakerdeck.com
www.robotpayment.co.jp