はじめに
こんにちは。クラウド事業部の菅家です。
これまで、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