Как указать расположение повернутого файла с помощью rotating-file-stream - PullRequest
0 голосов
/ 07 мая 2020

Я написал код, как показано ниже, для записи express журналов.

const rfs = require("rotating-file-stream");

function formatDate() {
  var d = new Date(),
    month = '' + (d.getMonth() + 1),
    day = '' + d.getDate(),
    year = d.getFullYear();
    hour = d.getHours();

  if (month.length < 2)
    month = '0' + month;
  if (day.length < 2)
    day = '0' + day;
  if (hour.length < 2)
    hour = '0' + hour

  return [year, month, day, hour].join('-');
}

let log_directory = '/../logs/';

let log_date = formatDate()
let log_file_name =  path.normalize(__dirname + log_directory + log_date, 'access.log');

let accessLogStream = rfs.createStream(log_file_name, {
  size: "300M",
  interval: "1d",
})

app.use(morgan(':date[iso] :method :url :body :headers :remote-addr :req[content-length] - :status :response-time ms - :res[content-length] ', { stream: accessLogStream }));

журналы сохраняются вне проекта, как и ожидалось.

Но после ротации журналы хранение внутри проекта с указанными ниже именами папок

20200507-0943-01-     
20200508-0943-01-      
20200509-0943-01-     
20200510-0943-01-      
20200511-0943-01-      
20200512-0943-01-      
20200513-0944-01-   
package.json
package-lock.json
public
routes
scripts
services
app.js

Я не хочу, чтобы эти папки создавались внутри проекта. Есть ли способ справиться с этим?

1 Ответ

0 голосов
/ 02 июня 2020

Прежде всего, вы используете stati c имя файла в качестве параметра filename функции createStream и выполняете некоторые вычисления на дату, чтобы получить имя полученного файла.

Обратите внимание, что вычисление даты происходит только один раз перед вызовом функции createStream. Чтобы выполнять вычисления по дате, происходящей при каждом повороте, вы должны использовать функцию генератора имени файла . Подробности можно найти в readme .

Более того, похоже, что в этой строке есть ошибка: path.normalize принимает только один параметр.

let log_file_name =  path.normalize(__dirname + log_directory + log_date, 'access.log');

Last , чтобы указать каталог для ведения журнала, должно быть достаточно опции path .

Если я правильно аргументировал ваши намерения, следующий код должен решить все проблемы

const rfs = require("rotating-file-stream");

function formatDate(d) {
  var month = '' + (d.getMonth() + 1),
    day = '' + d.getDate(),
    year = d.getFullYear(),
    hour = d.getHours();

  if (month.length < 2)
    month = '0' + month;
  if (day.length < 2)
    day = '0' + day;
  if (hour.length < 2)
    hour = '0' + hour;

  return [year, month, day, hour].join('-');
}

function log_file_name(time, index) {
  if (!time) return 'access.log';

  return [formatDate(time), index, 'access.log'].join('-');
}

let accessLogStream = rfs.createStream(log_file_name, {
  size: "300M",
  interval: "1d",
  path: '/../logs/'
});
...