我正在使用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 类的绑定。每个类都采用相同的选项,并且是可读/可写的流。
我尝试使用pipe
将Gzip
和fs
结合起来,如下所示:
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()
。