2013-11-07 4 views
34

Я создаю приложение на основе expressjs, и я хотел бы зарегистрировать в нем все события. Я мог бы найти winston, который кажется крутым. В любом случае, я ищу способ подключения к моему приложению expressjs.Какова наилучшая практика для журналирования expressjs?

То, что я также хочу, заключается в регистрации внутри приложения. Мои требования не так просты, поэтому я хотел бы регистрировать все внутри своего приложения (а не только запросы).

Моя текущая ситуация:

server.js (Я хотел бы войти запросов HTTP на этом уровне)

var express = require('express'); 
var app = express(); 
var fs = require('fs'); 

// Post parser 
app.configure(function(){ 
    app.use(express.bodyParser()); 
}); 

// Load routes 
require('fs').readdirSync(__dirname + '/routes').forEach(function(file) { 
    require(__dirname + '/routes/' + file)(app); 
}); 

// 404: Not found 
app.use(function(req, res, next){ 
    res.json(404, {ERROR: 'Page not found.'}); 
}); 

// 500: Error reporing 
app.use(function(err, req, res, next){ 
    console.error(err.stack); 
    res.json(500, {ERROR: 'Internal server error.'}); 
}); 

// Startup new server 
app.listen(900); 

маршруты/something.js

var something = require(__dirname + '/../controller/something.js'); 

module.exports = function(app) { 
    app.get('/v1/something', function(req, res, next) { new something().getAll(req, res, next); }); 
}; 

Контроллер/something.js (Я бы хотел (а) использовать тот же регистратор для отладки протоколирования)

/** 
* Constructor 
* 
*/ 
function Something() { 
}; 

/** 
* Get all the data 
* 
*/ 
Something.prototype.getAll = function(req, res, next) { 
    // I want to log some very important information here 
    res.json({result: true, data: ['hello', 'hi', 'ciao', 'buf']}); 
} 

module.exports = Something; 

Другая вещь, которую я имею в виду регистрирует все события в функции, которые вызываются из контроллеров (например, моделей или других библиотек).

Так что я думаю, хороший способ может создать некоторый лесоруб библиотеку, которая будет вызываться с помощью:

var logger = require(__dirname + '/../libraries/logger.js'); 

, содержащего определение регистратора. Другая проблема, которую я не знаю, как решить, - это префикс данных. Вы знаете, у меня много одновременных запросов, и я хотел бы узнать, какое сообщение отладки вызывается каждым запросом.

ответ

18

Мы используем winston, это, вероятно, самый надежный пакет регистрации.

Мы закончили настройку именно так, как вы предлагали. Создание общей библиотеки, используемой для обертывания объекта журнала вокруг наших определений и транспортов, а затем обработки любых других объектов, с которыми мы хотим обрабатывать по-разному.

https://gist.github.com/rtgibbons/7354879

+1

Заходите ли вы в файл или в базу данных? – Xerri

+2

В настоящее время мы регистрируемся в файле. Использование logrotate для управления старыми журналами. Мы проверяем использование транспорта Loggly –

6

Если вы используете экспресс, вы можете посмотреть на упаковке express-winston. Затем вы можете использовать winston в качестве промежуточного программного обеспечения и легко записывать запросы/ошибки, не делая ваш код беспорядочным ...

+0

Спасибо, я нашел это раньше, и я вижу его как очень полезно , Тем не менее, его легко использовать в качестве регистратора запросов HTTP, но я хотел бы использовать его и в приложении. –

+3

Вы можете передать свой собственный регистратор в express-winston: 'app.use (expressWinston.logger ({transports: [myLogger]}));' –

+1

expressjs теперь оснащен модулем ** morgan ** по умолчанию. когда вы вызываете вызов «экспресс-генератор» – danger89

0

Я люблю следующие протоколирование Rails-стиль:

[2017-11-02T11:13:54.545 #07738a81] Started GET /api/url for 10.0.0.1 
[2017-11-02T11:13:54.550 #07738a81] Completed 200 31739 in 5.635 ms 

Код ниже делает это

addRequestId = require('express-request-id')(setHeader: false) 
app.use(addRequestId) 

morgan = require('morgan') 
morgan.token('id', (req) -> req.id.split('-')[0]) 

app.use(morgan(
    "[:date[iso] #:id] Started :method :url for :remote-addr", 
    immediate: true)) 

app.use(morgan(" 
    [:date[iso] #:id] Completed :status :res[content-length] in :response-time ms")) 

app.use('/api', router) 
+0

Читайте внимательно, это Coffeescript (тонкая стрелка) – Sebastialonso

Смежные вопросы