0

我正在使用winston记录一些消息。因为消息很大,所以我想用 gzip 格式写。

logger 对象的构造函数有一个写入流的参数。如果我将文件流传递给它,它会起作用:

var winston = require('winston');
var out = require('fs').createWriteStream("test.log");
var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.File)({
      stream: out,
      json: false
    })
  ]
});
logger.info("test");

test.log产生

2013-09-12T07:53:14.795Z - info: test

我已阅读zlib的文档,其中显示:

这提供了对 Gzip/Gunzip、Deflate/Inflate 和 DeflateRaw/InflateRaw 类的绑定。每个类都采用相同的选项,并且是一个可读/可写的 Stream。

我尝试使用pipe组合Gzipfs如下:

var winston = require('winston');
var out = require('fs').createWriteStream("test.log");
var gzip = require('zlib').createGzip();
gzip.pipe(out, {end : true});
var logger = new (winston.Logger)({
  transports: [
    new (winston.transports.File)({
      stream: gzip,
      json: false
    })
  ]
});
logger.info("test");

但是,test.log将是空的。

如何正确组合 gzip 和 filestream 对象?

4

1 回答 1

1

你在做什么通常是好的。但是gzip,在您写入大量数据之前不会刷新其输出缓冲区,因此如果您只写入一行,则文件似乎是空的。

你可以:

1) 写入更多数据。(你需要,iirc 16KB 的压缩数据)。

2) 调用.flush()gzip 流。

于 2013-10-09T16:42:15.197 回答