Morgan은 Express의 기본 로깅 미들웨어입니다. 이번 글에서는 주로 Express의 기본 로깅 구성 요소인 Morgan의 방법을 소개하고 참고하겠습니다.
morgan은 Express의 기본 로깅 미들웨어이며 Express 없이 node.js 로깅 구성 요소로 독립적으로 사용할 수도 있습니다. 이 글은 얕은 것부터 시작하여 내용은 주로 다음과 같습니다.
모건 사용법 소개 예시
로그를 로컬 파일에 저장하는 방법
핵심 API 사용 지침 및 예시
고급 사용법: 1. 로그 분할 2. 데이터베이스에 로그 쓰기
소스 코드 분석: 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은 랜딩 로그 효과를 얻는 데 사용할 수 있는 스트림 구성 항목을 지원합니다. 코드는 다음과 같습니다. API가 거의 없습니다. 가장 자주 사용되는 API는 Express 로그 미들웨어를 반환하는 morgan()입니다.
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);
형식: 선택 사항입니다. 각 형식에는 결합, 단축 등과 같은 해당 이름이 있습니다. 기본값은 기본값입니다. . 다양한 형식 간의 차이점은 여기에서 확인할 수 있습니다. 다음은 로그 형식을 사용자 정의하는 방법을 설명합니다.
맞춤형 로그 형식
먼저 Morgan의 두 가지 개념인 형식과 토큰을 이해하세요. 매우 간단합니다.
format: 로그 형식. 기본적으로 :method :url :status :res[content-length] - :response-time ms와 같이 로그 형식을 나타내는 문자열입니다.
token: 위의 :method 및 :url과 같은 형식 구성 요소는 소위 토큰입니다.
morgan(format, options)
morgan.format(name, format); // 自定义日志格式 morgan.token(name, fn); // 自定义token
실행 결과를 살펴볼까요
Custom token
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);
프로그램을 실행하고 브라우저에서 http://127.0.0.1:3000/hello?from=app 및
http://127.0.0.1:3000/hello?from=pc를 차례로 방문하세요
[농담] GET /favicon.ico 304 -
고급 사용
로그 절단
모든 로그가 구현된 경우 온라인 애플리케이션 동일한 로컬 파일 시간이 지남에 따라 매우 커지므로 성능에 영향을 미치고 보기에도 불편합니다. 이때 로그 분할을 사용해야 합니다.
var express = require('express'); var app = express(); var morgan = require('morgan'); // 自定义token morgan.token('from', function(req, res){ return req.query.from || '-'; }); // 自定义format,其中包含自定义的token morgan.format('joke', '[joke] :method :url :status :from'); // 使用自定义的format app.use(morgan('joke')); app.use(function(req, res, next){ res.send('ok'); }); app.listen(3000);
데이터베이스에 로그 작성
때로는 데이터베이스에 액세스 로그를 작성해야 할 때가 있습니다. 이 요구 사항은 실시간 쿼리 통계가 필요한 로그 시스템에서 일반적입니다.
在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 }
上面是我整理给大家的,希望今后会对大家有帮助。
相关文章:
위 내용은 Express 기본 로그 구성 요소 Morgan의 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!