ugrás a tartalomhoz

NodeJs - konzol átirányítása

inf · 2012. Szep. 30. (V), 08.17
Üdv.

Próbálkozok azzal, hogy a console.log és a hibaüzenetek külön helyre menjenek. Az van, hogy appjs-t próbálom használni, de nehéz debuggolni, ha nem látom a hibaüzeneteket...

Így próbáltam fájlba küldeni:
  1. var fs = require('fs');  
  2. var logStream = fs.createWriteStream(__dirname+'/node.log', { flags: 'a' });  
  3. process.stdout.pipe(logStream);  
  4. process.stderr.pipe(logStream);  
  5. console.log("teszt");  
A fájl létre is jött, de a console.log ugyanúgy az aktuális konzol ablakba ment, és nem a fájlba. Mit rontok el?
 
1

bízd a felhasználóra

Poetro · 2012. Szep. 30. (V), 10.15
Miért nem irányítod egyszerűen át az alkalmazásodat?
$ node myapp 1>>std.log 2>>err.log
Persze az is lehet a probléma, hogy mindkettő kimenetet ugyanabba a stream-be irányítod.
  1. var access = fs.createWriteStream(__dirname + '/node.access.log', { flags: 'a' }),  
  2.     error = fs.createWriteStream(__dirname + '/node.error.log', { flags: 'a' });  
  3.   
  4. process.stdout.pipe(access);  
  5. process.stderr.pipe(error);  
2

Átirányítás szerintem is jobb ötlet, de...

dropout · 2012. Szep. 30. (V), 10.20
  1. var fs = require('fs');    
  2. var logStream = fs.createWriteStream(__dirname+'/node.log', { flags: 'a' });    
  3.   
  4. process.__defineGetter__('stdout'function() {  
  5.   return logStream;  
  6. });  
  7.   
  8. process.__defineGetter__('stderr'function() {  
  9.   return logStream;  
  10. });  
  11.   
  12. console.log("wrrriitee sommmee tessttsssss");    
3

Köszi, ez hiányzott hozzá!

inf · 2012. Szep. 30. (V), 18.07
Köszi, ez hiányzott hozzá! :-)

Nyilván átirányítom másik alkalmazáshoz, csak így volt a legkönnyebb kipróbálni, hogy működik e. Azt olvastam, hogyha direktbe fájl stream-re küldöm, akkor blokkoló lesz, ha viszont másik alkalmazásba, és az írja a fájl stream-et, akkor már nem blokkoló. Mondjuk a végcél az, hogy megnyitom a másik alkalmazást egy konzol ablakban, és oda írja ki az összes hibát a rendszer. Ezt azt hiszem úgy lehet csak, hogy a konzol ablak figyel egy adott portot, az összes alkalmazás meg erre a portra küldi az stdout-ot meg stderr-t.
4

Talan...

dropout · 2012. Okt. 1. (H), 00.25
En nyitnek egy terminalt es oda kuldenek mindent, a nodejs-t ilyen szempontbol nem hasznalnam, de nem tiszta teljesen a kep ugyhogy lehet ez a tipp nem segit...
5

Még nekem sem, majd holnap

inf · 2012. Okt. 1. (H), 01.18
Még nekem sem, majd holnap összerakom...
6

Fura, az stderr nem tudom

inf · 2012. Okt. 1. (H), 06.06
Fura, az stderr nem tudom pontosan mit ad vissza, de úgy tűnik, hogy semmit nem ír a fájlba...
  1. process.addListener("uncaughtException"function (err) {  
  2.     console.log("Uncaught exception: " + err);  
  3.     console.trace();  
  4. });  
Így viszont igen. Érdekes módon a trace() csak akkor fut le, ha az stderr is át van irányítva...

szerk:
Ja úgy néz ki, hogy stderr-ra semmi nem megy alapból. Stdout-ra kell küldeni mindent, az stderr-hoz nem kell hozzányúlni. Még azon agyalok, hogy az stdout-nál hogyan tudnám a PID-t és a dátumot hozzáadni a log-hoz.

Ez lett a vége a fájlos loggolásnak:
  1. var fs = require('fs');  
  2. var logStream = fs.createWriteStream(__dirname + '/node.log', { flags: 'a' });  
  3. var logWrite = logStream.write;  
  4. logStream.write = function () {  
  5.     arguments[0] = "[PID " + process.pid + " - " + new Date().toGMTString() + "] - " + arguments[0];  
  6.     logWrite.apply(this, arguments);  
  7. };  
  8. process.__defineGetter__('stdout'function () {  
  9.     return logStream;  
  10. });  
  11. process.__defineGetter__('stderr'function () {  
  12.     return logStream;  
  13. });  
  14. process.addListener("uncaughtException"function (err) {  
  15.     process.stderr.write(err.stack + "\n");  
  16. });  
7

Syslog

janoszen · 2012. Okt. 1. (H), 10.49
Ha erdekel, akkor irtam syslog libet NodeJS-hez: https://github.com/janoszen/node-nativesyslog
8

Én egyelőre összedobtam egy

inf · 2012. Okt. 1. (H), 11.26
Én egyelőre összedobtam egy logger osztályt. (Egyelőre egyszerre csak egy helyre tudja küldi az adatokat.)

logger.js
  1. /** @module core.Logger*/  
  2.   
  3. var Class = require('./Class.js'),  
  4.     ThroughStream = require('./stream.js').ThroughStream;  
  5.   
  6. /** 
  7.  * @class 
  8.  * @extends ThroughStream 
  9.  */  
  10. var LogDecoratorStream = ThroughStream.extend(/** @lends LogDecoratorStream#*/{  
  11.     write: function () {  
  12.         arguments[0] = "[PID " + process.pid + " - " + new Date().toGMTString() + "] - " + arguments[0];  
  13.         return ThroughStream.prototype.write.apply(this, arguments);  
  14.     }  
  15. });  
  16.   
  17. /** @class */  
  18. var Logger = Class.create(/** @lends Logger# */{  
  19.     /** @type Boolean*/  
  20.     hooked: false,  
  21.     /** @type LogDecoratorStream*/  
  22.     decorator: null,  
  23.     /** @constructs*/  
  24.     constructor: function () {  
  25.         this.stdout = process.stdout;  
  26.         this.stderr = process.stderr;  
  27.         this.decorator = new LogDecoratorStream();  
  28.   
  29.         this.stdoutGetter = function () {  
  30.             return this.stdout;  
  31.         }.bind(this);  
  32.         this.stderrGetter = function () {  
  33.             return this.stderr;  
  34.         }.bind(this);  
  35.         this.decoratorGetter = function () {  
  36.             return this.decorator;  
  37.         }.bind(this);  
  38.   
  39.         this.errorLogger = function (error) {  
  40.             process.stderr.write(error.stack + "\n");  
  41.         };  
  42.     },  
  43.     /** @param {Stream} stream*/  
  44.     hook: function (stream) {  
  45.         if (this.hooked)  
  46.             this.unHook();  
  47.         this.decorator.pipe(stream);  
  48.         process.__defineGetter__('stdout'this.decoratorGetter);  
  49.         process.__defineGetter__('stderr'this.decoratorGetter);  
  50.         process.addListener("uncaughtException"this.errorLogger);  
  51.         this.hooked = true;  
  52.     },  
  53.     unHook: function () {  
  54.         if (!this.hooked)  
  55.             return;  
  56.         this.decorator.removeAllListeners();  
  57.         process.__defineGetter__('stdout'this.stdoutGetter);  
  58.         process.__defineGetter__('stderr'this.stderrGetter);  
  59.         process.removeListener("uncaughtException"this.errorLogger);  
  60.         this.hooked = false;  
  61.     }  
  62. });  
  63.   
  64. var logger = new Logger();  
  65. module.exports = {  
  66.     /** @returns Logger*/  
  67.     getInstance: function () {  
  68.         return logger;  
  69.     }  
  70. };  
console.js
  1. var net = require('net');  
  2. var server = net.createServer(function (socket) {  
  3.     console.log("console server created");  
  4.     socket.pipe(process.stdout);  
  5. });  
  6. server.listen(12345, function () {  
  7.     console.log("listening port 12345");  
  8. });  
main.js
  1. var logger = require('./core/Logger.js').getInstance(),  
  2.     net = require("net");  
  3.   
  4. logger.hook(net.connect({port: 12345}, function () {  
  5.     console.log("console client created");  
  6. }));  
Ami igazán meglepő volt, hogy minimális stream-ekről való tanulás után mennyire egyszerűen ki lehet küldeni konzolba.

Persze, érdekel a te megoldásod is, megnézem mindjárt...

Ahogy nézem a tiéd meg kiküldi egy szebb megjelenítőnek. Úgy sejtem ahhoz, hogy windows-on is menjen át kéne írni pl a "unix_dgram"-ot másra. :-) Jól jön, mert a sima szövegként kiküldés, amit én csináltam nem túl szemléletes.
9

Windows

janoszen · 2012. Okt. 1. (H), 13.03
Windowson nem megy, mivel nincs syslog, ez vilagos. Amit a helyedben megnezenek, az a GELF, vagyis a Graylog Extended Log Format.
10

Nézegettem, hogy vannak

inf · 2012. Okt. 1. (H), 18.46
Nézegettem, hogy vannak syslog megoldások windows-ra is. Majd megpróbálok valamit összehozni a témában. Kérdés, hogy hogyan lehet mindent áttenni rá, mert a jelenlegi kódom az error-t meg console-t ismer, ahogy néztem nálad meg legalább 10 féle fokozat volt.