我是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
坦率地说,几天前我就能完成这项工作。但后来发生了一些变化(唉,无法回忆起它是什么!)我想,然后登录文件就停止了。
答案 0 :(得分:0)
确定。所以我终于明白了。为了别人的缘故,在这里分享。它来了:
app.js中有更多的行(为清楚起见已删除),并且应用程序实际上在log.info()
语句后立即崩溃。我希望这些语句出现在控制台上出现的日志文件中。但后来,我没有意识到,与其他编程语言不同,nodejs具有出生本身并行处理的强大功能(这实际上是我对它的热爱的核心原因之一:) )。
所以在我的情况下,由于并行处理的不平行功能,nodejs刚刚触发了日志语句并继续处理其他语句。并且,当它崩溃时,它用它取消了整个程序。由于写入控制台比IO快得多(显而易见的原因!!),它在屏幕上显示得更快。然而,在它写入文件系统之前,应用程序崩溃了,最终没有写入文件!
经验教训:
- 始终记住 nodejs === parallel processing
- 对于上述任何与IO相关的问题,请确保程序在崩溃之前运行完成或至少再运行一段时间, 从而为IO提供足够的时间来完成。
醇>