ugrás a tartalomhoz

NodeJs - konzol átirányítása

inf3rno · 2012. Szep. 30. (V), 07.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:

var fs = require('fs');
var logStream = fs.createWriteStream(__dirname+'/node.log', { flags: 'a' });
process.stdout.pipe(logStream);
process.stderr.pipe(logStream);
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), 09.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.
var access = fs.createWriteStream(__dirname + '/node.access.log', { flags: 'a' }),
    error = fs.createWriteStream(__dirname + '/node.error.log', { flags: 'a' });

process.stdout.pipe(access);
process.stderr.pipe(error);
2

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

dropout · 2012. Szep. 30. (V), 09.20
var fs = require('fs');  
var logStream = fs.createWriteStream(__dirname+'/node.log', { flags: 'a' });  

process.__defineGetter__('stdout', function() {
  return logStream;
});

process.__defineGetter__('stderr', function() {
  return logStream;
});

console.log("wrrriitee sommmee tessttsssss");  
3

Köszi, ez hiányzott hozzá!

inf3rno · 2012. Szep. 30. (V), 17.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. Szep. 30. (V), 23.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

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

Fura, az stderr nem tudom

inf3rno · 2012. Okt. 1. (H), 05.06
Fura, az stderr nem tudom pontosan mit ad vissza, de úgy tűnik, hogy semmit nem ír a fájlba...

process.addListener("uncaughtException", function (err) {
    console.log("Uncaught exception: " + err);
    console.trace();
});
Í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:

var fs = require('fs');
var logStream = fs.createWriteStream(__dirname + '/node.log', { flags: 'a' });
var logWrite = logStream.write;
logStream.write = function () {
    arguments[0] = "[PID " + process.pid + " - " + new Date().toGMTString() + "] - " + arguments[0];
    logWrite.apply(this, arguments);
};
process.__defineGetter__('stdout', function () {
    return logStream;
});
process.__defineGetter__('stderr', function () {
    return logStream;
});
process.addListener("uncaughtException", function (err) {
    process.stderr.write(err.stack + "\n");
});
7

Syslog

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

Én egyelőre összedobtam egy

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

logger.js

/** @module core.Logger*/

var Class = require('./Class.js'),
    ThroughStream = require('./stream.js').ThroughStream;

/**
 * @class
 * @extends ThroughStream
 */
var LogDecoratorStream = ThroughStream.extend(/** @lends LogDecoratorStream#*/{
    write: function () {
        arguments[0] = "[PID " + process.pid + " - " + new Date().toGMTString() + "] - " + arguments[0];
        return ThroughStream.prototype.write.apply(this, arguments);
    }
});

/** @class */
var Logger = Class.create(/** @lends Logger# */{
    /** @type Boolean*/
    hooked: false,
    /** @type LogDecoratorStream*/
    decorator: null,
    /** @constructs*/
    constructor: function () {
        this.stdout = process.stdout;
        this.stderr = process.stderr;
        this.decorator = new LogDecoratorStream();

        this.stdoutGetter = function () {
            return this.stdout;
        }.bind(this);
        this.stderrGetter = function () {
            return this.stderr;
        }.bind(this);
        this.decoratorGetter = function () {
            return this.decorator;
        }.bind(this);

        this.errorLogger = function (error) {
            process.stderr.write(error.stack + "\n");
        };
    },
    /** @param {Stream} stream*/
    hook: function (stream) {
        if (this.hooked)
            this.unHook();
        this.decorator.pipe(stream);
        process.__defineGetter__('stdout', this.decoratorGetter);
        process.__defineGetter__('stderr', this.decoratorGetter);
        process.addListener("uncaughtException", this.errorLogger);
        this.hooked = true;
    },
    unHook: function () {
        if (!this.hooked)
            return;
        this.decorator.removeAllListeners();
        process.__defineGetter__('stdout', this.stdoutGetter);
        process.__defineGetter__('stderr', this.stderrGetter);
        process.removeListener("uncaughtException", this.errorLogger);
        this.hooked = false;
    }
});

var logger = new Logger();
module.exports = {
    /** @returns Logger*/
    getInstance: function () {
        return logger;
    }
};
console.js

var net = require('net');
var server = net.createServer(function (socket) {
    console.log("console server created");
    socket.pipe(process.stdout);
});
server.listen(12345, function () {
    console.log("listening port 12345");
});
main.js

var logger = require('./core/Logger.js').getInstance(),
    net = require("net");

logger.hook(net.connect({port: 12345}, function () {
    console.log("console client created");
}));
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), 12.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

inf3rno · 2012. Okt. 1. (H), 17.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.