Регистратор NodeJS: удалить завершающий перевод строки

#javascript #node.js #logging #newline #fs

#javascript #node.js #ведение журнала #новая строка #fs

Вопрос:

Я пытаюсь создать пользовательский регистратор NodeJS, который записывает данные в файл.
Для добавления данных я использую fs.createWriteStream с a флагом.

 var fs = require("fs");

var stream = fs.createWriteStream("./test.log", {
   encoding: "utf-8",
   flags: "a",
   autoClose: true
});

// Data to log to file
var data = {
   timestamp: new Date().toJSON(),
   message: "OK"
};

// Write data
stream.write(JSON.stringify(data)   "n");
  

В результате регистрации несколько раз файл выглядит следующим образом:

 {"timestamp":"2020-08-25T17:45:27.733Z","message":"OK"}
{"timestamp":"2020-08-25T17:45:34.820Z","message":"OK"}
{"timestamp":"2020-08-25T17:45:41.142Z","message":"OK"}
(Heres a newline, StackOverflow removes them)
  

Моя проблема в том, что я не знаю, как удалить завершающую новую строку.

Я думал о добавлении новой строки перед каждой записью в журнале, но для этого мне нужно определить начало файла (я не нашел способа сделать это).

Каков наилучший способ удалить завершающую новую строку, если это вообще возможно? Любая помощь была бы с благодарностью!

Ответ №1:

Вам нужно проверить, пуст ли файл:

 var fs = require("fs");

var stream = fs.createWriteStream("./test.log", {
   encoding: "utf-8",
   flags: "a",
   autoClose: true
});

// Data to log to file
var data = {
   timestamp: new Date().toJSON(),
   message: "OK"
};

// Check if file is empty
var stats = fs.statSync("./test.log");
var isEmpty = stats["size"] == 0;

// Write data
stream.write((isEmpty ? "" : "n")   JSON.stringify(data) );
  

Комментарии:

1. Это означало бы, что каждая отдельная запись находится в первой строке, чего я не пытаюсь достичь.

2. В этом случае вам нужно проверить, пуст ли файл, если нет, добавьте новую строку

3. Большое вам спасибо, благодаря вам я нашел решение. 🙂

4. Я отредактировал свой ответ; похоже ли ваше решение на него?

5. Так и есть. Тем не менее, я приму ваш ответ, еще раз спасибо!