log4js - 节点包 - 不写入文件

时间:2017-12-04 09:35:30

标签: node.js logging console log4j log4js-node

我是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
坦率地说,几天前我就能完成这项工作。但后来发生了一些变化(唉,无法回忆起它是什么!)我想,然后登录文件就停止了。

1 个答案:

答案 0 :(得分:0)

确定。所以我终于明白了。为了别人的缘故,在这里分享。它来了:

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

所以在我的情况下,由于并行处理不平行功能,nodejs刚刚触发了日志语句并继续处理其他语句。并且,当它崩溃时,它用它取消了整个程序。由于写入控制台比IO快得多(显而易见的原因!!),它在屏幕上显示得更快。然而,在它写入文件系统之前,应用程序崩溃了,最终没有写入文件!

  

经验教训:

     
      
  1. 始终记住 nodejs === parallel processing
  2.   
  3. 对于上述任何与IO相关的问题,请确保程序在崩溃之前运行完成或至少再运行一段时间,   从而为IO提供足够的时间来完成。
  4.