이번에는 로그 컴포넌트 모건 사용에 대한 자세한 설명을 가져왔습니다. 로그 컴포넌트 모건 사용 시 주의사항은 무엇인가요?
morgan은 express의 기본 로깅 미들웨어입니다. 이 글에서는 주로 express의 기본 로깅 구성 요소인 Morgan의 방법을 소개합니다. 이제 이를 여러분과 공유하고 참고용으로 제공하겠습니다. 편집기를 따라가서 살펴보겠습니다
Morgan은 Express의 기본 로깅 미들웨어이며 node.js 로깅 구성 요소로 Express와 독립적으로 사용할 수도 있습니다. 이 글은 얕은 것부터 시작하여 내용은 주로 다음과 같습니다.
모건 사용법 소개 예시
로그를 로컬 파일에 저장하는 방법
핵심 API 사용 지침 및 예시
고급 사용법: 1. 로그 분할 2. 로그를 database
에 기록합니다. 소스 코드 분석: 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은 랜딩 로그 효과를 얻는 데 사용할 수 있는 스트림 구성 항목을 지원합니다. 코드는 다음과 같습니다.
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);
Core API
Morgan은 가장 자주 사용되는 API가 거의 없습니다. Morgan()입니다. 해당 기능은 Express 로그 미들웨어를 반환합니다.
morgan(format, options)
매개변수 설명은 다음과 같습니다:
형식: 선택 사항입니다. Morgan은 여러 로그 형식을 정의했습니다. 각 형식에는 결합, 단축 등과 같은 해당 이름이 있습니다. 기본값은 기본값입니다. 다양한 형식 간의 차이점은 여기에서 확인할 수 있습니다. 다음은 로그 형식을 사용자 정의하는 방법을 설명합니다.
옵션: 스트림(일반적으로 사용됨), 건너뛰기, 즉시를 포함한 선택 사항, 구성 항목입니다.
stream: 로그 출력 스트림 구성, 기본값은 process.stdout입니다.
skip: 로깅 건너뛰기 여부, 사용 방법은 여기에서 확인할 수 있습니다.
immediate: 부울 값, 기본값은 false입니다. true인 경우 요청이 수신되는 즉시 로그가 기록되고, false인 경우 요청이 반환된 후에 로그가 기록됩니다.
사용자 정의 로그 형식
먼저 Morgan의 두 가지 개념인 형식과 토큰을 이해하세요. 매우 간단합니다.
format: 로그 형식. 기본적으로 로그 형식을 나타내는 문자열입니다(예: :method :url :status :res[content-length] - :response-time ms).
token: 위의 :method 및 :url과 같은 형식 구성 요소는 소위 토큰입니다.
형식과 토큰의 차이점을 파악한 후 morgan의 로그 형식 사용자 정의에 대한 주요 API를 살펴볼 수 있습니다.
morgan.format(name, format); // 自定义日志格式 morgan.token(name, fn); // 自定义token
는 매우 간단합니다. 먼저 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
코드는 다음과 같습니다. morgan.token()을 통해 토큰을 커스터마이징한 후, 커스터마이즈된 토큰을 커스터마이즈 형식에 추가합니다.
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);
运行程序,并在浏览器里先后访问 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 exists fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory) // create a rotating write stream var accessLogStream = FileStreamRotator.getStream({ date_format: 'YYYYMMDD', filename: path.join(logDirectory, 'access-%DATE%.log'), frequency: 'daily', verbose: false }) // setup the logger app.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 }
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
위 내용은 로그 구성 요소 Morgan 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!