APC 技術ブログ

株式会社エーピーコミュニケーションズの技術ブログです。

株式会社 エーピーコミュニケーションズの技術ブログです。

【Azure】 FunctionsからApplication Insightsのログ出力を行う

はじめに

こんにちは。クラウド事業部の菅家です。
これまで、Application InsightsとFunctionsについて学習したところ、
今回はこれを組み合わせてFunctionsアプリにてApplication Insightsにログを出していこうと思います。

関連記事:
techblog.ap-com.co.jp

techblog.ap-com.co.jp

techblog.ap-com.co.jp

やることや詰めておきたいこと

使用するTrigger

Funtctionsは外部要因に起用しないTimerTriggerを使用します。
@TimerTrigger:タイマー トリガーを使用すると、関数を実行するタイミングを指定する CRON 式を指定して、スケジュールに従って関数を実行できます。

learn.microsoft.com

詰めておきたい、ログのこと

ログに関しては「ExecutionContext Interface」の「getLogger()」メソッドからLoggerを取得し、ログ出力する想定です。

learn.microsoft.com

得られる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の書き方を確認。

qiita.com

分 時 日  月 曜日
 *  *  *  *   *

とのことなので、デフォルトでは毎分の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メソッドがよさそうです。

docs.oracle.com

learn.microsoft.com

まず、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

本記事の投稿者: s-sugaya
AWSをメインにインフラ系のご支援を担当しています。