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");
5 Réponses :
En utilisant généralement le débogage () ou l'erreur () au lieu de fonctions de journal () entraînera l'affichage des numéros de ligne. Je crois que la console Google Chrome fonctionne de la même manière. ( Référence Firebug < / a>) p>
Ce n'est pas une question d'affichage des numéros de ligne, c'est une question d'affichage du numéro de ligne de droite. Toutes les fonctions de journal affichent le numéro de ligne à laquelle la fonction de journal a été appelée, dans mon cas, car j'ai enveloppé cette fonction, il affiche toujours le même numéro de ligne.
Vous commencez à quitter les limites des capacités JavaScript - Puis-je vous demander ce que vous cherchez à faire? Dépanner? Déboguer?
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 Ma méthode fonctionne comme ceci : p> Il devrait ressembler à quelque chose comme ceci: p> vous devrait em> pouvoir l'appeler comme ceci maintenant: p > 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>
eval code> (oui, ew) li>
console.log code> en elle et un message personnalisé. LI>
ol>
db.log(db.LogLevel.warn("Blah blah blah"));
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 b> de eval code>. Par conséquent, si vous n'attribuez pas
journal code> à l'objet code> dB code> (simplement le créer globalement), vous pouvez alias
eval code> juste bien.
Donc, cela est arrivé récemment, alors j'ai décidé de la reviser.
Maintenant que je suis plus vieux et plus sage, il est clair pour moi une solution bien meilleure que ce que j'essayais de faire est d'appeler les fonctions de la console comme elles sont mais les remplacent sélectivement avec des fonctions factices lorsque le niveau est refusé. Cela me donne une forte journalisation graine et un rapport de numéro de ligne précis. Quelques caractéristiques ont été perdues de ma solution précédente, mais je pense que c'est un compromis acceptable. P>
Voici un snip partiel de ma nouvelle journalisation libérée qui montre la solution principale p> Vous pouvez voir la chose complète ici: https://github.com/antibaconmachine/abm- Connectez-vous P> p>
//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');
Semble intéressant, je vais avoir une pièce de théâtre
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/ p>
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?