9
votes

Comment accéder aux numéros de ligne lors de l'emballage de l'API de console Firebug (ou similaire)

J'ai enveloppé l'API de la console pour fournir des niveaux de journalisation granulaires ainsi que peu d'autres caractéristiques du sucre.

Cela fonctionne bien, le seul problème est que Firebug (ou autre console) signalera toujours le numéro de ligne du journal. D'après la ligne, l'API de la console elle-même est invoquée. P>

Comment suggéreriez-vous que je fais connecter la console le numéro de ligne sur lequel j'appelle ma fonction d'emballage? STRUT> P> Je préférerais une solution de navigateur croisée mais je défaut qu'un plug-in Firebug pourrait être un bon départ. P>

FYI J'appelle ma fonction de journalisation comme SO: P>

db.log(db.LogLevel.WARN, "Blah Blah Blah");


1 commentaires

Ce serait mieux si vous pouvez expliquer ce que vous attendez de manière élaborée. Voulez-vous obtenir les numéros de ligne de l'invocation de votre fonction?


5 Réponses :



3
votes

problème intéressant ... j'ai peut-être un piratage pour vous. Je ne peux pas tester cela maintenant, mais je pense que cela pourrait fonctionner.

Nous savons qu'un appel de fonction régulier ne fonctionnera pas, j'ai donc commencé à penser à #defines dans C et macros dans diverses autres langues. Malheureusement, JavaScript n'a pas cela, mais peut-être un eval code> piratage fonctionnera fort>. J'attends que eval code> exécutera le code comme s'il venait de la même ligne - Sinon, Sleh, ignore le reste de cette réponse. P>

Ma méthode fonctionne comme ceci : p>

  1. changez votre fonction db.log en point sur eval code> (oui, ew) li>
  2. au lieu de passer dans vos déconnexions en tant qu'argument, créez des fonctions pour chacun d'entre eux qui renvoie une chaîne avec console.log code> en elle et un message personnalisé. LI> ol>

    Il devrait ressembler à quelque chose comme ceci: p> xxx pré>

    vous devrait em> pouvoir l'appeler comme ceci maintenant: p >

    db.log(db.LogLevel.warn("Blah blah blah"));
    


2 commentaires

Idée intéressante, bonne pensée hors de la boîte et presque brillante. Il tombe dans la mesure où la plupart des navigateurs ne vous laisseront pas votre alias Eval comme une fonctionnalité de sécurité. Dans IE, cela fonctionne comme décrit. Calling Eval in Place pourrait être une solution de contournement, même si je pense que cela commencerait à éroder l'utilité d'envelopper la console en premier lieu. Grand effort cependant.


@Ollie Edwards - Ma faute pour ne pas le tester correctement! J'ai vérifié aujourd'hui, dans Firefox et Chrome, et pendant que vous avez raison, il semble que cela ne soit que si vous modifiez le contexte Context de eval . Par conséquent, si vous n'attribuez pas journal à l'objet dB (simplement le créer globalement), vous pouvez alias eval juste bien.




1
votes
//trust me, this way rocks!  Auto prepend a logHead, yet keep correct line number displayed debug view.
//Output sample:
//  5/10 1:13:52.553  hi                                    a.js:100
//  5/10 1:13:52.553  err                                   b.js:200

    var Log = {
        debug : true,

        /*
         * log.d(logData1, logData2, ...)
         *  --> console.log( getLogHead(), logData1, logData2, ...)
         * 
         * @comment Using bind and property accesser
         * @see http://ejohn.org/blog/javascript-getters-and-setters/
         */
        get d() { 
            if ( !this.debug) return _emptyFunc;
            return console.log.bind( console, this._getLogHeader() );
        },

        /*
         * output error info
         */
        get e() { 
            return console.error.bind( console, this._getLogHeader() );
        },

        /**
         * get current time in 01/31 23:59:59.999 format
         */
        _getLogHeader : function () {

            var millisec = Date.now();
            this._dtNow.setTime( millisec );
            //toLocaleString is 2013/01/31 23:59:59
            return this._dtNow.toLocaleString().slice( 5 ) + '.' + ('000' + millisec).slice( -3 ) + ' ';
        },
        _dtNow: new Date(),
        _emptyFunc: function() {}
    };


    //enjoy it !
        Log.d('hi');
        Log.e('err');

1 commentaires

Semble intéressant, je vais avoir une pièce de théâtre



0
votes

Voici deux façons d'envelopper la journalisation sans perdre de contexte. Le premier est un peu moche du côté de l'appelant. La seconde n'est utilisable que si vous n'avez pas besoin des détails de ce qui a été enregistré.

Voir le jsfiddle pour une démonstration: http://jsfiddle.net/epq95/1/ xxx


0 commentaires