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

On Azure, bunyan stops logging after a few seconds

我有一个 NodeJS 网络应用程序,我已经通过 bunyan 添加了日志记录。在我的桌面上完美运行。在 Azure 上,它可以完美运行 1-10 秒,然后就不会记录任何其他内容。该应用程序会继续 运行,否则会正常运行。我不明白为什么会这样。记录到普通本地文件,而不是 blob 或 Azure 存储。

日志类型为轮转文件,设置为轮转1/天,保留3天。 Web 应用程序始终开启且 ARR 亲和力设置为开启,以及应用程序日志记录(文件系统),但我不确定这里的因素。 Instance Count 为 1,并且未启用 Autoscale。节点版本为 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%。那么这是一个 'disk full' 问题吗?我不知道。我在任何地方都没有看到这样的错误消息。

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

有人知道为什么会这样吗?

11/12 - 从头开始​​创建一个应用程序来记录心跳 once/second,并且运行良好。还工作 once/minute。我将不得不从失败的项目中添加一些片段,直到它失败。

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 日志记录停止后应用程序仍在继续调用它感到满意。 "calling log2" console.log 在 Azure 日志流中可见,但超过 30 秒后,bunyan 日志中不再添加任何内容。我从来没有看到 "ERROR" 记录。这个还是在项目的上下文中,我还是不能单独复现。

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 - 从 'rotating-file' 更改为 'file',行为相同。启用 xxx 日志记录并打印 "writing log rec" 消息但不添加到文件中。文件流发生了什么事?在我们从流中捕获 'error' 的地方添加了捕获 close/finish/cork 的代码,但没有捕获任何这些事件。

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

经过多次思考,我们确定我们正在尝试做的事情与 Azure Web 应用程序不兼容。我们需要建立一个虚拟机。结束这个问题。