Streaming de un archivo

11 views
Skip to first unread message

Tio Oscar

unread,
Jun 12, 2012, 1:32:21 PM6/12/12
to node...@googlegroups.com
Buenas, el tema es asi , tengo un sitio web que va guardando unas estadisticas en archivos en formato json, basicamente agarra el choclo de datos (no es my grande) en cada request abre el file como append, agrega ese json y lo cierra. Conun tail -f o tailf se puede ver el movimiento del archivo lo mas bien.

Ahora lo que necesito es cada vez que se meta algo en ese file disparar un evento con el bloque json que se metio, una onda streaming del archivo. Obviamente solo teniendo lo ultimo.

Alguno ya hizo algo parecido, algun modulo para recomendar?

GRacias!

--
El Tio ~ Programador, hacker y filósofo
web: http://blog.exodica.com.ar
Linked'in: http://www.linkedin.com/in/ogentilezza
Twitter: @exos, Indeti.ca: @exos
Tels: [+54 11] 638-LINUX (54689) - [+54 9 11] 6799-4797

-----BEGIN GEEK CODE BLOCK-----
Version: 3.1
GCS/IT d-- s:++ a- C+++$ UBL+++$ P(-) L+++$ !E--- W+++$ !N !o K-? !w--- !O !M-- V? PS+++@ !PE Y+(++) PGP++ !t--- !5 X++ R(+) tv--? b- DI D-- G e@ h>++ r+++(-) y+++>+++++
------END GEEK CODE BLOCK------

Martín Ciparelli

unread,
Jun 12, 2012, 1:44:25 PM6/12/12
to node...@googlegroups.com
Pero si ya estás guardando el JSON que querés, por que no simplemente disparás el evento y ya?
Si lo que querés es cambiar la forma en que escribís en el archivo para streamearlo usá fs.createWriteStream. Sino chequeá filed de Mikeal Rogers que te permite hacerlo bien fácil.

Tio Oscar

unread,
Jun 12, 2012, 2:04:54 PM6/12/12
to node...@googlegroups.com
No, me explico mejor.

Hay una web, en PHP, que escribe una especia de log, en un archivo, pero lo hace en json, digamos que no importa el formato del archivo, supongamos que es un log generado por una aplicacion x, y yo desde una app en node, quiero, cada vez que se escriba en ese archivo, agarrar el contenido nuevo, lo pongo bien facil, quiero hacer un tail -f en node.

createReadStream lo unico que hace es hacer una lectura del file pero creando un objeto streaming, al terminar el archivo se cierra.

Se entiende?

Damian Suarez

unread,
Jun 12, 2012, 2:16:53 PM6/12/12
to node...@googlegroups.com


2012/6/12 Tio Oscar <tio...@gmail.com>

Lo que tenes que hacer es observar ese archivo, llamemoslo log.json. Para eso podes utilizar el método watch del módulo file system [1].
Con esto podes 'observar' lo que le sucede al log.


Saludos.

--
LearnBoost | nodejs-es 

Tio Oscar

unread,
Jun 12, 2012, 2:25:48 PM6/12/12
to node...@googlegroups.com
Si pero eso solo me tira las fechas de modificacion, voy a tener que hacerme un modulito :P

Damian Suarez

unread,
Jun 12, 2012, 2:30:08 PM6/12/12
to node...@googlegroups.com
Logicamente vas a tener que programar un poco ... no puedo ayudarte más porque todavía no me es claro lo que queres hacer.
De todas formas con watch tenes, para mi, lo más importante que es el evento de cambio. Luego podes hacer lo que quieras ...
 

Javier Viola

unread,
Jun 12, 2012, 4:00:33 PM6/12/12
to node...@googlegroups.com
Oscar, el módulo que necesitas se llama tail [0] , es la implementación de tail de *nix, vas a tener que modificarlo para que emita un evento cuando se escribe un json, ya que el que tiene implementado es el de nueva línea.
El uso sería algo como esto

Tail = require('tail').Tail;
tail = new Tail("/var/log/syslog");
tail.on("line",function(data){
  console.log(data);
});

Saludos!

Demián Andrés Rodriguez

unread,
Jun 12, 2012, 4:14:16 PM6/12/12
to node...@googlegroups.com
Se supone que escribis un json por linea, o sea {a:1} + '\n'. Deberia servirte.

2012/6/12 Javier Viola <pepo...@gmail.com>

Javier Viola

unread,
Jun 12, 2012, 4:19:46 PM6/12/12
to node...@googlegroups.com
Demián tiene razón, debería funcionar sin problemas ya que por defecto establece el separador como el caracter de nueva línea ('\n')

(...)
tail = new Tail("/var/log/syslog")
{ filename: '/var/log/syslog',
  separator: '\n',
  readBlock: [Function],
  buffer: '',
  internalDispatcher: { _events: { next: [Function] } },
  queue: [] }

(...)

Tio Oscar

unread,
Jun 12, 2012, 5:52:35 PM6/12/12
to node...@googlegroups.com
Jaja demaciado tarde, ya hice mi version: https://github.com/exos/node-tailf

La separacion entre bloque y bloque de json que tengo es de 2 saltos de linea:

{...}

{...}
etc..

Por lo que hice esto:

var tailf = require('node-tailf');

var watchinglog = new tailf.blockTailf('my.log',/\n/);

watchinglog.on('data', function (data) {
    console.log('Data arrived: ' , data);
});
Si quieren probarlo lo pueden instalar con NPM

npm install tailf

Cualqueir colaboracion/puteada se escucha...

Tio Oscar

unread,
Jun 15, 2012, 11:27:53 AM6/15/12
to node...@googlegroups.com

Demián Andrés Rodriguez

unread,
Jun 15, 2012, 11:47:38 AM6/15/12
to node...@googlegroups.com
deja de reinventar la rueda chabon, para que queres 2 saltos de linea si con uno basta y encima ya estaba hecho?

2012/6/15 Tio Oscar <tio...@gmail.com>

Tio Oscar

unread,
Jun 15, 2012, 11:53:53 AM6/15/12
to node...@googlegroups.com
Yo no hice el script que guarda los json, sino directamente en los tiraria en una channel de redis, pero la unica que tengo es leerlos de los files esos, y como ya vienen...

Por otro lado node-tail no me sirve, hubiera podido haber hecho un fork y meterle lo que le falta para que me sirva, pero no sabia que existia cuando hice node-tailf.
Reply all
Reply to author
Forward
0 new messages