您的位置:首页 > Web前端 > Node.js

【node】morgan日志模块

2017-10-21 15:17 483 查看

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 logger
app.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 exists
fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)

// create a rotating write stream
var accessLogStream = rfs('access.log', {
interval: '1d', // rotate daily
path: logDirectory
})

// setup the logger
app.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()
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  express 日志 morgan