0

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

日志类型为rotating-file,设置为每天轮换1次,保留3天。Web 应用程序的 Always On 和 ARR Affinity 设置为 On,以及应用程序日志记录(文件系统),尽管我不确定这里的因素。实例计数为 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 - 从“旋转文件”更改为“文件”,行为相同。启用 xxx 日志记录并打印“写入日志记录”消息但不添加到文件中。文件流发生了什么事?添加代码以在我们从流中捕获“错误”的地方捕获关闭/完成/软木塞,但没有捕获任何这些事件。

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

4

1 回答 1

0

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

于 2017-11-15T21:54:43.637 回答