BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

Azure Functions のローカルデバッグ時に LogLevel を変えたい

Azure Functions で、本番環境でのログレベルと、ローカルの PC でデバッグでログレベルは変えたいときにどう設定するかのお話です。

2021年7月時点で C# の Azure Functions v3.x (バージョンに関する詳しいことはここ)での話です。

ログレベルの設定は、基本的には host.json で定義します。設定方法はこちらのドキュメントlogging について書かれている部分や、場合によっては logging の child である applicationInsights をいじることがあるでしょう。

host.json はデプロイする artifact に含まれますので、host.json を変えるとプロダクション環境に影響を及ぼすことがあります(プロダクション環境の環境変数でセットすればもちろん回避できますがそれは今はおいておきます)。そんな host.json をいじって戻し忘れると、「ひでぶっ」って事故なることもあるかもしれません(知らんけど)。

host.json はいじらず、ローカルでのデバッグ時にはより細かいログを出すような設定をする方法のメモです。

local.settings.json で LogLovel を上書きする

host.json では以下のように logging の logLevel の default を Warning で設定してたとしましょう。(後述する Azure Functions で環境変数の設定とかしない限りは)デプロイ先の本番環境とかでもこの設定になりますので、無駄にいじりたくない気持ちがわいてきます。

  "version": "2.0",
  "logging": {
    "logLevel": {
      "default": "Warning"
    },
// 以下省略

local.settings.json でこの logLevel の default 部分を Trace に上書きするには以下の6行目のように書きます。prefix として AzureFunctionsJobHost、あとは json のネストされたフィールドを表現するのに _ を2つで繋いで書く定番 (?) のパターンですね。

あとはこんな感じで動作確認になんかめんどくさそうなコードを書いしまったのですが、local.settings.json で logLevel を変えながらデバッグすると、正しく構成されていることがわかります。

using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.Extensions.Logging;

namespace LogLevelCustomizationForLocalDebug
{
    public class Function1
    {
        [FunctionName("Function1")]
        public IActionResult Run(
            [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
            ILogger log)
        {
            log.LogTrace("Hello Trace");
            log.LogDebug("Hello Debug");
            log.LogInformation("Hello Information");
            log.LogWarning("Hello Warning");
            log.LogError("Hello Error");

            return new OkObjectResult($"Trace: {log.IsEnabled(LogLevel.Trace)}; " +
                                      $"Debug: {log.IsEnabled(LogLevel.Debug)}; " +
                                      $"Information: {log.IsEnabled(LogLevel.Information)}; " +
                                      $"Warning: {log.IsEnabled(LogLevel.Warning)}; " +
                                      $"Error: {log.IsEnabled(LogLevel.Error)}; ");
        }
    }
}

Azure Functions の環境変数で上書きする

local.settings.json で上書きしてれば事足りると思いますが前述でちょっと話題に出しましたので一応書いておくと、Azure 上にある Azure Functions の リソースに、前述の書き方で環境変数をセットすれば上書きできます。

Azure Functions のリソースの環境変数のセットが気になる方は、こちらから確認できます。