在Azure上,bunyan在几秒钟后停止记录

时间:2017-11-09 22:54:19

标签: node.js azure azure-web-sites bunyan

我有一个NodeJS网络应用程序,我通过bunyan添加了日志记录。在我的桌面上完美运行。在Azure上它可以完美地工作1-10秒,然后没有其他任何记录。该应用程序继续运行并正常运行。我无法弄清楚为什么会这样。记录到普通本地文件,而不是Blob或Azure存储。

日志类型为旋转文件,设置为每天旋转1天并保持3天。 Web应用程序将Always On和ARR Affinity设置为On,以及Application Logging(Filesystem),虽然我不确定这些因素。实例计数为1,未启用自动缩放。节点版本是8.7.0。在控制台中:

> df -h .
D:\home\site\wwwroot\logs
Filesystem      Size  Used Avail Use% Mounted on
-               100G -892G   99G 113% /d/home/site
坦率地说,我不知道那是什么告诉我的。不知何故,我们使用了113%的东西,这是不可能的。我们使用了负数,这是不可能的。还有99G / 100G可用,所以我们真的只使用1%。这是一个“磁盘已满”的问题吗?我不知道。我没有在任何地方看到过这样的错误信息。

之前,该应用程序正在使用console.log()。我们添加了代码来拦截console.X并首先写入文件,然后调用普通函数。同样的事情发生了 - 它会工作几秒钟,然后不记录任何其他东西。我原以为是因为Azure的一些组件也拦截了控制台调用,以便将它们重定向到XXX-stdout.txt,而我们这两个人都以某种方式破坏了它。现在似乎原因可能是其他原因。

有谁知道为什么会这样?

11/12 - 从头开始​​创建一个应用程序来记录心跳一次/秒,它运行正常。也工作一次/分钟。我将不得不从失败的项目中添加碎片直到它崩溃。

11/13 - 我认为记录器配置没有什么特别之处。

'use strict'

const bunyan = require('bunyan');
const fs = require('fs');
const path = require('path');

const logname = 'tracker';
const folder = 'logs';
const filename = path.join(folder, logname + ".json");

if (!fs.existsSync(folder)) {
    fs.mkdirSync(folder);
}

var log = bunyan.createLogger({
    name: logname,
    streams: [{
        type: 'rotating-file',
        path: filename,
        level: process.env.LOG_LEVEL || "info",
        period: '1d',   // daily rotation
        count: 3        // keep 3 back copies
    }]
});

module.exports = { log };

仍在努力用比整个项目更少的东西来复制它。

11/14 - 我很满意自己在bunyan日志记录停止后应用程序仍在继续调用它。 “调用log2”console.logs在Azure日志流中可见,但超过~30秒后,没有任何内容添加到bunyan日志中。我从未看到记录“错误”。这仍然是在项目的背景下,我仍然无法单独重现。

var log2 = bunyan.createLogger({
    name: logname,
    streams: [{
        type: 'rotating-file',
        path: filename,
        level: process.env.LOG_LEVEL || "info",
        period: '1d',   // daily rotation
        count: 3        // keep 3 back copies
    }]
});

var log = {};

log.info = function() {
    console.log("calling log2.info");
    try {
    log2.info(...arguments);
    } catch(err) {
        console.log("log.info ERROR " + err);
    }
}

11/14 - 从'rotate-file'更改为'file',行为相同。启用xxx日志记录并打印“写入日志记录”消息但不添加到文件中。文件流发生了什么事?添加了捕获close / finish / cork的代码,我们从流中捕获'error',没有捕获到任何这些事件。

11/15 - 我可以从pid和日志消息中看到Azure正在重新启动我的应用程序。我不知道为什么,在logging-errors.txt中什么都没有,stderr没什么可怕的。我也不知道为什么第二次运行没有记录到文件,当第一次运行时。但是,如果我能弄清楚它为什么重新启动并阻止它,那么我不会关心第二个问题。 Azure对我来说是如此不透明。

1 个答案:

答案 0 :(得分:0)

经过多次头脑冲击,我们确定我们尝试做的事情与Azure网络应用程序不兼容。我们需要站起来一个VM。结束这个问题。