middleware de morgan
Requisição de logger middleware HTTP para node.js
Nomeado após Dexter, uma série que você não deve assistir até a conclusão.
Instalação
Este é um módulo Node.js disponível através do
registro do npm. A instalação é feita usando o comando
npm install:
$ npm install morganAPI
var morgan = require('morgan');morgan(formato, opções)
Crie uma nova função middleware de agente de login usando o formato e opções informados.
O argumento format pode ser uma string de um nome predefinido (veja abaixo para os nomes),
uma string de uma string de formato, ou uma função que produzirá uma entrada de log.
A função format será chamada com três argumentos tokens, req, e res,
onde ‘tokens’ é um objeto com todos os tokens definidos, ‘req’ é a solicitação HTTP e ‘res’
é a resposta HTTP. Espera-se que a função retorne uma string que será a linha
registro ou undefined / null para pular o log.
Usando uma string de formato predefinida
morgan('tiny');Usando formato de string de tokens predefinidos
morgan(':method :url :status :res[content-length] - :response-time ms');Usando uma função de formato personalizado
morgan(function (tokens, req, res) { return [ tokens.method(req, res), tokens.url(req, res), tokens.status(req, res), tokens.res(req, res, 'content-length'), '-', tokens['response-time'](https://github.com/expressjs/morgan/blob/HEAD/req, res), 'ms' ].join(' ')})Opções
Morgan aceita essas propriedades no objeto de opções.
imediato
Escrever linha de log na solicitação em vez de resposta. Isso significa que um pedido será registrado mesmo que o servidor falhe, mas dados da resposta (como o código de resposta, comprimento de conteúdo, etc.) não pode ser logado.
Pular
Função para determinar se o log é ignorado, o padrão é false. Esta função
será chamada como skip(req, res).
// EXAMPLE: only log error responsesmorgan('combined', { skip: function (req, res) { return res.statusCode < 400; },});fluxo
Fluxo de saída para escrever linhas de log, padrão para process.stdout.
Formatos predefinidos
Existem vários formatos predefinidos fornecidos:
combinado
Saída de log combinado padrão de Apache.
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"# will output::1 - - [27/Nov/2024:06:21:42 +0000] "GET /combined HTTP/1.1" 200 2 "-" "curl/8.7.1"comum
Saída de log comum padrão Apache.
:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]# will output::1 - - [27/Nov/2024:06:21:46 +0000] "GET /common HTTP/1.1" 200 2desenvolvedor
Saída concisa colorida pelo status de resposta para uso do desenvolvimento. O :status
token será colorido verde para códigos de sucesso, vermelho para códigos de erro do servidor,
amarelo para códigos de erro do cliente, cyan para códigos de redirecionamento e
não coloridos para códigos de informação.
:method :url :status :response-time ms - :res[content-length]# will outputGET /dev 200 0.224 ms - 2curto
Menor que o padrão, incluindo também o tempo de resposta.
:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms# will output::1 - GET /short HTTP/1.1 200 2 - 0.283 msminúsculo
A saída mínima.
:method :url :status :res[content-length] - :response-time ms# will outputGET /tiny 200 2 - 0.188 msTokens
Criando novos tokens
Para definir um token, basta invocar morgan.token() com o nome e uma função de retorno de chamada.
Esta função de callback é esperada para retornar um valor de string O valor retornado está
disponível como “:type” neste caso:
morgan.token('type', function (req, res) { return req.headers['content-type'];});Chamando morgan.token() usando o mesmo nome que um token existente substituirá que a definição
do token.
Espera-se que a função de token seja chamada com os argumentos req e res, representando
a solicitação HTTP e a resposta HTTP. Além disso, o token pode aceitar mais argumentos de
que ele escolheu personalizar o comportamento.
:date[format]
A data e hora atuais em UTC. Os formatos disponíveis são:
clfpara o formato comum de log ("10/Oct/2000:13:55:36 +0000")isopara o formato de data comum ISO 8601 (2000-10-10T13:55:36.000Z)webpara o formato comum de data RFC 1123 (Ter, 10 outubro de 2000 13:55:36 GMT)
Se nenhum formato é dado, então o padrão é web.
:http-versão
A versão HTTP da solicitação.
:method
O método HTTP do pedido.
:pid
O ID do processo do Node.js lidando com a solicitação.
:referrer
O cabeçalho do Referrer da solicitação. Isto usará o cabeçalho Referer de ortografia incorreta se existir, caso contrário será Referente.
:remote-addr
O endereço remoto da solicitação. Isto usará o valor req.ip, caso contrário o valor padrão req.connection.remoteAddress (endereço socket).
:remote-usuário
O usuário autenticado como parte da autenticação básica para a solicitação.
:req[header]
O cabeçalho dado da solicitação. Se o cabeçalho não estiver presente, o valor
será exibido como "-" no log.
:res[header]
O cabeçalho dado da resposta. Se o cabeçalho não estiver presente, o valor
será exibido como "-" no log.
:response-time[digits]
O tempo entre a solicitação chegando em morgan e quando os cabeçalhos
de resposta são escritos, em milissegundos.
O argumento dígitos é um número que especifica o número de dígitos a
incluir no número, por padrão até 3, que fornece precisão de microsegundos.
:status
O código de status da resposta.
Se o ciclo de solicitação/resposta completar antes de uma resposta ser enviada para o cliente
(por exemplo, o soquete TCP fechou prematuramente por um cliente abortando
o pedido), em seguida, o status estará vazio (exibido como "-" no log).
:total-tempo[digits]
O tempo entre o pedido chegando em morgan e quando a resposta
terminou de ser escrita para a conexão, em milissegundos.
O argumento dígitos é um número que especifica o número de dígitos a
incluir no número, por padrão até 3, que fornece precisão de microsegundos.
:url
A URL da solicitação. Isto usará req.originalUrl se existir, caso contrário req.url.
:user-agent
O conteúdo do cabeçalho User-Agent da solicitação.
morgan.compile(formato)
Compilar uma string de formato em uma função format para usar por morgan. Uma string de formato
é uma string que representa uma única linha de log e pode utilizar a sintaxe do token.
Tokens são referências por :token-name. If tokens accept arguments, they can
be passed using [], for example: :token-name[pretty] would pass the string
'pretty' as an argument to the token token-name.
A função retornada de morgan. ompile recebe três argumentos tokens, req, e
res, onde tokens é objeto com todos os tokens definidos, req é a solicitação HTTP e
res é a resposta HTTP. A função retornará uma string que será a linha de log,
ou undefined / null para pular o log.
Normally formats are defined using morgan.format(name, format), but for certain
advanced uses, this compile function is directly available.
Exemplos
expressão/conexão
Aplicativo de exemplo que registrará todos os pedidos no formato combinado do Apache para STDOUT
var express = require('express');var morgan = require('morgan');
var app = express();
app.use(morgan('combined'));
app.get('/', function (req, res) { res.send('hello, world!');});servidor http vanilla
Aplicativo de exemplo que registrará todos os pedidos no formato combinado do Apache para STDOUT
var finalhandler = require('finalhandler');var http = require('http');var morgan = require('morgan');
// create "middleware"var logger = morgan('combined');
http.createServer(function (req, res) { var done = finalhandler(req, res); logger(req, res, function (err) { if (err) return done(err);
// respond to request res.setHeader('content-type', 'text/plain'); res.end('hello, world!'); });});escrever logs em um arquivo
arquivo único
O aplicativo de exemplo que registrará todas as solicitações no formato combinado do Apache para o arquivo
access.log.
var express = require('express');var fs = require('fs');var morgan = require('morgan');var path = require('path');
var app = express();
// create a write stream (in append mode)var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' });
// setup the loggerapp.use(morgan('combined', { stream: accessLogStream }));
app.get('/', function (req, res) { res.send('hello, world!');});rotação do arquivo de log
Aplicativo de exemplo que registrará todas as solicitações no formato combinado do Apache em um arquivo
de log por dia no diretório log/ usando o
rotating-file-stream module.
var express = require('express');var morgan = require('morgan');var path = require('path');var rfs = require('rotating-file-stream'); // version 2.x
var app = express();
// create a rotating write streamvar accessLogStream = rfs.createStream('access.log', { interval: '1d', // rotate daily path: path.join(__dirname, 'log'),});
// setup the loggerapp.use(morgan('combined', { stream: accessLogStream }));
app.get('/', function (req, res) { res.send('hello, world!');});dividir / dual log
O middleware morgan pode ser usado quantas vezes for necessário, permitindo combinações
como:
- Registrar a entrada a pedido e uma na resposta
- Registrar todas as requisições em arquivo, mas erros no console
- … e mais!
Aplicativo de exemplo que registrará todas as solicitações em um arquivo usando o formato Apach, mas as respostas de erros são registradas no console:
var express = require('express');var fs = require('fs');var morgan = require('morgan');var path = require('path');
var app = express();
// log only 4xx and 5xx responses to consoleapp.use( morgan('dev', { skip: function (req, res) { return res.statusCode < 400; }, }));
// log all requests to access.logapp.use( morgan('common', { stream: fs.createWriteStream(path.join(__dirname, 'access.log'), { flags: 'a' }), }));
app.get('/', function (req, res) { res.send('hello, world!');});use formatos de token personalizados
Exemplo de aplicativo que usará formatos de token personalizados. Isso adiciona um ID a todos os pedidos e exibe usando o token :id.
var express = require('express');var morgan = require('morgan');var uuid = require('node-uuid');
morgan.token('id', function getId(req) { return req.id;});
var app = express();
app.use(assignId);app.use(morgan(':id :method :url :response-time'));
app.get('/', function (req, res) { res.send('hello, world!');});
function assignId(req, res, next) { req.id = uuid.v4(); next();}