LoginSignup
0
0

More than 5 years have passed since last update.

[Azure] FunctionAppでログ出力されない場合、context.done()が非同期実行されていないか注意

Last updated at Posted at 2018-08-23

タイトルがほぼ情報の全てですが、気づくまでに時間がかかったのでメモ。

Azure functionApp (Javascript)でログ出力されない場合、context.done()が非同期実行されてcontext.log()より先になっていないか注意が必要です。

以下サンプルでは、時間のかかる処理をsetTimeout()で代替していますが、functionApp作成時のテンプレートを元にこんなコードを書いてしまうと・・・

module.exports = function (context, myTimer) {
    let timeStamp = new Date().toISOString();
    context.log('JavaScript timer trigger function ran!: ', timeStamp);   

    for (let i = 0; i < 12; i++) {
        setTimeout(function() {
            context.log('[Info] Log output test: ', i);
        }, 1000 * 10 * i);
    }
    context.done();
};

ログが途中で途切れてしまい、悩むことになります。サンプルだと"Function completed"が先に出ているところで気づきそうなものですが、実際のコードで色々ログを出していると気づきにくいですね。

image.png

非同期処理の影響であることは、context.done()のところを修正すると確認できます。

module.exports = function (context, myTimer) {
    let timeStamp = new Date().toISOString();
    context.log('JavaScript timer trigger function ran!: ', timeStamp);   

    for (let i = 0; i < 12; i++) {
        setTimeout(function() {
            context.log('[Info] Log output test: ', i);
        }, 1000 * 10 * i);
    }

    setTimeout(function() {
        context.done();
    }, 1000 * 10 * 12);
};

こちらのコードであれば、期待通りにログ出力されることが確認できます。

image.png

もちろん実際のコードでは事前に待ち時間が分かることはなく、context.done()の実行タイミングで悩むわけですが、注意事項は以上になります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0