目前的服務端錯誤處理
服務端使用NodeJs的restify作為app的rest服務接口,用restify的好處是沒有太多框架的東西,能更好的控制服務端的代碼邏輯。
關于錯誤日志記錄,目前是使用在route的handler里面使用try catch,如果不這樣做的話服務端的錯誤就會暴露給客戶端,從安全和體驗的角度上看都是不友好的。不沒有捕獲的錯誤restify是會這樣處理的:
res.send(err); //在中間件中調用next(err)是一樣的效果
目前項目使用log4j記錄日志,一般用法是:
var logger = getLogger('requestUrl')
logger.warn(err.stack);
除了出錯信息,還帶上了初始化logger時的信息requestUrl
,當然信息可以自定義,例如來自某某操作的日志
不足之處
- 代碼冗余(業務分散),例如每個handler里面都要require logger,都要實行
try catch
機制。 - 日志信息不全,缺少請求對象的詳細信息
更好的錯誤日志處理方案
先看看restify的文檔
文檔中給出了各種事件,下面代碼就用uncaughtException為例子說明如何更好的處理錯誤, 例子吧當前請求的路徑和錯誤都打印出來,還可以吧請求對象保存起來,放在MongoDB里面瞬間查找高大上了有沒有。。。
server.on('uncaughtException', function (req, res, route, err) {
console.log(route); // log the route, woo...
console.log(err.stack); // log the error
var message = 'WTF';
if (err instanceof MyError) {
message = err.message; // custom output message, cool
}
res.send(400, { message: message }); // status code can depend on the Error Type
});
完整代碼請參考
https://gist.github.com/calvinxiao/ada4a6f4314acd984246