我想存储使用morgan和express到json文件的web日志



我想像一样存储JSON文件

[
{
"remote-addr" : "127.0.0.1",
"date"  : " 2018.07.28"
}
] 

我用这个代码

var format=json(
':remote-addr:date'
);
app.use(logger({
format:format,
stream: fs.createWriteStream('log.json')
}));  

我用这个代码得到

{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:41 GMT"}
{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:41 GMT"}
{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:42 GMT"}
{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:48 GMT"}

这是json文件,但没有[]和

如何获取json文件??

从技术上讲,Morgan不允许您这样做,因为它的全部目的是为每个请求写一行标准的access.log(感谢Douglas Wilson指出这一点(。

是的,您可以像以前一样绕过单个日志行,这使它成为一个有效的JSON行。然而,为了使log.json文件也是一个有效的JSON,我能想到的唯一方法就是对文件进行某种后处理。

以下是后处理的样子:首先,您需要逐行读取文件。然后,创建有效的JSON。最后,将其保存在一个单独的文件中(或者无论如何覆盖log.json(。

输入:您当前的log.json文件:

{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:41 GMT"}
{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:41 GMT"}
{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:42 GMT"}
{"remote-addr":"::ffff:127.0.0.1","date":"Sat, 28 Jul 2018 04:38:48 GMT"}

我写的后处理脚本:

const fs = require('fs');
//  Since Node.js v0.12 and as of Node.js v4.0.0, there is a stable
// readline core module. That's the easiest way to read lines from a file,
// without any external modules. Credits: https://stackoverflow.com/a/32599033/1333836
const readline = require('readline');
const lineReader = readline.createInterface({
input: fs.createReadStream('log.json')
});
const realJSON = [];
lineReader.on('line', function (line) {
realJSON.push(JSON.parse(line));
});
lineReader.on('close', function () {
// final-log.json is the post-processed, valid JSON file
fs.writeFile('final-log.json', JSON.stringify(realJSON), 'utf8', () => {
console.log('Done!');
});
});

结果:final-log.json文件,它是一个有效的JSON(我用jsonint验证了它,一切都很好(。

[{
"remote-addr": "::ffff:127.0.0.1",
"date": "Sat, 28 Jul 2018 04:38:41 GMT"
}, {
"remote-addr": "::ffff:127.0.0.1",
"date": "Sat, 28 Jul 2018 04:38:41 GMT"
}, {
"remote-addr": "::ffff:127.0.0.1",
"date": "Sat, 28 Jul 2018 04:38:42 GMT"
}, {
"remote-addr": "::ffff:127.0.0.1",
"date": "Sat, 28 Jul 2018 04:38:48 GMT"
}]

最新更新