log4js - 节点包 - 不写入文件

log4js - node package - not writing to file

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

这是我的代码结构:

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"
    }
  }
}

config.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,
    ....
    ....
}

app.js

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

OUTPUT

[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

坦率地说,几天前我就能完成这项工作。但是后来发生了一些变化(唉,想不起来是什么了!)我猜,然后登录文件就停止了。

好的。所以我终于想通了。为了其他人的缘故,在这里分享它。来了:

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

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

Lesson Learned:

  1. Always remember that nodejs === parallel processing
  2. For any IO related issues like the above, ensure that the program runs to complete or at least for some more time before it crashes, thus providing enough time for the IO to complete.