2014-03-06 100 views
0

背景

是的,有很多不同的Node.js日誌庫winston,bunyan和console.log。記錄特定請求的信息時很容易,以及什麼時候和什麼信息將作爲響應。快速記錄存儲請求信息

問題

問題始於子函數調用。當在一個請求下調用同樣使用相同日誌記錄的多個函數時,如何將請求元數據傳遞給這些日誌調用(函數參數似乎是一種可能的方式,但這些實際上很混亂)?

小的視覺編碼員:

// Middleware to set some request based information 
app.use(function (req, res, next) { 
    req.rid = 'Random generated request id for tracking sub queries'; 
}); 

app.get('/', function (req, rest) { 

    async.series({ 
    'users': async.apply(db.users.find), 
    'posts': async.apply(db.posts.find), 
    }, function (err, dbRes) { 
    console.log('API call made ', req.rid) 
    res.end(dbRes); 

    }); 


}); 


// Now the database functions are in other file but we also need to track down the request id in there 
(db.js) 

module.exports = { 
    users: { 
     find: function() { 
     console.log('Calling users listing ', req.rid); // ERROR this is not possible to access, not in this scope 
     // Make query and return result 
     } 

    }, 

    posts: { 
     find: function() { 
     console.log('Calling post listing ', req.rid); // ERROR this is not possible to access, not in this scope 
     // Make query and return result 
     } 

    } 

}; 

回答

0

您可以登錄與您app.js簡單的conf您的要求;

app.use(function(req, res, next){ 
    console.log('%s %s', req.method, req.url); 
    next(); 
}); 

但是,您需要爲控制器中的特定功能提供日誌。

+0

是的,實際上在一些搜索後發現了一些可能的解決方案:其中一個包括使用允許存儲數據的域,但這是一種拙劣的方式。目前我發現的最好的解決方案是使用這個庫https://github.com/othiym23/node-continuation-local-storage。 –

+0

然而,爲了做到這一點,你還需要做一些額外的工作 –

+0

實際上,這並不能解決問題,解決這個問題的唯一方法是當前將對象引用傳遞給所有使用日誌記錄的函數(WOW聽起來是最糟糕的計劃曾經)。 –