【node】morgan日志模块

来源:互联网 发布:客户搜寻软件 编辑:程序博客网 时间:2024/06/05 20:36

moragan

使用express框架时,在控制台可以看到有日志输出,日志内容包括请求方法、请求状态、远程地址、请求时间等信息。这块的信息是由express默认日志模块morgan实现的。


版本

1.8.1


API

morgan(format, options)

参数format可以指定日志的格式,可以是一个预先定义的格式名称,或者是一个格式化的字符串。也可以是个提供格式化入口的回调方法,这个回调方法带有三个参数tokens、req、res。
参数options配置日志的行为,比如日志执行的时间、过滤条件、流操作等


format——预定义的日志格式

combined标准Apache组合日志输出:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length] ":referrer" ":user-agent"
common标准Apache公共日志输出:remote-addr - :remote-user [:date[clf]] ":method :url HTTP/:http-version" :status :res[content-length]
dev状态码带有色彩的日志输出:method :url :status :response-time ms - :res[content-length]
short比默认还要短的日志输出,包括响应时间:remote-addr :remote-user :method :url HTTP/:http-version :status :res[content-length] - :response-time ms
tiny迷你输出:method :url :status :res[content-length] - :response-time ms

format——自定义日志格式morgan.token(name,cb)

morgan提供了token接口,用户可以自定义日志格式。它有两个参数,第一个参数为格式名称,第二个参数是一个回调函数cb(tokens,req,res)

morgan.token(name,cb)
morgan.token('type', function (req, res) { return req.headers['content-type'] })

format——回调函数cb(tokens,req,res)

let cb = (tokens,req,res) => {    return [        tokens.method(req, res),        //请求方法        tokens.url(req, res),           //请求链接        tokens.status(req, res),        //请求状态        tokens.date(req,res,'web'),     //时间有三种格式,clf、iso、web,默认是clf        tokens['remote-addr'](req,res), //远程地址        tokens['remote-user'](req,res), //远程用户        tokens['http-version'](req,res),    //http版本        tokens.res(req, res, 'content-length'), '-',    //请求长度        tokens['response-time'](req, res), 'ms',        //响应时间        tokens['user-agent'](req,res),      //浏览器信息    ].join(' ')}

options

在options中配置日志的执行时间、过滤、输出流

let options = {    immediate:true,     skip:function(req,res){        return { return res.statusCode < 400 }  //only log error responses    },    stream:process.stdout   //默认是控制台输出}

immediate

在请求到达时打印日志,而不是请求响应完成时。这意味着即使服务器崩溃,日志也会打印,但是响应的数据无法被打印

skip

默认值是false。它决定哪些日志会被忽略。

stream

输出流,默认是process.stdout,即控制台输出。


Demo

一些简单的demo演示morgan的使用

vanilla http server

一个简单的App,它将打印所有的请求到控制台

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!')  })})

将日志写入文件

简单文件

将日志写入一个名为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!')})

log file rotation

Simple app that will log all requests in the Apache combined format to one log
file per day in the log/ directory using the
rotating-file-stream module.

var express = require('express')var fs = require('fs')var morgan = require('morgan')var path = require('path')var rfs = require('rotating-file-stream')var app = express()var logDirectory = path.join(__dirname, 'log')// ensure log directory existsfs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)// create a rotating write streamvar accessLogStream = rfs('access.log', {  interval: '1d', // rotate daily  path: logDirectory})// setup the loggerapp.use(morgan('combined', {stream: accessLogStream}))app.get('/', function (req, res) {  res.send('hello, world!')})

自定义一种日志格式

Sample app that will use custom token formats. This adds an ID to all requests and displays it using the :id token.

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()}