なんかAzure Functionsに .NET CoreなFunction Appをデプロイするとログが文字化けしてまして。
結論から言うと、Visual Studioの新規プロジェクトなどからFunction Appで追加される .csファイルがUTF-8じゃないのが原因でした。
前提条件
- Azure Functions Toolsを使ってFunction Appを作るまたは追加する
- Ubuntuなど非Windows環境で.NET Coreをビルドする
テストコード
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Azure.WebJobs;
using Microsoft.Azure.WebJobs.Extensions.Http;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
namespace FunctionApp11
{
public static class Function1
{
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
var data = "テスト文字列";
log.LogInformation($"文字列補完 {data}");
log.LogInformation("通常のフォーマッタ {0}", data);
return (ActionResult)new OkObjectResult("OK");
}
}
}
Azure Functions (Functions v2)を.NET Coreで作ってHttpTriggerでとりあえず作ります。適当にlog.LogInformationとかしてみます。
実際の挙動
さてこのコードをWindows上から直接Azureへデプロイ(パッケージデプロイ)すると問題ありません。(試してませんがWindowsなFunctions上ならローカルGitなどでも問題ないでしょう)
問題になるケースはUbuntuなどでビルドしたものをパッケージデプロイなどした場合です。例えばGitHub Actions(workflows)を使った場合とか。

実際にやってみると以下のように文字化けや実行時エラーがでます。
Ubuntu上でdotnetコマンドでビルドした際にSJISなソースがちゃんと解釈されなかった感じですね。文字化けもSJISをUTF-8で解釈した場合の典型例のような感じです?

正常に動作する場合はもちろん文字化けしません。
ちなみにビルド時の問題だと思うので、FunctionsがWindowsだろうがLinuxだろうが関係なく同じ挙動になります。
対処方法
- 追加ウィザードなどで追加したFunctions関連の .csファイルのエンコードをUTF-8で保存しなおす
- Windowsなビルド環境を使う
普通に考えてUTF-8で面倒ですが保存しなおすのがいいです。
またこの問題はAzure Functions Toolsが見ているテンプレートがUTF-8になっていないのが問題なので、Visual Studio Codeを使ったり funcコマンドから生成しても同じです。
という感じでFunctionsで思い知った問題でしたが、潜在的には .NET Coreのビルド環境とソースコードのエンコードの問題だと思うので気を付けましょう。(というか考えたくないなァ)
※1年前にIssue挙がってるのに放置されてたのでつついてみましたが直るといいですね。