Как использовать регистратор Morgan?
Я не могу войти в систему с Морганом. Он не записывает информацию в консоль. В документации не указано, как ее использовать.
Я хочу посмотреть, что такое переменная. Это код из файла response.js
рамки expressjs:
var logger = require("morgan");
res.render = function(view, options, fn){
options = options || {};
var self = this;
var req = this.req;
var app = req.app;
// support callback function as second arg
if ('function' == typeof options) {
fn = options, options = {};
}
// merge res.locals
options._locals = self.locals;
// default callback to respond
fn = fn || function(err, str){
if (err) return req.next(err);
self.send(str);
};
// Here I want to see what fn is
// But it doesn't show me anything in console
// How to use it?
logger(fn);
// render
app.render(view, options, fn);
};
Как использовать Morgan?
Ответы
Ответ 1
Кажется, вас тоже путают с тем же, что и я, поэтому я наткнулся на этот вопрос. Я думаю, что мы связываем ведение журнала с ручным протоколированием, как это было бы в Java с log4j (если вы знаете java), где мы создаем экземпляр Logger и говорим журнал 'this'.
Затем я выкопал код Morgan, оказывается, что это не тот тип регистратора, он предназначен для автоматического ведения запросов, ответов и связанных с ними данных. При добавлении в качестве промежуточного программного обеспечения для приложения express/connect по умолчанию ему необходимо записывать операторы в stdout, где указаны детали: удаленный ip, метод запроса, версия http, статус ответа, пользовательский агент и т.д. Он позволяет вам изменять журнал с помощью токенов или добавьте цвет к ним, указав "dev" или даже выполнив вход в выходной поток, например файл.
Для этой цели мы решили использовать ее, так как в этом случае нам все равно придется использовать:
console.log(..);
Или если вы хотите сделать вывод симпатичным для объектов:
var util = require("util");
console.log(util.inspect(..));
Ответ 2
Я думаю, что у меня есть способ, которым вы не можете получить то, что хотите, но вы можете интегрировать журнал Morgan с log4js - другими словами, вся ваша деятельность по регистрации может идти в одно и то же место. Я надеюсь, что этот дайджест с Express-сервера более или менее понятен:
var express = require("express");
var log4js = require("log4js");
var morgan = require("morgan");
...
var theAppLog = log4js.getLogger();
var theHTTPLog = morgan({
"format": "default",
"stream": {
write: function(str) { theAppLog.debug(str); }
}
});
....
var theServer = express();
theServer.use(theHTTPLog);
Теперь вы можете писать все, что хотите, в AppLog, и Morgan будет писать то, что он хочет, в том же месте, используя те же приложения и т.д. и т.д. Конечно, вы можете вызвать info() или все, что вам нравится в обертке потока, а не debug() - это просто отражает уровень ведения журнала, который вы хотите предоставить журналу Morgan req/res.
Ответ 3
Морган не должен использоваться для регистрации того, как вы описываете. Morgan был создан для ведения журнала таким образом, что серверы, такие как Apache и Nginx, регистрируются в error_log или access_log. Для справки, так вы используете morgan:
var express = require('express'),
app = express(),
morgan = require('morgan'); // Require morgan before use
// You can set morgan to log differently depending on your environment
if (app.get('env') == 'production') {
app.use(morgan('common', { skip: function(req, res) { return res.statusCode < 400 }, stream: __dirname + '/../morgan.log' }));
} else {
app.use(morgan('dev'));
}
Обратите внимание на производственную линию, в которой вы видите морган с параметром хэш {skip: ..., stream: __dirname + '/../morgan.log'}
Свойство stream
этого объекта определяет, где выдается регистратор. По умолчанию это STDOUT (ваша консоль, как и вы хотите), но она будет регистрировать только данные запроса. Он не собирается делать то, что делает console.log()
.
Если вы хотите осмотреть вещи "на лету", используйте встроенную библиотеку util
:
var util = require('util');
console.log(util.inspect(anyObject)); // Will give you more details than console.log
Итак, ответ на ваш вопрос заключается в том, что вы задаете неправильный вопрос. Но если вы все еще хотите использовать Morgan для регистрации запросов, вы идете.
Ответ 4
Я столкнулся с той же проблемой, и вместо этого я использовал winston. Как указано выше, morgan предназначен для автоматической регистрации запроса/ответа. Winston можно настроить так же, как log4Net/log4J, имеет уровни серьезности, различные потоки, к которым вы можете записывать и т.д.
Например:
npm install winston
Затем, если вы вызываете код ниже где-то при инициализации приложения:
var winston = require('winston');
// setup default logger (no category)
winston.loggers.add('default', {
console: {
colorize: 'true',
handleExceptions: true,
json: false,
level: 'silly',
label: 'default',
},
file: {
filename: 'some/path/where/the/log/file/reside/default.log',
level: 'silly',
json: false,
handleExceptions: true,
},
});
//
// setup logger for category `usersessions`
// you can define as many looggers as you like
//
winston.loggers.add('usersessions', {
console: {
level: 'silly',
colorize: 'true',
label: 'usersessions',
json: false,
handleExceptions: true,
},
file: {
filename: 'some/path/where/the/log/file/reside/usersessions.log',
level: 'silly',
json: false,
handleExceptions: true,
},
});
обратите внимание: перед вызовом кода выше winston.loggers пуст, т.е. у вас еще нет настроенных журналов. В значительной степени, как методы Log4Net/J XmlConfigure - вам нужно сначала вызвать их, чтобы начать регистрацию.
Затем, позже, где бы вы ни делали код на стороне сервера приложений, вы можете:
var winston = require('winston');
// log instances as defined in first snippet
var defaultLog = winston.loggers.get('default');
var userSessionsLog = winston.loggers.get('usersessions');
defaultLog.info('this goes to file default.log');
userSessionsLog.debug('this goes to file usersessions.log')
Надеюсь, что это поможет.
для дополнительной документации: https://www.npmjs.com/package/winston
Ответ 5
Морган: - Морган - это промежуточное ПО, которое поможет нам идентифицировать клиентов, которые обращаются к нашему приложению. В основном это регистратор.
Чтобы использовать Morgan, нам нужно выполнить следующие шаги: -
- Установите Морган, используя следующую команду:
npm install --save morgan
Это добавит morgan в файл json.package
- Включите Морган в ваш проект
var morgan = require('morgan');
3>//создаем поток записи (в режиме добавления)
var accessLogStream = fs.createWriteStream(
path.join(__dirname, 'access.log'), {flags: 'a'}
);
// setup the logger
app.use(morgan('combined', {stream: accessLogStream}));
Примечание: убедитесь, что вы не отвлекаетесь сверху, убедитесь, что у вас есть все условия, где вам нужно.
Выше автоматически создаст файл access.log для вашего root, как только пользователь получит доступ к вашему приложению.
Ответ 6
var express = require('express');
var fs = require('fs');
var morgan = require('morgan')
var app = express();
// create a write stream (in append mode)
var accessLogStream = fs.createWriteStream(__dirname + '/access.log',{flags: 'a'});
// setup the logger
app.use(morgan('combined', {stream: accessLogStream}))
app.get('/', function (req, res) {
res.send('hello, world!')
});
example nodejs + express + morgan
Ответ 7
Возможно, вы захотите использовать mongo-morgan-ext
Использование:
var logger = require('mongo-morgan-ext');
var db = 'mongodb://localhost:27017/MyDB';
var collection = 'Logs'
var skipfunction = function(req, res) {
return res.statusCode > 399;
} //Thiw would skip if HTTP request response is less than 399 i.e no errors.
app.use(logger(db,collection,skipfunction)); //In your express-application
Ожидаемый результат:
{
"RequestID": "",
"status": "",
"method": "",
"Remote-user": "",
"Remote-address": "",
"URL": "",
"HTTPversion": "",
"Response-time": "",
"date":"",
"Referrer": "",
"REQUEST": { //10
"Accept": "",
"Accept-Charset": "",
"Accept-Encoding": "",
"Accept-Language": "",
"Authorization": "",
"Cache-Control": "",
"Connection": "",
"Cookie": "",
"Content-Length": "",
"Content-MD5": "",
"Content-Type": "",
"Expect": "",
"Forwarded": "",
"From": "",
"Host": "",
"Max-Forwards": "",
"Origin": "",
"Pragma": "",
"Proxy-Authorization": "",
"Range": "",
"TE": "",
"User-Agent": "",
"Via": "",
"Warning": "",
"Upgrade": "",
"Referer": "",
"Date": "",
"X-requested-with": "",
"X-Csrf-Token": "",
"X-UIDH": "",
"Proxy-Connection": "",
"X-Wap-Profile": "",
"X-ATT-DeviceId": "",
"X-Http-Method-Override":"",
"Front-End-Https": "",
"X-Forwarded-Proto": "",
"X-Forwarded-Host": "",
"X-Forwarded-For": "",
"DNT": "",
"Accept-Datetime": "",
"If-Match": "",
"If-Modified-Since": "",
"If-None-Match": "",
"If-Range": "",
"If-Unmodified-Since": ""
},
"RESPONSE": {
"Status": "",
"Content-MD5":"",
"X-Frame-Options": "",
"Accept-Ranges": "",
"Age": "",
"Allow": "",
"Cache-Control": "",
"Connection": "",
"Content-Disposition": "",
"Content-Encoding": "",
"Content-Language": "",
"Content-Length": "",
"Content-Location": "",
"Content-Range": "",
"Content-Type":"",
"Date":"",
"Last-Modified": "",
"Link": "",
"Location": "",
"P3P": "",
"Pragma": "",
"Proxy-Authenticate": "",
"Public-Key-Pins": "",
"Retry-After": "",
"Server": "",
"Trailer": "",
"Transfer-Encoding": "",
"TSV": "",
"Upgrade": "",
"Vary": "",
"Via": "",
"Warning": "",
"WWW-Authenticate": "",
"Expires": "",
"Set-Cookie": "",
"Strict-Transport-Security": "",
"Refresh":"",
"Access-Control-Allow-Origin": "",
"X-XSS-Protection": "",
"X-WebKit-CSP":"",
"X-Content-Security-Policy": "",
"Content-Security-Policy": "",
"X-Content-Type-Options": "",
"X-Powered-By": "",
"X-UA-Compatible": "",
"X-Content-Duration": "",
"Upgrade-Insecure-Requests": "",
"X-Request-ID": "",
"ETag": "",
"Accept-Patch": ""
}
}
Ответ 8
В моем случае:
-console.log() // works
-console.error() // works
-app.use(logger('dev')) // Morgan is NOT logging requests that look like "GET /myURL 304 9.072 ms - -"
ИСПРАВЛЕНИЕ: я использовал код Visual Studio, и мне пришлось добавить его в мою конфигурацию запуска
"outputCapture": "std"
Если вы работаете в среде IDE, запустите ее непосредственно из командной строки, чтобы убедиться, что среда IDE не вызывает проблемы.