如何在Pino.js日志记录器中轮转日志文件

5

我正尝试在我的Node应用服务器上使用Pino进行日志记录。由于有一些较大的日志文件,因此每天轮换一次日志文件更有助于之后查看日志。

虽然可以使用Morgan实现此功能,但是我无法找到使用Pino实现的方法。我尝试根据当前日期动态分配文件夹,但在主要的app.js文件中这样做意味着它只会运行一次,如果要循环日期,则需要停止并重新运行服务器。

以下是我的代码:

var date = d.getFullYear()+'-'+(d.getMonth()+1)+'-'+d.getDate();
const fileLogger = pino(
     pino.destination({
          dest: './log/userLog '+date, sync: false
     })
);
4个回答

7

根据 Pino 文档所述,您需要使用单独的工具进行日志轮换。

使用logrotate可以轻松完成。

node myapp.js > /var/log/myapp.log

在您的服务器上安装logrotate,并创建一个带有日志轮换配置的/etc/logrotate.d/myapp文件,例如:

/var/log/myapp.log {
   su root
   daily
   rotate 7
   delaycompress
   compress
   notifempty
   missingok
   copytruncate
}

务必阅读配置文档以实现正确的日志轮转。如果在使用中遇到问题,可以查看许多其他问题关于logrotate。


3
使用logrotate是一个可行的方法。但是对于pino来说,pino-rotating-file传输方式似乎更好。

pino-rotating-file已被弃用 - undefined

1

这可能有些晚了,针对您的问题,我最近找到了一个解决方案,但是也没有发现任何一种方法是理想的。 logrotate 是Linux下的C程序,而 pino-rotating-file 需要更改程序调用命令行以通过多个程序调用管道输出。

我还没有完成测试,但是目前我正在评估的解决方案是 rotating-file-stream。它将旋转隐藏在文件流中,并与pino(至今)无缝协作。

主程序:

'use strict';

const path = require('path');
const pino = require('pino');

const logger = pino({
  name: 'testing123',
  level: 'trace',
  transport: {
    targets: [
      {
        target: path.resolve('transport-stream.js'),
        level: 'trace',
        options: {
          append: true,
          destination: path.resolve('delete-me.log'),
          interval: '5s',
          compress: 'gzip',
        }
      }
    ]
  }
});

logger.info('started');

let counter = 1;
setInterval(() => {
  logger.info(`interval #${counter}`);
}, 10_000);

transport-stream.js:

'use strict';

const {createWriteStream} = require('fs');
const rfs = require('rotating-file-stream');

module.exports = function(options) {
  const { size, interval, compress } = options;
  return rfs.createStream(options.destination, {
    size: size || "1000B",
    interval: interval || "10m",
    compress: compress || "gzip",
  });
}

0
旋转文件流库与pino完美配合。但是它会降低pino的性能,因为它需要创建和维护文件。Pino/文件传输是默认的传输方式,具有更好的性能。使用旋转文件流进行日志轮转的自定义传输方式会降低性能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接