日志

Node-RED 使用一个将输出写入控制台的日志记录器。它还支持使用自定义日志记录模块,以便将输出发送到其他地方。

注意:如果您正在 Raspberry Pi 上使用我们的安装脚本作为服务运行,您可以使用 node-red-log 命令查看服务日志。

控制台日志记录器

控制台日志记录器可以在您的设置文件中的 logging 属性下进行配置。

// Configure the logging output
logging: {
    // Console logging
    console: {
        level: "info",
        metrics: false,
        audit: false
    }
}

有 3 个属性用于配置日志记录器的行为

级别

要记录的日志级别。选项包括

  • fatal - 只记录那些导致应用程序无法使用的错误
  • error - 记录被认为对特定请求是致命的错误
  • warn - 记录非致命问题
  • info - 记录有关应用程序一般运行的信息
  • debug - 记录比 info 更详细的信息
  • trace - 记录非常详细的日志
  • off - 完全不记录任何日志消息

除了 off,每个级别都包含更高级别的消息 - 例如,warn 级别将包含 errorfatal 级别的消息。您可以在编写函数部分找到如何记录到这些不同日志级别的 API 参考。

指标

当设置为 true 时,Node-RED 运行时会输出流程执行和内存使用情况信息。

每个节点中接收和发送的事件都会输出到日志中。例如,以下日志是从包含注入和调试节点的流程中输出的。

9 Mar 13:57:53 - [metric] {"level":99,"nodeid":"8bd04b10.813f58","event":"node.inject.receive","msgid":"86c8212c.4ef45","timestamp":1489067873391}
9 Mar 13:57:53 - [metric] {"level":99,"nodeid":"8bd04b10.813f58","event":"node.inject.send","msgid":"86c8212c.4ef45","timestamp":1489067873392}
9 Mar 13:57:53 - [metric] {"level":99,"nodeid":"4146d01.5707f3","event":"node.debug.receive","msgid":"86c8212c.4ef45","timestamp":1489067873393}

内存使用情况每 15 秒记录一次。

9 Mar 13:56:24 - [metric] {"level":99,"event":"runtime.memory.rss","value":97517568,"timestamp":1489067784815}
9 Mar 13:56:24 - [metric] {"level":99,"event":"runtime.memory.heapTotal","value":81846272,"timestamp":1489067784817}
9 Mar 13:56:24 - [metric] {"level":99,"event":"runtime.memory.heapUsed","value":59267432,"timestamp":1489067784817}

审计

当设置为 true 时,Admin HTTP API 访问事件将被记录。事件包括额外信息,如正在访问的端点、IP 地址和时间戳。

如果启用了 adminAuth,事件将包含有关请求用户的信息。

9 Mar 13:49:42 - [audit] {"event":"library.get.all","type":"flow","level":98,"path":"/library/flows","ip":"127.0.0.1","timestamp":1489067382686}
9 Mar 14:34:22 - [audit] {"event":"flows.set","type":"full","version":"v2","level":98,"user":{"username":"admin","permissions":"write"},"path":"/flows","ip":"127.0.0.1","timestamp":1489070062519}

自定义日志记录模块

也可以使用自定义日志记录模块。例如,metrics 输出可能会发送到一个单独的系统,用于监控系统性能。

要使用自定义日志记录器,请在您的设置文件的 logging 属性中添加一个新的块。

// Configure the logging output
logging: {
    // Console logging
    console: {
        level: "info",
        metrics: false,
        audit: false
    },
    // Custom logger
    myCustomLogger: {
        level: 'debug',
        metrics: true,
        handler: function(settings) {
            // Called when the logger is initialised

            // Return the logging function
            return function(msg) {
                console.log(msg.timestamp, msg.event);
            }
        }
    }
}

levelmetricsaudit 属性与控制台日志记录相同。

handler 属性定义了自定义日志处理程序。它是一个在启动时被调用一次的函数,传入日志记录器的配置。它必须返回一个将用日志消息调用的函数。

可以配置多个自定义日志记录器 - 唯一保留的名称是 console

日志记录器示例

以下示例添加了一个自定义日志记录器,该记录器通过 TCP 连接将指标事件发送到 Logstash 实例。

这是一个非常快速简单的示例 - 没有错误处理或重新连接逻辑。

logging: {
    console: {
        level: "info",
        metrics: false,
        audit: false
    },
    logstash: {
        level:'off',
        metrics:true,
        handler: function(conf) {
            var net = require('net');
            var logHost = '192.168.99.100',logPort = 9563;
            var conn = new net.Socket();
            conn.connect(logPort,logHost)
                .on('connect',function() {
                    console.log("Logger connected")
                })
                .on('error', function(err) {
                    // Should attempt to reconnect in a real env
                    // This example just exits...
                    process.exit(1);
                });
            // Return the function that will do the actual logging
            return function(msg) {
                var message = {
                    '@tags': ['node-red', 'test'],
                    '@fields': msg,
                    '@timestamp': (new Date(msg.timestamp)).toISOString()
                }
                try {
                    conn.write(JSON.stringify(message)+"\n");
                }catch(err) { console.log(err);}
            }
        }
    }
}