読者です 読者をやめる 読者になる 読者になる

しばやん雑記

ASP.NET とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure WebJobs でログを出力する方法をまとめる

Azure WebJobs

ちょっと前に Azure WebJobs のログ周りで少し躓いたので、少し挙動を調べてみました。

Console.WriteLine を使う

単純なコンソールアプリケーションを WebJobs として実行する場合には、Console.WriteLine を使うだけでランタイムがログとして保存してくれます。

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("log message");
    }
}

ただし、単純に Console.WriteLine を使っただけでは、日本語を書きだした時に化けます。

f:id:shiba-yan:20150416170212p:plain

普通にコンソールで文字列出力するとエンコーディングが UTF-8 以外になっているのが原因なので、回避するために OutputEncoding で UTF-8 を明示的に指定してあげます。

class Program
{
    static void Main(string[] args)
    {
        // UTF-8 を出力エンコーディングに指定しないと化ける
        Console.OutputEncoding = Encoding.UTF8;

        Console.WriteLine("テストメッセージ");
    }
}

これで再度実行すると、日本語がちゃんと出力されているのが分かります。

f:id:shiba-yan:20150416170557p:plain

入力値をログで書きだす場合には、マルチバイト文字が混ざってくる可能性があるので常に設定しておきたいですが、開発中に表示がおかしくなるので Release ビルドの時のみ有効にしておいた方が良いでしょう。

TextWriter をバインドする

Azure WebJobs SDK を使う場合には TextWriter を logger という名前で引数に追加しておけば、ランタイム側がいい感じにログとして扱ってくれるようになります。

メソッド内では WriteLine などを使って書き込むだけになります。

public class SampleJobs
{
    public static void SampleFunc([QueueTrigger("queue")] string message, TextWriter logger)
    {
        logger.WriteLine("キュー受信:" + message);
    }
}

メソッドと実行履歴単位で確認出来るので、WebJobs SDK を使う場合には logger を使った方が便利です。

f:id:shiba-yan:20150416174214p:plain

Console.WriteLine で書きだした場合には、メソッド単位にならないのでそこだけ注意ですね。