Lets talk about logging, shall we? Arnold aqui carregando um tronco gigante parece uma introdução apropriada a este artigo em que vamos falar sobre nó popular.quadros de Registo js.
Se você está escrevendo qualquer tipo de Aplicação long living, o registro detalhado é fundamental para detectar problemas e depuração. Sem logs você teria poucas maneiras de dizer como é o seu aplicativo se comportando, existem erros, como é o desempenho, está fazendo qualquer coisa ou está apenas caindo sobre todos os outros pedidos quando você não está olhando para ele.
requisitos
permite identificar alguns requisitos que podemos usar para colocar os frameworks uns contra os outros. Alguns destes requisitos são bastante triviais, outros não são tanto.cada linha de Registo. Este é muito auto explicativo-você deve ser capaz de dizer quando cada entrada de log ocorreu.o formato de Registo
baseado nestes requisitos (e popularidade) existem dois frameworks de registro para nó.js worth check out, in particular:
- Bunyan by Trent Mick.Winston faz parte do framework Flatiron e é patrocinado por nodejitstu.
console
Antes de chegarmos a Bunyan e Winston, vamos olhar para o nosso velho amigo console
. O tipo mais rudimentar de registo que pode fazer é usar métodos console.log
e console.error
. Isto é melhor do que nada, mas dificilmente a melhor solução. Console escreve para STDOUT e STDERR, respectivamente. Há uma advertência muito interessante para saber quando se trata de console
métodos no nó.js.
As funções do console são síncronas, quando o destino é um terminal ou um arquivo (para evitar perdas de mensagens caso de saída prematura) e assíncrona quando é um cachimbo (para evitar o bloqueio por longos períodos de tempo).
isto é, no exemplo a seguir, stdout é não-bloqueio enquanto stderr está bloqueando o:
$ node script.js 2> error.log | tee info.log
Este é basicamente um “rolo de seu próprio” registo de abordagem. É totalmente manual, você tem que criar o seu próprio formato e basicamente gerenciar tudo você mesmo. Isto é demorado, propenso a erros e você provavelmente quer se concentrar em suas características de aplicação em vez disso. Considerando que existem bibliotecas de registro de código aberto que são ativamente mantidas, isso não vale o esforço se você está tentando se concentrar em fornecer recursos.
Winston
um dos nó mais populares.js logging frameworks é Winston. É projetado para ser uma biblioteca de registro simples e universal com suporte para vários transportes (um transporte no mundo de Winston é essencialmente um dispositivo de armazenamento, por exemplo, onde seus logs acabam sendo armazenados). Cada instância de um logger Winston pode ter vários transportes configurados em diferentes níveis de registro.
Instalação
npm install winston
de Uso
O mais básico Winston uso consiste de chamar a instância padrão que é exportado a partir de winston
módulo.
var winston = require('winston');winston.log('info', 'Hello distributed log files!');winston.info('Hello again distributed logs');
O acima é o mesmo que:
Ambos os exemplos irá produzir a seguinte saída:
info: Hello distributed log files!info: Hello again distributed logs
Formatação
Pessoalmente, eu sou um pouco intrigado com a falta de detalhes no padrão formatador. Não há data, nome da máquina ou ID do processo e o formato de saída é ligeiramente adequado para processamento de máquina. Dito isto, você pode obter toda a informação para fora com apenas um pouco de trabalho extra.
winston.info('Hello world!', {timestamp: Date.now(), pid: process.pid});
produz a seguinte saída, que é mais informativa, mas ainda não é muito adequada para a análise da máquina.
info: Hello world! timestamp=1402286804314, pid=80481
Finalmente, o log
método fornece a mesma seqüência de métodos de interpolação util.format
, por exemplo:
winston.log('info', 'test message %d', 123);
Transportadores
Winston pode ser configurado através do construtor de opções ou expostos método, que são muito bem documentados na página do GitHub. A maior parte da configuração normalmente gira em torno de vários transportes. Fora da caixa Winston vem com console e transportes baseados em arquivos e se você tem uma olhada em npmjs.org você verá que existem módulos comunitários para praticamente tudo o que se possa imaginar, desde MongoDB até plataformas comerciais de terceiros.um dos transportadores mais notáveis na minha opinião é winston-irc de Nathan Zadoks, que você pode usar para registar erros no canal de IRC da sua equipa. Estou a ver que isto dá muito jeito.
winston.add(require('winston-irc'), { host: 'irc.somewhere.net', nick: 'logger', pass: 'hunter2', channels: { '#logs': true, 'sysadmin': }});
Vários Madeireiros
uma Vez que sua aplicação começa a crescer, as chances são que você vai querer ter vários madeireiros com configurações diferentes, onde cada registrador é responsável por uma característica diferente da área (ou categoria). Winston suporta isso de duas maneiras: através de winston.loggers
e instâncias de winston.Container
. Na verdade, é apenas uma instância predefinida de :
winston.loggers.add('category1', {console: { ... }, file: { ... }});winston.loggers.add('category2', {irc: { ... }, file: { ... }});
Agora que os madeireiros estão configurados, você pode exigir Winston em qualquer arquivo em seu aplicativo e acessar esses pré-configurado madeireiros:
var category1 = winston.loggers.get('category1');category1.info('logging from your IoC container-based logger');
Mais
Este é mais básico Winston uso, mas há algumas outras características, nomeadamente:interpolação de cordas por interpolação de cordas por sondagem e streaming por manipulação de exepções por Brendan Corris por Trent Mick é outro quadro de registo que penso que deve ser considerado. Bunyan tem uma abordagem ligeiramente diferente do que Winston fazer sua missão de fornecer logs estruturados e legíveis como cidadãos de primeira classe. Como resultado, um registro de log de Bunyan é uma linha de JSON.stringify
saída com alguns nomes comuns para a necessária e comum campos de um registro de log.
Instalação
npm install bunyan
de Uso
var bunyan = require('bunyan');var log = bunyan.createLogger({name: 'myapp'});log.info('hi');log.warn({lang: 'fr'}, 'au revoir');
o Que irá produzir o seguinte resultado:
Como você pode ver, fora da caixa Bunyan não é muito amiga do ser humano, no entanto a maioria dos modernos sistemas de registro entender o formato JSON de forma nativa, o que significa que há pouco a fazer aqui para alimentar os logs em outro lugar para o armazenamento e processamento. Por padrão, há um pouco de meta-dados incluídos em cada mensagem, tais como data, ID do Processo, Nome da máquina e nome da aplicação.
naturalmente, nós humanos, não achamos isto muito digerível e para abordar que há uma ferramenta bunyan
CLI tool to which takes in JSON via STDIN. Veja o mesmo exemplo canalizada através de bunyan
:
node example.js | bunyan
Produz a seguinte saída:
INFO: myapp/13372 on pwony-2: hi WARN: myapp/13372 on pwony-2: au revoir (lang=fr)
A principal vantagem aqui é que você não precisa reconfigurar nada para ambiente de desenvolvimento, tudo que você tem a fazer é canalizar para bunyan
. Assinale a página do GitHub para obter mais documentação sobre a ferramenta de ‘CLI’.
JSON
Uma das principais diferenças entre Bunyan e Winston é que Bunyan funciona muito bem quando você deseja fazer contextos complexos e objetos. Vamos olhar para esta linha e sua saída do exemplo acima:
Você pode ver que {lang: 'fr'}
tem mesclado com o principal objecto de registo e au revoir
tornou-se msg
. Agora imagine algo como:
log.info(user, 'registered');log.info({user: user}, 'registered');
Que produz:
Ou quando canalizada através de bunyan
:
A beleza desta abordagem, ficará claro quando olhamos para criança madeireiros.
lenhadores de crianças
Bunyan tem um conceito de lenhadores de crianças, que permite especializar um lenhador para um sub-componente de sua aplicação, i.e. para criar um novo logger com campos de ligação adicionais que serão incluídos em seus registros de log. Um registrador de crianças é criado comlog.child(...)
. Isto é muito útil se você quiser ter scoped loggers para diferentes componentes em seu sistema, pedidos, ou apenas simples chamadas de função. Vamos ver um código.
Imagine que deseja carregar o ID DO pedido através de todas as linhas de registo de um dado pedido para que possa amarrá-las todas juntas.
req.log
registrador de sempre manter seu contexto passado para o log.child()
função e mesclá-lo com todas as chamadas subsequentes, de modo que a saída seria algo parecido com isto:
{"name":"myapp","hostname":"pwony-2","pid":14837,"level":30,"reqId":"XXXX-XX-XXXX","user":"[email protected]","time":"2014-05-26T18:27:43.530Z","v":0}
Serializadores
Dois problemas surgem quando Bunyan tenta stringify toda a objetos:
- referências Circulares. Winston é um pouco mais inteligente aqui e detecta referências circulares quando ocorrem (no entanto a saída do resultado
$ref=$
não é muito útil).ruído indesejado. Parece-me que, como os objectos são de primeira classe, é muito mais fácil começar a ter o hábito de deitar tudo para o tronco.
Para ajudar a lidar com ambos, Bunyan tem um conceito de serializador, que são, basicamente, as funções de transformação que permitem que você alcance para baixo comumente passado objetos apenas os campos que você está interessado em:
Agora a tentar iniciar sessão req
objeto seria apenas incluir os três campos que estamos interessados.
fluxos
fluxos em Bunyan são a mesma coisa que os transportadores em Winston – é uma maneira de enviar seus logs para outros lugares para exibição e armazenamento. Bunyan usa uma interface de Stream com alguns atributos adicionais. Um Bunyan logger exemplo, tem um ou mais fluxos e são especificados com o streams
opção:
var log = bunyan.createLogger({ name: "foo", streams: });
Mais
Aqui estão alguns mais notáveis coisas para explorar, em Bunyan:
- log de tempo de execução rastreamento via Dtrace de suporte
- registro de Log de campos
o Que escolher?
Winston e Bunyan são ambos muito maduros e estabelecidos quadros de registro e são muito em par em termos de características. Winston tem um monte de apoio comunitário com vários módulos de registro. Bunyan faz com que seja fácil analisar logs, mas deixa o consumo para o usuário (geralmente syslog drain funciona muito bem aqui). Eu sinto que tudo se resume à preferência e como é fácil de integrar com a sua pilha.
- O que está para vir para o próximo lançamento do nó? Leia cerca de oito novas características excitantes V0.12 e como tirar o máximo partido deles, a partir dos próprios autores.
- pronto para desenvolver APIs no nó.js e ligá-los aos seus dados? Vê o nódulo.js LoopBack API framework. Nós tornamos fácil começar localmente ou na sua nuvem favorita, com uma instalação npm simples.precisa de formação e certificação para o nó? Saiba mais sobre as opções privadas e abertas que o StrongLoop oferece.