1

我是 nodejs 的新手,希望我的 node 应用程序能够登录到文件和控制台。

这是我的代码结构:

fpa_log4j.json

{
  "appenders": {
    "fpa_file": {
      "type": "file",
      "filename": "fpa.log",
      "maxLogSize": 10485760,
      "backups": 10,
      "compress": true
    },
    "screen": {
      "type": "stdout",
      "layout": {
        "type": "coloured"
      }
    }
  },
  "categories": {
    "default": {
      "appenders": [
        "fpa_file",
        "screen"
      ],
      "level": "trace"
    }
  }
}

配置.js

var LOG4J_CFG = 'config/fpa_log4j.json';
var fs = require('fs');
var log4js = require('log4js');
var path = require('path');

LOG4J_CFG = path.resolve(LOG4J_CFG);
log4js.configure(JSON.parse(fs.readFileSync(LOG4J_CFG, 'utf8')));
....
....
module.exports = {
    log4js,
    ....
    ....
}

应用程序.js

var cfg = require('./config');
var log = cfg.log4js.getLogger("appMain");
log.info('FPA program STARTED!');

输出

[2017-12-04T03:20:17.791] [INFO] appMain - FPA program STARTED!

但是日志文件似乎是空的:

dir fpa.log
 Volume in drive C is XXXXXXXXX
 Volume Serial Number is XXXXXXXXXXXX

 Directory of c:\fpaMain

12/04/2017  12:13 AM                 0 fpa.log
               1 File(s)              0 bytes
               0 Dir(s)  12,242,776,064 bytes free

坦率地说,我能够在几天前完成这项工作。但是后来有些事情发生了变化(唉,不记得它是什么!)我猜,然后登录文件停止了。

4

1 回答 1

3

行。所以我终于想通了。为了别人,在这里分享。它来了:

app.js 中还有几行(为清楚起见已被删除),该应用程序实际上在log.info()声明后立即崩溃。而且我希望这些语句出现在控制台上的日志文件中。但是后来,我没有意识到,与其他编程语言不同,nodejs 本身就具有并行处理的强大功能(这实际上是我喜欢它的核心原因之一 :))。

所以在我的例子中,由于它无与伦比并行处理特性,nodejs 只是触发了 log 语句并继续处理其他语句。而且,当它崩溃时,它会同时关闭整个程序。由于写入控制台比 IO 快得多(原因很明显!!),它在屏幕上显示得更快。然而,在它可以写入文件系统之前,应用程序崩溃了,最终什么都没有写入文件!

学过的知识:

  1. 永远记住nodejs === 并行处理
  2. 对于上述任何与 IO 相关的问题,请确保程序在崩溃之前运行完成或至少运行一段时间,从而为 IO 提供足够的时间来完成。
于 2017-12-06T10:14:51.180 回答