はじめに
こんにちは。クラウド事業部の菅家です。
これまで、Application InsightsとFunctionsについて学習したところ、
今回はこれを組み合わせてFunctionsアプリにてApplication Insightsにログを出していこうと思います。
関連記事:
techblog.ap-com.co.jp
やることや詰めておきたいこと
使用するTrigger
Funtctionsは外部要因に起用しないTimerTriggerを使用します。
@TimerTrigger:タイマー トリガーを使用すると、関数を実行するタイミングを指定する CRON 式を指定して、スケジュールに従って関数を実行できます。
詰めておきたい、ログのこと
ログに関しては「ExecutionContext Interface」の「getLogger()」メソッドからLoggerを取得し、ログ出力する想定です。
得られるLoggerの型は「abstract java.util.logging.Logger」、JavaのLoggerのようですね。
このままだと、ログの話になりそうなのでログの話はここまで。
いっぱいありすぎてとってもややこしいのです、Javaのログ。
参考記事、こちらが分かりやすかったです。
qiita.com
作業
1.Application Insightsの作成と紐づけ
①Application Insightsの設定をします。Azureポータルにログイン。
②「Application Insights」サービスに移動。
新規作成でリソースを作っていきます。
「Review+create」でリソース作成。
③「App Services」サービスに移動し、デプロイしたFunctionsアプリを開きます。
④左メニューから「監視>Application Insights」をクリック。
前作った時はありもののApplication Insightsを適当に紐づけましたので、「リソースの変更 > 既存のリソースの選択」
「適用」をクリック。
2.IntelliJにて、TimerTriggerを追加する
①プロジェクトの作成に関しては「【Azure】IntelliJからAzureFunctionsアプリを作成してデプロイする - APC 技術ブログ」の記事でやりましたので、これをそのまま流用します。
②ソースフォルダ配下のorg.example.functinosパッケージにて右クリックし、「New>Azure Function Class」を選択
Packageはそのまま(作りたいパッケージで右クリックしたので)、Function Nameはサンプルに合わせて「TimerTriggerJava」とします。
Binding Typeを「TimerTrigger」に変更。
Scheduleですが、私はcronの書き方を確認。
分 時 日 月 曜日 * * * * *
とのことなので、デフォルトでは毎分の0秒で実行(1分)で処理が実行される模様。
0 0 * * * *
一先ず1時間ごとで0分に実行されるようにします。
③OKをクリックすると、クラスと同時に自動でメソッドが作成されました。
何と便利。
package org.example.functions; import java.time.*; import com.microsoft.azure.functions.annotation.*; import com.microsoft.azure.functions.*; /** * Azure Functions with Timer trigger. */ public class TimerTriggerJava { /** * This function will be invoked periodically according to the specified schedule. */ @FunctionName("TimerTriggerJava") public void run( @TimerTrigger(name = "timerInfo", schedule = "0 0 * * * *") String timerInfo, final ExecutionContext context ) { context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now()); } }
Triggerに対してスケジュールも設定されています。
見ればロガーもサンプルとしてありますね。
context.getLogger().info("Java Timer trigger function executed at: " + LocalDateTime.now());
④Info、Warningログを処理実装してみる
Errorログを出したいため、logメソッドがよさそうです。
まず、Loggerを使いまわしたいので元のログ出力処理を削除して、「Logger logger= context.getLogger();」とします。
Info、Warningのログ出力処理を実装してみます。
package org.example.functions; import com.microsoft.azure.functions.annotation.*; import com.microsoft.azure.functions.*; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; /** * Azure Functions with Timer trigger. */ public class TimerTriggerJava { /** * This function will be invoked periodically according to the specified schedule. */ @FunctionName("TimerTriggerJava") public void run( @TimerTrigger(name = "timerInfo", schedule = "0 0 * * * *") String timerInfo, final ExecutionContext context ) { Logger logger= context.getLogger(); logger.log(Level.INFO, "INFO Message"); try { throw new IOException(); } catch (Exception e) { logger.log(Level.WARNING, "WARNING Message:" + e.getMessage(), e); } } }
3.デプロイ・動作確認
①デプロイ選択。
②デプロイ完了。
③20:00前後のログで、UTCなので-9時間した値で探します。11時ごろですね。
クエリ
union * | where operation_Name contains "TimerTrigger" | where timestamp >= datetime(2025-03-30 10:30:00) and timestamp < datetime(2025-03-30 11:30:00) | order by timestamp desc
union *で全テーブルを結合し、TimerTrigger関連のログを検索。
カラムを絞って結果を出したところこんな感じ、エラークラス出力のためe.class()の方がよかったかも。
Functions>関数名をクリック>ログ、にて動作ログも出てました。
おわりに
今回は、AzureFunctions+Application Insightsで単純ログ出力するシンプルな処理を実装してみました。
Host.jsonを使用したFunctionsのログレベルの設定など、まだまだカスタマイズできる点は多そうです。
お知らせ
私達クラウド事業部はクラウド技術を活用したSI/SESのご支援をしております。
https://www.ap-com.co.jp/service/utilize-aws/
また、一緒に働いていただける仲間も募集中です! ご興味持っていただけましたらぜひお声がけください。 hrmos.co