2010-07-26 19 views
9

Tane API'sini sarmalı günlük düzeylerini ve diğer birkaç şeker özelliğini sağlamak için sardım.Firebug (veya benzeri) konsolunu açarken satır numaralarına nasıl erişilir? Konsol api

Bu iyi çalışır, tek sorun, konsolun (veya başka bir konsolun) her zaman, günlüğün, konsol API'sinin kendisi çağrıldığı satırın geldiği satır numarasını bildirmesidir.

Konsolun, sarmalayıcı işlevimi çağıran satır numarasını kaydetmesini nasıl önerirsiniz?

Çapraz tarayıcı çözümü tercih ediyorum ancak bir firebug eklentisinin iyi bir başlangıç ​​olabileceğini düşünmüyorum.

Bilginize ben şöyle benim loging işlevini çağırır: Genellikle görüntülenecek satır numaralarını neden olur() yerine günlüğün) işlevlerini debug() veya hata (kullanarak

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

Eğer özenle bekliyoruz açıklamak eğer daha iyi olurdu. İşe almanızın satır numaralarını almak ister misiniz? –

cevap

0

tekrar ziyaret et.

Şimdi yaşıyorum ve bana göre çok daha iyi bir çözüm var, o zaman yapmaya çalıştığım şey, konsol işlevlerini oldukları gibi çağırmak, ancak seviye aşağı çevrildiğinde kukla işlevlerle seçici olarak değiştirmek. Bu bana ince taneli kayıt ve doğru satır numarası raporlaması veriyor. Önceki çözümümden birkaç özellik kayboldu, ancak bunun kabul edilebilir bir uzlaşma olduğunu düşünüyorum.https://github.com/antiBaconMachine/abm-log

0

. Google Chrome konsolunun benzer şekilde çalıştığına inanıyorum. (firebug reference)

+1

Bu, satır numaralarını görüntüleme sorunu değil, SAĞ satır numarasının görüntülenmesi sorunudur. Tüm günlük fonksiyonları, log fonksiyonunun çağrıldığı hat numarasını gösterir, bu fonksiyonu tamamladığımda her zaman aynı satır numarasını gösterir. –

+0

Javascript yeteneklerinin sınırlarını terk etmeye başlıyorsunuz - ne yapmak istediğinizi sorabilir miyim? Giderin? Hata ayıklama? –

3

İlginç bir sorun ... Sizin için bir kesmek olabilir. Bunu şu anda test edemiyorum, ama işe yarayabilir.

Düzenli bir işlev çağrısının işe yaramayacağını biliyoruz, bu yüzden #defines'i C ve diğer çeşitli dillerde makroları düşünmeye başladım. Ne yazık ki, javascript buna sahip değil, ama belki de eval hack çalışacaktır. eval kodunun aynı satırdan geldiği gibi kodu çalıştırmasını bekliyorum - eğer değilse, bu cevabın geri kalanını göz ardı edin.

Benim yöntem bu gibi çalışır:

    eval işaret edecek şekilde db.log fonksiyonunu değiştirme
  1. (evet, ew) yerine bir argüman olarak LogLevels içinde geçen
  2. , bunların her biri için işlevler oluşturmak Bu, içinde console.log ile bir dize ve özel bir ileti döndürür.

Bu gibi görünmelidir:

db = {LogLevel: {}}; 
db.log = eval; 
db.LogLevel.warn = function(message) { 
    return "console.log('THIS IS A WARNING: " + message + "');"; 
}; 

Sen şimdi böyle adlandırmak mümkün olmalıdır: Yani bu son zamanlarda tekrar gündeme geldi yüzden karar

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

İlginç bir fikir, kutunun dışında harika düşünmek ve neredeyse mükemmel. Çoğu tarayıcı, bir güvenlik özelliği olarak değerlendirmenizi sağlar. IE'de açıklandığı gibi çalışır. Değerlendirmeyi yerinde yapmak bir çözüm olabilir, ancak bunun konsolu ilk sırada sarmanın kullanışlılığını aşmaya başlayacağını düşünüyorum. Büyük çaba olsa da. –

+1

@Ollie Edwards - düzgün bir şekilde test etmedeki hatam! Bugün, firefox ve chrome'da kontrol ettim ve güvenlik kısıtlamalarının olduğu doğruysa da, bunun yalnızca “eval” kelimesinin ** içeriğini ** değiştirdiğinizde göründüğü anlaşılıyor. Bu nedenle, 'db' nesnesine' log' atamazsanız (sadece global olarak yaratırsanız), 'eval'ı doğru olarak kullanabilirsiniz. –

1
//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'); 
+0

İlginç görünüyor Bir oyunum var –

0

İşte kaybetmeden günlüğü sarmak için iki yol vardır: İşte

Burada tam şeyi görebilirsiniz

... 
levels : ["debug","info","warn","error"], 

    init : function(minLevel) { 
     var params = abm.getUrlParams(); 
     minLevel = params["debug"] || minLevel; 

     //TODO: firebug lite 
     window.console = window.console || {}; 

     var clear = false; 
     for (var i=0; i<self.levels.length; i++) { 
      var level = self.levels[i]; 
      originalFunctions[i] = originalFunctions[i] 
      || console[level] || fallback; 

      if (level && (clear || level===minLevel)) { 
       console[level] = originalFunctions[i]; 
       clear=true; 
      } else { 
       console[level] = suppressed(level); 
      } 
     } 

    } 
... 

ana çözümü göstermektedir benim yeni kayıt lib kısmi kesik bulunuyor bağlamı. Birincisi arayan tarafın biraz çirkin. İkincisi, sadece günlüğe kaydedilenlerin ayrıntılarına ihtiyacınız yoksa kullanılabilir.

bir demo için JSFiddle bakınız: http://jsfiddle.net/epQ95/1/

// logger method 1: allows for fully functional log-wrapping without losing context, 
//     but, it is very ugly from the caller's perspective. 
var debug = function() { 
    // do my extra special stuff 
    window.console.log("logging to server 1: ", arguments); 

    // do regular console logging, if possible 
    if (window.console && window.console.log) { 
     return window.console.log.apply.bind(window.console.log, window.console, arguments); 
    } else { 
     return function() {}; 
    } 
}; 

// caller 
debug("logger method", 1)(); 

// logger method 2: pretty calling, but you don't know what was logged, 
//     just that something definitely was. 
var Logger = {}; 
Logger.__defineGetter__("debug", function() { 
    // do my extra special stuff 
    window.console.log("logging to server 2: don't know what was logged"); 

    // do regular console logging, if possible 
    if (window.console && window.console.log) { 
     return console.log.bind(window.console); 
    } else { 
     return function() {}; 
    } 
}); 

// caller 
Logger.debug("logger method", 2);