【问题标题】:How to correctly combine gzip and filestream object?如何正确组合 gzip 和 filestream 对象?
【发布时间】:2013-09-12 08:00:43
【问题描述】:

我正在使用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对象?

【问题讨论】:

    标签: node.js logging stream


    【解决方案1】:

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

    你可以:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-10
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多