2013-04-08 14 views
8

Bir istekte bulunan kullanıcının user_id'ini ve javascript sınıfı için çağrılan her yöntemin yöntem adını günlüğe kaydetmek istiyorum. Örneğin: her şey bu yananode.js'de her yöntem çağrısını her yerde hata ayıklama satırları eklemeden nasıl kaydedebilirim?

35 - log_in 
35 - list_of_other_users 
78 - log_in 
35 - send_message_to_user 
35 - connect_to_redis 
78 - list_of_other_users 

zaman uyumsuz kullanıcı 35 ve 78 aynı anda şeyler yapıyor olabilir olduğunu. Bu yüzden, her bir günlük hattının user_id ile başladığından emin olmak istiyorum. Bu yüzden, bunun için grepleyebiliyorum ve yalnızca bir kullanıcının etkinliğini bir kerede görebiliyorum.

Her yönteme günlükleyici ifadeleri eklemeden bunu yapmanın süper akıllı bir yolu var mı?

+0

Olası kopyalar [Nasıl node.js uygulamalarında hata edersiniz?] (Http://stackoverflow.com/questions/1911015/how-do-i-debug-node-js- uygulama) – Sylar

cevap

2

Bunun bir web uygulaması olduğunu tahmin ediyorum, bu durumda, eğer bağlantı kullanıyorsanız, kullanıcıyı ve URL yolunu kaydeden bir logger middleware kullanabilirsiniz, bu muhtemelen yeterlidir. Aksi takdirde, günlüğe kaydetme işlemini yapmak için bir sarıcı işlevindeki her işlevin sarma çizgileri boyunca bazı meta programlamayı yapmanız gerekecektir. Bunun için

function logCall(realFunc, instance) { 
    return function() { 
     log.debug('User: ' + instance.user_id + ' method ' + realFunc.name); 
     return realFunc.apply(instance, arguments); 
    }; 
} 

anonim değil, sınıf yöntemin adlandırılmış olması gerekir fonksiyonlarını çalışmak.

function sendMessage() { 
    //code to send message 
    //can use `this` to access instance properties 
} 
function MyClass(userId) { 
    this.userId = userId; //or whatever 
    this.sendMessage = logCall(sendMessage, this); 
    //repeat above line for each instance method you want instrumented for logging 
} 
4

Bu, olsa ne kadar güvenilir, tamamen emin bir alternatiftir yanlış biraz hissediyor: Gördüğünüz gibi

(function() { 
    var oldCall = Function.prototype.call; 
    var newCall = function(self) { 
    Function.prototype.call = oldCall; 
    console.log('Function called:', this.name); 
    var args = Array.prototype.slice.call(arguments, 1); 
    Function.prototype.call = newCall; 
    this.apply(self, args); 
    } 
    Function.prototype.call = newCall; 
})(); 

, bu call fonksiyonu sona erdirir - Bu hafif bir sorun yaratır console.log() aramayı denediğinizde, işlevi geri almanız gerekir. Ama işe yarıyor gibi görünüyor! Bu yana

DÜZENLEME

CoffeeScript etiketlenmiş:

do -> 
    oldCall = Function::call 
    newCall = (self) -> 
    Function::call = oldCall 
    console.log "Function called: #{this.name}" 
    args = Array.prototype.slice.call arguments, 1 
    Function::call = newCall 
    this.apply self, args 
    Function::call = newCall 
+0

Dilim bir işlev olarak adlandırıldığından bu benim için sonsuz bir tekrarlamaya giriyor. NewCall'ı ayarlamadan önce sonucu çağırmalı ve sonucu aşağıdaki değişken olarak iletmeliydim. Bu şimdi çalışıyor –

+1

@AlexLehmann sonsuz özyineleme önlemek için kod nasıl değiştirilir emin değilim? –

5

cevap

(function() { 
    var oldCall = Function.prototype.call; 
    var newCall = function(self) { 
    Function.prototype.call = oldCall; 
    console.log('Function called:', this.name); 
    var args = Array.prototype.slice.call(arguments, 1); 
    var res = this.apply(self, args); 
    Function.prototype.call = newCall; 
    return res 
    } 
    Function.prototype.call = newCall; 
})(); 
JavaScript temelde doğru, ama burada sonsuz özyinelemeye

önlemek için nasıl

CoffeeScript

do -> 
    oldCall = Function::call 
    newCall = (self) -> 
    Function::call = oldCall 
    console.log "Function called: #{this.name}" 
    args = Array.prototype.slice.call arguments, 1 
    res = this.apply self, args 
    Function::call = newCall 
    res 
    Function::call = newCall 
ait
+1

Bu harika, ancak bunun nasıl çalıştığını ve belki de kullanım örneği sunabileceği konusunda biraz ışık tutabilir misiniz? Oldukça ilerlemelidir ve SE yeni başlayanlar/karşılıklı kullanıcılar içindir. : D – zehelvion