log4js-节点软件包 - 未写入文件



我是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!');

输出

[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

坦率地说,我几天前就可以完成这项工作。但是随后发生了什么变化(a,我想回忆起什么是什么!),然后登录文件停止。

好。所以我终于弄清楚了。为了他人而在这里分享。它来了:

app.js中几乎没有其他行(为了清楚起见),实际上该应用程序在log.info()语句之后立即崩溃。我期望该语句出现在日志文件中,因为它出现在控制台上。但是,我没有意识到,与其他编程语言不同,Nodejs获得了按出生本身进行平行处理的强大功能(实际上,这是我对它的爱的核心原因之一:))。

因此,在我的情况下,由于其并行处理 Unparallalle功能,nodejs刚刚启动了日志语句,并继续处理其他语句。而且,当它崩溃时,它删除了整个程序。由于写信给控制台的速度比IO快得多(出于明显的原因!),因此它出现在屏幕上的速度更快。但是,在将应用程序写入文件系统之前,该应用程序崩溃了,最终没有写入文件!

学习的课程:

  1. 永远记住 nodejs ===并行处理
  2. 对于以上类似IO的任何相关问题,请确保该程序运行以完成或至少在崩溃之前的一段时间内完成, 因此为IO提供了足够的时间。

最新更新