2013-09-12 3 views
0

Я использую winston для регистрации некоторых сообщений. Поскольку сообщение большое, я хочу писать в формате gzip.Как правильно комбинировать объект gzip и filestream?

Конструктор объекта регистратора имеет аргумент потока записи. Это работает, если я прохожу файловый поток к нему:

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 и filestream?

ответ

1

Что вы делаете, как правило, в порядке. Однако gzip не будет очищать выходной буфер до тех пор, пока вы не напишете довольно много данных, поэтому файл окажется пустым, если вы только пишете одну строку.

Вы можете:

1) Напишите больше данных. (Вам нужно, iirc 16KB сжатых данных).

2) Вызвать .flush() на поток gzip.

Смежные вопросы