Я хочу сохранить веб-журнал, который использует Morgan и выразить в файл JSON

Я хочу хранить 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??

1 ответ

Решение

Технически Морган не позволяет вам сделать это, потому что вся его цель - написать один стандарт. access.log строка за запрос (благодарность Дугласу Уилсону за указание на это).

Да, вы можете взломать одну строку журнала, как вы это сделали, что делает ее действительной строкой 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://stackru.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 (я проверил его с помощью jsonlint, все хорошо).

[{
    "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"
}]
Другие вопросы по тегам