nodejs 日志模块winston的使用方法

winston 日志模块

在使用 nodejs winston 模块中,加上相关的两个模块,事倍功半。

  1. express-winston
  2. winston-daily-rotate-file

express-winston

是 express-winston 的 winston 的增加版, 是作为 express 的中间件来打印日志,不仅有请求头信息,并且有响应时间。
作为中间件, 为什么会有响应时间呢? 因为 express-winston 改写了 express 的 res.end 办法, 是请求结束后再打的日志。

代码片段

var end = res.end;
res.end = function(chunk, encoding) {
  res.responseTime = (new Date) - req._startTime;
  res.end = end;
  res.end(chunk, encoding);
  ...
  }

express-winston 没有修改或者扩展 winston 的transport, 而 winston-daily-rotate-file 正是增强了 winston 的transport 办法

winston-daily-rotate-file

winston-daily-rotate-file 是 winston 扩展, 增加了 transport 的办法,使 winston 有滚动日志的能力。

结合使用

我们来一个需求: 如何让 express-winston 打印日志的时候,也打印出接口 /api 的请求参数和响应数据?

  1. 该日志中间件应该在调用链 api 后面, api/* 业务处理之前。 like: app.use('/api', apiRequestLogger, apiHandler)
  2. 要获取到响应数据, 就要在业务处理完后 send 出来后才能捕获到,express 所有的请求响应最后都是走 res.send 我们可以从这里入手捕获响应数据

代码如下

import winston from 'winston'
import expressWinston from 'express-winston'
import 'winston-daily-rotate-file'
import path from 'path'

export let DailyRotateFileTransport = (fileName) => {
 return new (winston.transports.DailyRotateFile)({
  filename: path.join(process.env.LOGPATH, `${fileName}-%DATE%.log`),
  datePattern: 'YYYY-MM-DD-HH',
  // maxSize: '20m',
  maxFiles: '7d',
  timestamp: () => new Date().format('yyyy-MM-dd hh:mm:ss.S')
 })
}

export let pageRequestLogger = expressWinston.logger({
 transports: [
  DailyRotateFileTransport('page-request')
 ],
 meta: true, // optional: control whether you want to log the meta data about the request (default to true)
 msg: 'HTTP {{req.method}} {{req.url}}', // optional: customize the default logging message. E.g. "{{res.statusCode}} {{req.method}} {{res.responseTime}}ms {{req.url}}"
 expressFormat: true, // Use the default Express/morgan request formatting. Enabling this will override any msg if true. Will only output colors with colorize set to true
 colorize: false, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
 ignoreRoute: function (req, res) {
  // 只打印页面请求信息
  let notPageRequest = false
  let ignoreArr = ['/api', '.js', '.css', '.png', '.jpg', '.gif']
  ignoreArr.forEach(item => {
   if (req.url.indexOf(item) > -1) notPageRequest = true
  })
  return notPageRequest
 } // optional: allows to skip some log messages based on request and/or response
})

export let apiRequestLogger = (req, res, next) => {
 let send = res.send
 let content = ''
 let query = req.query || {}
 let body = req.body || {}
 res.send = function () {
  content = arguments[0]
  send.apply(res, arguments)
 }
 expressWinston.logger({
  transports: [
   DailyRotateFileTransport('api-request')
  ],
  meta: true, // optional: control whether you want to log the meta data about the request (default to true)
  msg () {
   return `HTTP ${req.method} ${req.url} query ${JSON.stringify(query)} body ${JSON.stringify(body)} resData ${content} `
  },
  colorize: true, // Color the text and status code, using the Express/morgan color palette (text: gray, status: default green, 3XX cyan, 4XX yellow, 5XX red).
  ignoreRoute: function (req, res) {
   if (req.headers.self) return true
   return false
  } // optional: allows to skip some log messages based on request and/or response
 })(req, res, next)
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

您可能感兴趣的文章:

  • Node.js利用console输出日志文件的方法示例
  • Node.js利用debug模块打印出调试日志的方法
  • Node.js 日志处理模块log4js
  • Node.js与Sails ~项目结构与Mvc实现及日志机制
  • Node.js和MongoDB实现简单日志分析系统
  • Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)
(0)

相关推荐

  • Node.js中使用Log.io在浏览器中实时监控日志(等同tail -f命令)

    今天,抽空了浏览了下node.js ,哈哈,看了一篇入门的文章(http://www.nodebeginner.org/index-zh-cn.html),自我感觉是入门了,不过里面一句话,挺有感悟: 复制代码 代码如下: 不过,这些毕竟都是前端技术,尽管当想要增强页面的时候,使用jQuery总让你觉得很爽,但到最后,你顶多是个JavaScript用户,而非JavaScript开发者.然后,出现了Node.js,服务端的JavaScript,这有多酷啊?于是,你觉得是时候该重新拾起既熟悉又陌生的

  • Node.js与Sails ~项目结构与Mvc实现及日志机制

    本文首先从sails的安装讲起接下来介绍node.js与Sails的日志机制,小伙伴们已经迫不及待要看下文了吧,好吧. Sails是一个Node.js的中间件架构,帮助我们很方便的构建WEB应用程序,网址:http://www.sailsjs.org/,它主要是在Express框架的基础上发展起来的,扩展了新的功能组件,下面我们来看一下安装方法 一 安装Sails npm -g install sails 二 建立一个Sails的项目 sails new testProject 三 启动项目 c

  • Node.js利用debug模块打印出调试日志的方法

    前言 大家都知道在node程序开发中时,经常需要打印调试日志.用的比较多的是debug模块,比如express框架中就用到了.下文简单举几个例子进行说明.文中相关代码示例,可在这里找到. 备注:node在0.11.3版本也加入了util.debuglog()用于打印调试日志,使用方法跟debug模块大同小异. 基础例子 首先,安装debug模块. npm install debug 使用很简单,运行node程序时,加上DEBUG=app环境变量即可. /** * debug基础例子 */ var

  • Node.js和MongoDB实现简单日志分析系统

    在最近的项目中,为了便于分析把项目的日志都存成了JSON格式.之前日志直接存在了文件中,而MongoDB适时闯入了我的视线,于是就把log存进了MongoDB中.log只存起来是没有意义的,最关键的是要从日志中发现业务的趋势.系统的性能漏洞等.之前有一个用Java写的分析模块,运行在Tomcat下.实现相当的重量级,添加一个新指标的流程也比较繁琐,而且由于NFS的原因还导致分析失败.一直想改写,最初想用Ruby On Rails,可是一直没有时间学习和开发(在找借口啊!).在杭州QCon 201

  • Node.js 日志处理模块log4js

    log4js 是 Node.js 日志处理中的数一数二的模块.比起 console 或者 TJ 的 debug 有其优势,尤其针对投入生产的 Node.js 项目来说下面这些是不可少的: 日志分级 日志分类 日志落盘 本文将会给你一个 log4js 的全面介绍,让你可以在项目中驾轻就熟的使用 log4js,开发调试容易,线上更好地监控或排查问题. 牛刀小试 下面这三行代码为你展示了 log4js 最简单的用法: // file: simplest.js var log4js = require(

  • Node.js利用console输出日志文件的方法示例

    通常我们在写Node.js程序时,都习惯使用console.log打印日志信息,但这也仅限于控制台输出,有时候我们需要将信息输出到日志文件中,实际上利用console也可以达到这个目的的,今天就来简单介绍一下. 我们首先创建如下文件: // index.js let fs = require('fs'); let options = { flags: 'a', // append模式 encoding: 'utf8', // utf8编码 }; let stdout = fs.createWri

  • nodejs 日志模块winston的使用方法

    winston 日志模块 在使用 nodejs winston 模块中,加上相关的两个模块,事倍功半. express-winston winston-daily-rotate-file express-winston 是 express-winston 的 winston 的增加版, 是作为 express 的中间件来打印日志,不仅有请求头信息,并且有响应时间. 作为中间件, 为什么会有响应时间呢? 因为 express-winston 改写了 express 的 res.end 办法, 是请

  • Python日志模块logging的使用方法总结

    目录 导语 关于开发日志 关于logging基础使用 关于logging进阶使用 记录器 处理器 格式器 配置记录 实战 生成记录器 请求处理装饰器 总结 导语 日常开发中,定位程序异常,追溯事件发生场景都需要通过日志记录的方式.可以说一个好的开发日志设计可以让开发人员在后续项目维护的过程中节省时间成本,提升解决问题的效率. 目前在网上已经有许多关于Python日志操作的文章,部分文章总结的非常到位,Python官方也有日志常用的手册.自己写这篇文章是主要围绕Python官方的logging模块

  • python标准日志模块logging的使用方法

    最近写一个爬虫系统,需要用到python的日志记录模块,于是便学习了一下.python的标准库里的日志系统从Python2.3开始支持.只要import logging这个模块即可使用.如果你想开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件,只要这样使用: 复制代码 代码如下: import logging# 创建一个loggerlogger = logging.getLogger('mylogger')logger.setLevel(logging.DEBUG)# 创建一个ha

  • Python实现从log日志中提取ip的方法【正则提取】

    本文实例讲述了Python实现从log日志中提取ip的方法.分享给大家供大家参考,具体如下: log日志内容如下(myjob.log): 124.90.53.68 - - [05/Feb/2018 11:37:07] "GET /favicon.ico HTTP/1.1" 404 - 61.148.245.145 - - [05/Feb/2018 12:37:44] "GET / HTTP/1.1" 200 - 61.148.245.145 - - [05/Feb/

  • 使用koa-log4管理nodeJs日志笔记的使用方法

    前言 对于后端程序应用来说,日志是必不可少的,在nodeJs当中并没有自带的日志模块.最近正好使用koa框架来做后端服务,需要对日志进行分割处理,特记录下分享给大家. 一.后端代码目录结构 ├── back-end │ ├── logs 所有产生的日志文件存放在此目录下 │ ├── db.js 使用Sequelize连接数据库 │ ├── logger.js 日志的配置 │ ├── server.js 后端提供的所有接口 二.引用日志模块 log4js-node是一款比较好的在node环境下对于

  • python日志模块logbook使用方法

    python自带了日志模块logging,可以用来记录程序运行过程中的日志信息.同时python还有logbook模块用来取代logging模块,在很多的项目中logbook模块使用也是比较的多,因此本文介绍一下python logbook模块的使用方法. 1,安装 pip install logbook 官方的使用文档,这里 2,使用方法如下: 文件 logconf.py 初始化日志以及设置日志格式等参数: import sys import os import logbook import

  • 详解Python中的日志模块logging

    许多应用程序中都会有日志模块,用于记录系统在运行过程中的一些关键信息,以便于对系统的运行状况进行跟踪.在.NET平台中,有非常著名的第三方开源日志组件log4net,c++中,有人们熟悉的log4cpp,而在python中,我们不需要第三方的日志组件,因为它已经为我们提供了简单易用.且功能强大的日志模块:logging.logging模块支持将日志信息保存到不同的目标域中,如:保存到日志文件中:以邮件的形式发送日志信息:以http get或post的方式提交日志到web服务器:以windows事

  • python logging日志模块的详解

    python logging日志模块的详解 日志级别 日志一共分成5个等级,从低到高分别是:DEBUG INFO WARNING ERROR CRITICAL. DEBUG:详细的信息,通常只出现在诊断问题上 INFO:确认一切按预期运行 WARNING:一个迹象表明,一些意想不到的事情发生了,或表明一些问题在不久的将来(例如.磁盘空间低").这个软件还能按预期工作. ERROR:更严重的问题,软件没能执行一些功能 CRITICAL:一个严重的错误,这表明程序本身可能无法继续运行 这5个等级,也

  • nodejs中模块定义实例详解

    本文实例讲述了nodejs中模块定义方法.分享给大家供大家参考,具体如下: 1.模块定义 nodejs所谓的模块就是一个文件!一个.js文件就是一个nodejs的模块,模块与文件是一一对应的,那么引用模块就是require('文件路径'). 如: var circle = require('./circle.js'); console.log( 'The area of a circle of radius 4 is ' + circle.area(4)); 这个取名为foo.js var PI

  • 在windows上用nodejs搭建静态文件服务器的简单方法

    在windows上用nodejs搭建一个静态文件服务器,即使你一点基础没有也能学会nodejs静态文件服务器的搭建,本文介绍的非常详细,很适合零基础入门的朋友学习. 首先安装nodejs: •新建一个node文件夹 •下载node.exe到该文件夹 •下载npm然后解压到该文件夹 •现在node文件夹是这样的 •把该目录加入到path环境变量 •在命令行执行 node -v npm -v 如果得到了版本号则表示nodejs安装完成 •在命令行中执行 npm config set registry

随机推荐