comparando o nó Winston e Bunyan.js Logging

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

  • deve ser facilmente digerível pelos seres humanos, bem como pelas máquinas.
  • Permite múltiplos fluxos de destino configuráveis. Por exemplo, você pode estar escrevendo registros de rastreamento para um arquivo, mas quando um erro é encontrado, escrever para o mesmo arquivo, em seguida, em arquivo de erro e enviar um e-mail ao mesmo tempo.
  • 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:

    1. 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.

    Deixe uma resposta

    O seu endereço de email não será publicado.