如何正确组合 gzip 和文件流对象



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

记录器对象的构造函数具有写入流的参数。如果我将文件流传递给它,它可以工作:

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 类的绑定。每个类都采用相同的选项,并且是可读/可写的流。

我尝试使用pipeGzipfs结合起来,如下所示:

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 和文件流对象?

你正在做的事情通常没问题。但是,在您写入相当多的数据之前,gzip不会刷新其输出缓冲区,因此如果您只写入一行,该文件将显示为空。

您可以:

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

2) 在 gzip 流上调用.flush()

相关内容

  • 没有找到相关文章

最新更新