首页 > 解决方案 > 如何使用旋转文件流指定旋转文件位置

问题描述

我编写了如下代码来记录快速日志。

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

我不希望在项目中创建这些文件夹。有没有办法处理这个?

标签: node.jsloggingmorgan

解决方案


首先,您使用静态文件名作为函数filename的参数,createStream并且您正在对日期进行一些计算以获得结果文件名。

请注意,在调用createStream函数之前,日期的计算只发生一次。为了计算每次旋转时发生的日期,您应该使用文件名生成器函数。详细信息可以在自述文件中找到。

不仅如此,这一行似乎还有一个错误:path.normalize只接受一个参数。

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

最后,要指定日志记录的目录,路径选项就足够了。

如果我正确地论证了您的意图,那么以下代码应该可以解决所有问题

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/'
});

推荐阅读