亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

express默認日志組件morgan的方法

2024-05-06 16:43:33
字體:
來源:轉載
供稿:網友

章節概覽

morgan是express默認的日志中間件,也可以脫離express,作為node.js的日志組件單獨使用。本文由淺入深,內容主要包括:

  1. morgan使用入門例子
  2. 如何將日志保存到本地文件
  3. 核心API使用說明及例子
  4. 進階使用:1、日志分割 2、將日志寫入數據庫
  5. 源碼剖析:morgan的日志格式以及預編譯

入門例子

首先,初始化項目。

npm install express morgan 

然后,在basic.js中添加如下代碼。

var express = require('express');var app = express();var morgan = require('morgan');app.use(morgan('short'));app.use(function(req, res, next){ res.send('ok');});app.listen(3000); 

node basic.js運行程序,并在瀏覽器里訪問 http://127.0.0.1:3000 ,打印日志如下

?  2016.12.11-advanced-morgan git:(master) ? node basic.js
::ffff:127.0.0.1 - GET / HTTP/1.1 304 - - 3.019 ms
::ffff:127.0.0.1 - GET /favicon.ico HTTP/1.1 200 2 - 0.984 ms

將日志打印到本地文件

morgan支持stream配置項,可以通過它來實現將日志落地的效果,代碼如下:

var express = require('express');var app = express();var morgan = require('morgan');var fs = require('fs');var path = require('path');var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), {flags: 'a'});app.use(morgan('short', {stream: accessLogStream}));app.use(function(req, res, next){ res.send('ok');});app.listen(3000); 

使用講解

核心API

morgan的API非常少,使用頻率最高的就是morgan(),作用是返回一個express日志中間件。

morgan(format, options) 

參數說明如下:

  1. format:可選,morgan與定義了幾種日志格式,每種格式都有對應的名稱,比如combined、short等,默認是default。不同格式的差別可參考這里。下文會講解下,如果自定義日志格式。
  2. options:可選,配置項,包含stream(常用)、skip、immediate。
  3. stream:日志的輸出流配置,默認是process.stdout。
  4. skip:是否跳過日志記錄,使用方式可以參考這里。
  5. immediate:布爾值,默認是false。當為true時,一收到請求,就記錄日志;如果為false,則在請求返回后,再記錄日志。

自定義日志格式

首先搞清楚morgan中的兩個概念:format 跟 token。非常簡單:

  1. format:日志格式,本質是代表日志格式的字符串,比如 :method :url :status :res[content-length] - :response-time ms。
  2. token:format的組成部分,比如上面的:method、:url即使所謂的token。

搞清楚format、token的區別后,就可以看下morgan中,關于自定義日志格式的關鍵API。

morgan.format(name, format); // 自定義日志格式morgan.token(name, fn); // 自定義token 

自定義format

非常簡單,首先通過morgan.format()定義名為joke的日志格式,然后通過morgan('joke')調用即可。

var express = require('express');var app = express();var morgan = require('morgan');morgan.format('joke', '[joke] :method :url :status');app.use(morgan('joke'));app.use(function(req, res, next){ res.send('ok');});app.listen(3000); 

我們來看下運行結果

?  2016.12.11-advanced-morgan git:(master) ? node morgan.format.js
[joke] GET / 304
[joke] GET /favicon.ico 200

自定義token

代碼如下,通過morgan.token()自定義token,然后將自定義的token,加入自定義的format中即可。

var express = require('express');var app = express();var morgan = require('morgan');// 自定義tokenmorgan.token('from', function(req, res){ return req.query.from || '-';});// 自定義format,其中包含自定義的tokenmorgan.format('joke', '[joke] :method :url :status :from');// 使用自定義的formatapp.use(morgan('joke'));app.use(function(req, res, next){ res.send('ok');});app.listen(3000); 

運行程序,并在瀏覽器里先后訪問 http://127.0.0.1:3000/hello?from=app 和 http://127.0.0.1:3000/hello?from=pc

?  2016.12.11-advanced-morgan git:(master) ? node morgan.token.js
[joke] GET /hello?from=app 200 app
[joke] GET /favicon.ico 304 -
[joke] GET /hello?from=pc 200 pc
[joke] GET /favicon.ico 304 -

高級使用

日志切割

一個線上應用,如果所有的日志都落地到同一個本地文件,時間久了,文件會變得非常大,既影響性能,又不便于查看。這時候,就需要用到日志分割了。

借助file-stream-rotator插件,可以輕松完成日志分割的工作。除了file-stream-rotator相關的配置代碼,其余跟之前的例子差不多,這里不贅述。

var FileStreamRotator = require('file-stream-rotator')var express = require('express')var fs = require('fs')var morgan = require('morgan')var path = require('path')var app = express()var logDirectory = path.join(__dirname, 'log')// ensure log directory existsfs.existsSync(logDirectory) || fs.mkdirSync(logDirectory)// create a rotating write streamvar accessLogStream = FileStreamRotator.getStream({ date_format: 'YYYYMMDD', filename: path.join(logDirectory, 'access-%DATE%.log'), frequency: 'daily', verbose: false})// setup the loggerapp.use(morgan('combined', {stream: accessLogStream}))app.get('/', function (req, res) { res.send('hello, world!')}) 

日志寫入數據庫

有的時候,我們會有這樣的需求,將訪問日志寫入數據庫。這種需求常見于需要實時查詢統計的日志系統。

在morgan里該如何實現呢?從文檔上,并沒有看到適合的擴展接口。于是查閱了下morgan的源碼,發現實現起來非常簡單。

回顧下之前日志寫入本地文件的例子,最關鍵的兩行代碼如下。通過stream指定日志的輸出流。

var accessLogStream = fs.createWriteStream(path.join(__dirname, 'access.log'), {flags: 'a'});app.use(morgan('short', {stream: accessLogStream})); 

在morgan內部,大致實現是這樣的(簡化后)。

// opt為配置文件var stream = opts.stream || process.stdout;var logString = createLogString(); // 偽代碼,根據format、token的定義,生成日志stream.write(logString); 

于是,可以用比較取巧的方式來實現目的:聲明一個帶write方法的對象,并作為stream配置傳入。

var express = require('express');var app = express();var morgan = require('morgan');// 帶write方法的對象var dbStream = { write: function(line){ saveToDatabase(line); // 偽代碼,保存到數據庫 }};// 將 dbStream 作為 stream 配置項的值app.use(morgan('short', {stream: dbStream}));app.use(function(req, res, next){ res.send('ok');});app.listen(3000); 

深入剖析

morgan的代碼非常簡潔,從設計上來說,morgan的生命周期包含:

token定義 --> 日志格式定義 -> 日志格式預編譯 --> 請求達到/返回 --> 寫日志

其中,token定義、日志格式定義前面已經講到,這里就只講下 日志格式預編譯 的細節。

跟模板引擎預編譯一樣,日志格式預編譯,也是為了提升性能。源碼如下,最關鍵的代碼就是compile(fmt)。

 function getFormatFunction (name) { // lookup format var fmt = morgan[name] || name || morgan.default // return compiled format return typeof fmt !== 'function' ? compile(fmt) : fmt} 

compile()方法的實現細節這里不贅述,著重看下compile(fmt)返回的內容:

var morgan = require('morgan');var format = morgan['tiny'];var fn = morgan.compile(format);console.log(fn.toString()); 

運行上面程序,輸出內容如下,其中tokens其實就是morgan。 

function anonymous(tokens, req, res/**/) { return "" + (tokens["method"](req, res, undefined) || "-") + " " + (tokens["url"](req, res, undefined) || "-") + " " + (tokens["status"](req, res, undefined) || "-") + " " + (tokens["res"](req, res, "content-length") || "-") + " - " + (tokens["response-time"](req, res, undefined) || "-") + " ms";} 

看下morgan.token()的定義,就很清晰了

function token (name, fn) { morgan[name] = fn return this}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品www在线观看| 亚洲天堂日韩电影| 国产精品久久久久秋霞鲁丝| 亚洲欧美中文日韩v在线观看| 最近中文字幕2019免费| 国内精品400部情侣激情| 亚洲情综合五月天| 成人在线小视频| 国产欧美精品一区二区| 亚洲精品网址在线观看| 欧美性猛交xxxx黑人猛交| 国产噜噜噜噜久久久久久久久| 国产精品∨欧美精品v日韩精品| 亚洲精品自拍第一页| 精品福利视频导航| 亚洲第一福利网站| 国产精品国产自产拍高清av水多| 欧美性猛交xxxx富婆| 日韩在线观看成人| 91视频8mav| 国产精品久久久久久久av大片| 国产精品视频在线播放| 狠狠躁夜夜躁久久躁别揉| 国产亚洲人成a一在线v站| 亚洲精品女av网站| 国产成人免费av电影| 中文字幕亚洲综合久久| 久久久亚洲国产天美传媒修理工| 日韩不卡在线观看| 成人黄色免费网站在线观看| 日本亚洲欧美成人| 久久精品91久久香蕉加勒比| 久久视频免费在线播放| 国产98色在线| 日韩精品在线影院| 亚洲黄色在线看| 中文字幕日韩电影| 色悠悠久久88| 日韩欧美极品在线观看| 亚洲级视频在线观看免费1级| 黑人与娇小精品av专区| 日本久久亚洲电影| 亚洲国产精品高清久久久| 亚洲成人av中文字幕| 欧美午夜精品久久久久久人妖| 按摩亚洲人久久| 国产精品视频网址| 国产精品男女猛烈高潮激情| 三级精品视频久久久久| 国产一区二区日韩| 欧美电影在线观看网站| 欧美成人高清视频| www.欧美精品一二三区| 欧美综合国产精品久久丁香| 亚洲影视中文字幕| 麻豆精品精华液| 精品香蕉在线观看视频一| 久久久人成影片一区二区三区观看| 久久久久久久久久久av| 日韩av第一页| 国产乱肥老妇国产一区二| 在线亚洲欧美视频| 精品久久久久久久久久久久久久| 欧美性猛交xxxxx免费看| 久久人人看视频| 黄网站色欧美视频| 日本国产高清不卡| 尤物九九久久国产精品的分类| 大桥未久av一区二区三区| 国产精品入口日韩视频大尺度| 国产99视频在线观看| 成人性生交大片免费看视频直播| 久久成人国产精品| 日韩亚洲欧美中文高清在线| 欧美性猛交xxxx富婆| 欧美视频在线免费看| 精品一区精品二区| 国产在线精品成人一区二区三区| 久久91精品国产91久久久| 欧美中文字幕在线观看| 欧美极品第一页| 亚洲va欧美va国产综合剧情| 国产精品va在线播放我和闺蜜| 欧美成人精品一区| 欧美做受高潮1| 国产精品美女999| 亚洲图片在区色| 欧美中文在线免费| 欧美第一黄网免费网站| 国产成人午夜视频网址| 曰本色欧美视频在线| 美日韩丰满少妇在线观看| 欧美性猛交xxxx乱大交| 欧美成人手机在线| 亚洲精品久久7777777| 久久久免费精品| 精品高清美女精品国产区| 亚洲女成人图区| 中文字幕亚洲欧美日韩2019| 中文字幕视频一区二区在线有码| 亚洲国产精品嫩草影院久久| 久久亚洲国产成人| 国产亚洲视频中文字幕视频| 日韩一区二区三区国产| 欧美亚洲视频在线观看| 欧美日韩一区二区免费在线观看| 欧美极品在线播放| 亚洲成人在线网| 宅男66日本亚洲欧美视频| 亚洲999一在线观看www| 国产成人aa精品一区在线播放| 中文字幕日韩av| 国产91久久婷婷一区二区| 日韩精品视频在线免费观看| 91国内精品久久| 日韩欧美在线网址| 欧美日韩精品在线| 日韩最新中文字幕电影免费看| 国产精品福利观看| 中文字幕不卡在线视频极品| 日韩电影中文字幕在线观看| 欧美日韩加勒比精品一区| 久久久视频免费观看| 亚洲欧美中文另类| 日韩美女免费视频| 国产91免费观看| 精品电影在线观看| 亚洲日本中文字幕免费在线不卡| 伊人久久免费视频| 久久久精品一区二区| 日韩视频―中文字幕| 国产精品免费福利| 国产精品高清在线| 精品国产电影一区| 久久国产精品久久久| 欧美日本高清一区| 欧美大奶子在线| 美女999久久久精品视频| 国产美女精品免费电影| 91精品国产综合久久香蕉的用户体验| 免费91在线视频| 国产亚洲在线播放| 亚洲欧美激情精品一区二区| 亚洲国产精品久久久久| 国产成人精品电影久久久| 色噜噜久久综合伊人一本| 亚洲一区中文字幕| 精品毛片网大全| 久久影视电视剧免费网站| 国产精品678| 久久久久久91香蕉国产| 国产日产久久高清欧美一区| 久久中文字幕国产| 久热爱精品视频线路一| 97在线观看视频| 亚洲视频在线免费观看| 欧美日韩国产色| 亚洲精品电影网在线观看| 国产精品91在线观看| 91精品国产91久久久久久不卡| 亚洲大尺度美女在线| 精品日韩视频在线观看| 在线视频精品一| 日韩电视剧在线观看免费网站|